diff --git a/Lib/test/test_contains.py b/Lib/test/test_contains.py
index e6f5cf7..0d54099 100644
--- a/Lib/test/test_contains.py
+++ b/Lib/test/test_contains.py
@@ -1,133 +1,111 @@
-from test.test_support import TestFailed, have_unicode
+from test.test_support import have_unicode, run_unittest
+import unittest
+
 
 class base_set:
-
     def __init__(self, el):
         self.el = el
 
 class set(base_set):
-
     def __contains__(self, el):
         return self.el == el
 
 class seq(base_set):
-
     def __getitem__(self, n):
         return [self.el][n]
 
-def check(ok, *args):
-    if not ok:
-        raise TestFailed, " ".join(map(str, args))
 
-a = base_set(1)
-b = set(1)
-c = seq(1)
+class TestContains(unittest.TestCase):
+    def test_common_tests(self):
+        a = base_set(1)
+        b = set(1)
+        c = seq(1)
+        self.assert_(1 in b)
+        self.assert_(0 not in b)
+        self.assert_(1 in c)
+        self.assert_(0 not in c)
+        self.assertRaises(TypeError, lambda: 1 in a)
+        self.assertRaises(TypeError, lambda: 1 not in a)
 
-check(1 in b, "1 not in set(1)")
-check(0 not in b, "0 in set(1)")
-check(1 in c, "1 not in seq(1)")
-check(0 not in c, "0 in seq(1)")
+        # test char in string
+        self.assert_('c' in 'abc')
+        self.assert_('d' not in 'abc')
 
-try:
-    1 in a
-    check(0, "in base_set did not raise error")
-except TypeError:
-    pass
+        self.assert_('' in '')
+        self.assert_('' in 'abc')
 
-try:
-    1 not in a
-    check(0, "not in base_set did not raise error")
-except TypeError:
-    pass
+        self.assertRaises(TypeError, lambda: None in 'abc')
 
-# Test char in string
+    if have_unicode:
+        def test_char_in_unicode(self):
+            self.assert_('c' in unicode('abc'))
+            self.assert_('d' not in unicode('abc'))
 
-check('c' in 'abc', "'c' not in 'abc'")
-check('d' not in 'abc', "'d' in 'abc'")
+            self.assert_('' in unicode(''))
+            self.assert_(unicode('') in '')
+            self.assert_(unicode('') in unicode(''))
+            self.assert_('' in unicode('abc'))
+            self.assert_(unicode('') in 'abc')
+            self.assert_(unicode('') in unicode('abc'))
 
-check('' in '', "'' not in ''")
-check('' in 'abc', "'' not in 'abc'")
+            self.assertRaises(TypeError, lambda: None in unicode('abc'))
 
-try:
-    None in 'abc'
-    check(0, "None in 'abc' did not raise error")
-except TypeError:
-    pass
+            # test Unicode char in Unicode
+            self.assert_(unicode('c') in unicode('abc'))
+            self.assert_(unicode('d') not in unicode('abc'))
+
+            # test Unicode char in string
+            self.assert_(unicode('c') in 'abc')
+            self.assert_(unicode('d') not in 'abc')
+
+    def test_builtin_sequence_types(self):
+        # a collection of tests on builtin sequence types
+        a = range(10)
+        for i in a:
+            self.assert_(i in a)
+        self.assert_(16 not in a)
+        self.assert_(a not in a)
+
+        a = tuple(a)
+        for i in a:
+            self.assert_(i in a)
+        self.assert_(16 not in a)
+        self.assert_(a not in a)
+
+        class Deviant1:
+            """Behaves strangely when compared
+
+            This class is designed to make sure that the contains code
+            works when the list is modified during the check.
+            """
+            aList = range(15)
+            def __cmp__(self, other):
+                if other == 12:
+                    self.aList.remove(12)
+                    self.aList.remove(13)
+                    self.aList.remove(14)
+                return 1
+
+        self.assert_(Deviant1() not in Deviant1.aList)
+
+        class Deviant2:
+            """Behaves strangely when compared
+
+            This class raises an exception during comparison.  That in
+            turn causes the comparison to fail with a TypeError.
+            """
+            def __cmp__(self, other):
+                if other == 4:
+                    raise RuntimeError, "gotcha"
+
+        try:
+            self.assert_(Deviant2() not in a)
+        except TypeError:
+            pass
 
 
-if have_unicode:
+def test_main():
+    run_unittest(TestContains)
 
-    # Test char in Unicode
-
-    check('c' in unicode('abc'), "'c' not in u'abc'")
-    check('d' not in unicode('abc'), "'d' in u'abc'")
-
-    check('' in unicode(''), "'' not in u''")
-    check(unicode('') in '', "u'' not in ''")
-    check(unicode('') in unicode(''), "u'' not in u''")
-    check('' in unicode('abc'), "'' not in u'abc'")
-    check(unicode('') in 'abc', "u'' not in 'abc'")
-    check(unicode('') in unicode('abc'), "u'' not in u'abc'")
-
-    try:
-        None in unicode('abc')
-        check(0, "None in u'abc' did not raise error")
-    except TypeError:
-        pass
-
-    # Test Unicode char in Unicode
-
-    check(unicode('c') in unicode('abc'), "u'c' not in u'abc'")
-    check(unicode('d') not in unicode('abc'), "u'd' in u'abc'")
-
-    # Test Unicode char in string
-
-    check(unicode('c') in 'abc', "u'c' not in 'abc'")
-    check(unicode('d') not in 'abc', "u'd' in 'abc'")
-
-# A collection of tests on builtin sequence types
-a = range(10)
-for i in a:
-    check(i in a, "%r not in %r" % (i, a))
-check(16 not in a, "16 not in %r" % (a,))
-check(a not in a, "%s not in %r" % (a, a))
-
-a = tuple(a)
-for i in a:
-    check(i in a, "%r not in %r" % (i, a))
-check(16 not in a, "16 not in %r" % (a,))
-check(a not in a, "%r not in %r" % (a, a))
-
-class Deviant1:
-    """Behaves strangely when compared
-
-    This class is designed to make sure that the contains code
-    works when the list is modified during the check.
-    """
-
-    aList = range(15)
-
-    def __cmp__(self, other):
-        if other == 12:
-            self.aList.remove(12)
-            self.aList.remove(13)
-            self.aList.remove(14)
-        return 1
-
-check(Deviant1() not in Deviant1.aList, "Deviant1 failed")
-
-class Deviant2:
-    """Behaves strangely when compared
-
-    This class raises an exception during comparison.  That in
-    turn causes the comparison to fail with a TypeError.
-    """
-
-    def __cmp__(self, other):
-        if other == 4:
-            raise RuntimeError, "gotcha"
-
-try:
-    check(Deviant2() not in a, "oops")
-except TypeError:
-    pass
+if __name__ == '__main__':
+    test_main()
