diff --git a/Lib/test/test_heapq.py b/Lib/test/test_heapq.py
index f04ea94..944b17d 100644
--- a/Lib/test/test_heapq.py
+++ b/Lib/test/test_heapq.py
@@ -1,101 +1,105 @@
 """Unittests for heapq."""
 
-from test.test_support import verify, vereq, verbose, TestFailed
-
 from heapq import heappush, heappop, heapify, heapreplace, nlargest, nsmallest
 import random
+import unittest
+from test import test_support
 
-def check_invariant(heap):
-    # Check the heap invariant.
-    for pos, item in enumerate(heap):
-        if pos: # pos 0 has no parent
-            parentpos = (pos-1) >> 1
-            verify(heap[parentpos] <= item)
 
-# An iterator returning a heap's elements, smallest-first.
-class heapiter(object):
-    def __init__(self, heap):
-        self.heap = heap
+def heapiter(heap):
+    # An iterator returning a heap's elements, smallest-first.
+    try:
+        while 1:
+            yield heappop(heap)
+    except IndexError:
+        pass
 
-    def next(self):
-        try:
-            return heappop(self.heap)
-        except IndexError:
-            raise StopIteration
+class TestHeap(unittest.TestCase):
 
-    def __iter__(self):
-        return self
+    def test_push_pop(self):
+        # 1) Push 256 random numbers and pop them off, verifying all's OK.
+        heap = []
+        data = []
+        self.check_invariant(heap)
+        for i in range(256):
+            item = random.random()
+            data.append(item)
+            heappush(heap, item)
+            self.check_invariant(heap)
+        results = []
+        while heap:
+            item = heappop(heap)
+            self.check_invariant(heap)
+            results.append(item)
+        data_sorted = data[:]
+        data_sorted.sort()
+        self.assertEqual(data_sorted, results)
+        # 2) Check that the invariant holds for a sorted array
+        self.check_invariant(results)
+
+    def check_invariant(self, heap):
+        # Check the heap invariant.
+        for pos, item in enumerate(heap):
+            if pos: # pos 0 has no parent
+                parentpos = (pos-1) >> 1
+                self.assert_(heap[parentpos] <= item)
+
+    def test_heapify(self):
+        for size in range(30):
+            heap = [random.random() for dummy in range(size)]
+            heapify(heap)
+            self.check_invariant(heap)
+
+    def test_naive_nbest(self):
+        data = [random.randrange(2000) for i in range(1000)]
+        heap = []
+        for item in data:
+            heappush(heap, item)
+            if len(heap) > 10:
+                heappop(heap)
+        heap.sort()
+        self.assertEqual(heap, sorted(data)[-10:])
+
+    def test_nbest(self):
+        # Less-naive "N-best" algorithm, much faster (if len(data) is big
+        # enough <wink>) than sorting all of data.  However, if we had a max
+        # heap instead of a min heap, it could go faster still via
+        # heapify'ing all of data (linear time), then doing 10 heappops
+        # (10 log-time steps).
+        data = [random.randrange(2000) for i in range(1000)]
+        heap = data[:10]
+        heapify(heap)
+        for item in data[10:]:
+            if item > heap[0]:  # this gets rarer the longer we run
+                heapreplace(heap, item)
+        self.assertEqual(list(heapiter(heap)), sorted(data)[-10:])
+
+    def test_heapsort(self):
+        # Exercise everything with repeated heapsort checks
+        for trial in xrange(100):
+            size = random.randrange(50)
+            data = [random.randrange(25) for i in range(size)]
+            if trial & 1:     # Half of the time, use heapify
+                heap = data[:]
+                heapify(heap)
+            else:             # The rest of the time, use heappush
+                heap = []
+                for item in data:
+                    heappush(heap, item)
+            heap_sorted = [heappop(heap) for i in range(size)]
+            self.assertEqual(heap_sorted, sorted(data))
+
+    def test_nsmallest(self):
+        data = [random.randrange(2000) for i in range(1000)]
+        self.assertEqual(nsmallest(data, 400), sorted(data)[:400])
+
+    def test_largest(self):
+        data = [random.randrange(2000) for i in range(1000)]
+        self.assertEqual(nlargest(data, 400), sorted(data, reverse=True)[:400])
 
 def test_main():
-    # 1) Push 100 random numbers and pop them off, verifying all's OK.
-    heap = []
-    data = []
-    check_invariant(heap)
-    for i in range(256):
-        item = random.random()
-        data.append(item)
-        heappush(heap, item)
-        check_invariant(heap)
-    results = []
-    while heap:
-        item = heappop(heap)
-        check_invariant(heap)
-        results.append(item)
-    data_sorted = data[:]
-    data_sorted.sort()
-    vereq(data_sorted, results)
-    # 2) Check that the invariant holds for a sorted array
-    check_invariant(results)
-    # 3) Naive "N-best" algorithm
-    heap = []
-    for item in data:
-        heappush(heap, item)
-        if len(heap) > 10:
-            heappop(heap)
-    heap.sort()
-    vereq(heap, data_sorted[-10:])
-    # 4) Test heapify.
-    for size in range(30):
-        heap = [random.random() for dummy in range(size)]
-        heapify(heap)
-        check_invariant(heap)
-    # 5) Less-naive "N-best" algorithm, much faster (if len(data) is big
-    #    enough <wink>) than sorting all of data.  However, if we had a max
-    #    heap instead of a min heap, it could go faster still via
-    #    heapify'ing all of data (linear time), then doing 10 heappops
-    #    (10 log-time steps).
-    heap = data[:10]
-    heapify(heap)
-    for item in data[10:]:
-        if item > heap[0]:  # this gets rarer the longer we run
-            heapreplace(heap, item)
-    vereq(list(heapiter(heap)), data_sorted[-10:])
-    # 6)  Exercise everything with repeated heapsort checks
-    for trial in xrange(100):
-        size = random.randrange(50)
-        data = [random.randrange(25) for i in range(size)]
-        if trial & 1:     # Half of the time, use heapify
-            heap = data[:]
-            heapify(heap)
-        else:             # The rest of the time, use heappush
-            heap = []
-            for item in data:
-                heappush(heap,item)
-        data.sort()
-        sorted = [heappop(heap) for i in range(size)]
-        vereq(data, sorted)
-
-    # 7) Check nlargest() and nsmallest()
-    data = [random.randrange(2000) for i in range(1000)]
-    copy = data[:]
-    copy.sort(reverse=True)
-    vereq(nlargest(data, 400), copy[:400])
-    copy.sort()
-    vereq(nsmallest(data, 400), copy[:400])
-
-    # Make user happy
-    if verbose:
-        print "All OK"
+    test_support.run_unittest(TestHeap)
 
 if __name__ == "__main__":
     test_main()
+
