diff --git a/Lib/test/output/test_pkg b/Lib/test/output/test_pkg
deleted file mode 100644
index 8a5ab8d..0000000
--- a/Lib/test/output/test_pkg
+++ /dev/null
@@ -1,45 +0,0 @@
-test_pkg
-running test t1
-running test t2
-t2 loading
-doc for t2
-t2.sub.subsub loading
-t2 t2.sub t2.sub.subsub
-['sub', 't2']
-t2.sub t2.sub.subsub
-t2.sub.subsub
-['spam', 'sub', 'subsub', 't2']
-t2 t2.sub t2.sub.subsub
-['spam', 'sub', 'subsub', 't2']
-running test t3
-t3 loading
-t3.sub.subsub loading
-t3 t3.sub t3.sub.subsub
-t3 loading
-t3.sub.subsub loading
-running test t4
-t4 loading
-t4.sub.subsub loading
-t4.sub.subsub.spam = 1
-running test t5
-t5.foo loading
-t5.string loading
-1
-['foo', 'string', 't5']
-['__doc__', '__file__', '__name__', '__path__', 'foo', 'string', 't5']
-['__doc__', '__file__', '__name__', 'string']
-['__doc__', '__file__', '__name__', 'spam']
-running test t6
-['__all__', '__doc__', '__file__', '__name__', '__path__']
-t6.spam loading
-t6.ham loading
-t6.eggs loading
-['__all__', '__doc__', '__file__', '__name__', '__path__', 'eggs', 'ham', 'spam']
-['eggs', 'ham', 'spam', 't6']
-running test t7
-t7 loading
-['__doc__', '__file__', '__name__', '__path__']
-['__doc__', '__file__', '__name__', '__path__']
-t7.sub.subsub loading
-['__doc__', '__file__', '__name__', '__path__', 'spam']
-t7.sub.subsub.spam = 1
diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py
index 919a019..7a4c01b 100644
--- a/Lib/test/test_pkg.py
+++ b/Lib/test/test_pkg.py
@@ -1,34 +1,16 @@
 # Test packages (dotted-name import)
 
-import sys, os, tempfile, traceback
-from os import mkdir, rmdir, extsep          # Can't test if these fail
-del mkdir, rmdir
-from test.test_support import verify, verbose, TestFailed
+import sys
+import os
+import tempfile
+import textwrap
+import traceback
+import unittest
+from test import test_support
+
 
 # Helpers to create and destroy hierarchies.
 
-def mkhier(root, descr):
-    if not os.path.isdir(root):
-        mkdir(root)
-    for name, contents in descr:
-        comps = name.split()
-        fullname = root
-        for c in comps:
-            fullname = os.path.join(fullname, c)
-        if contents is None:
-            mkdir(fullname)
-        else:
-            if verbose: print "write", fullname
-            f = open(fullname, "w")
-            f.write(contents)
-            if contents and contents[-1] != '\n':
-                f.write('\n')
-            f.close()
-
-def mkdir(x):
-    if verbose: print "mkdir", x
-    os.mkdir(x)
-
 def cleanout(root):
     names = os.listdir(root)
     for name in names:
@@ -37,223 +19,252 @@
             cleanout(fullname)
         else:
             os.remove(fullname)
-    rmdir(root)
-
-def rmdir(x):
-    if verbose: print "rmdir", x
-    os.rmdir(x)
+    os.rmdir(root)
 
 def fixdir(lst):
-    try:
-        lst.remove('__builtins__')
-    except ValueError:
-        pass
+    if "__builtins__" in lst:
+        lst.remove("__builtins__")
     return lst
 
-# Helper to run a test
 
-def runtest(hier, code):
-    root = tempfile.mkdtemp()
-    mkhier(root, hier)
-    savepath = sys.path[:]
-    fd, fname = tempfile.mkstemp(text=True)
-    os.write(fd, code)
-    os.close(fd)
-    try:
+# XXX Things to test
+#
+# import package without __init__
+# import package with __init__
+# __init__ importing submodule
+# __init__ importing global module
+# __init__ defining variables
+# submodule importing other submodule
+# submodule importing global module
+# submodule import submodule via global name
+# from package import submodule
+# from package import subpackage
+# from package import variable (defined in __init__)
+# from package import * (defined in __init__)
+
+
+class Test(unittest.TestCase):
+
+    def setUp(self):
+        self.root = None
+        self.syspath = list(sys.path)
+
+    def tearDown(self):
+        sys.path[:] = self.syspath
+        cleanout(self.root)
+
+    def run_code(self, code):
+        exec(textwrap.dedent(code), globals(), {"self": self})
+
+    def mkhier(self, descr):
+        root = tempfile.mkdtemp()
         sys.path.insert(0, root)
-        if verbose: print "sys.path =", sys.path
-        try:
-            execfile(fname, globals(), {})
-        except:
-            traceback.print_exc(file=sys.stdout)
-    finally:
-        sys.path[:] = savepath
-        os.unlink(fname)
-        try:
-            cleanout(root)
-        except (os.error, IOError):
-            pass
+        if not os.path.isdir(root):
+            os.mkdir(root)
+        for name, contents in descr:
+            comps = name.split()
+            fullname = root
+            for c in comps:
+                fullname = os.path.join(fullname, c)
+            if contents is None:
+                os.mkdir(fullname)
+            else:
+                f = open(fullname, "w")
+                f.write(contents)
+                if contents and contents[-1] != '\n':
+                    f.write('\n')
+                f.close()
+        self.root = root
 
-# Test descriptions
+    def test_1(self):
+        hier = [("t1", None), ("t1 __init__"+os.extsep+"py", "")]
+        self.mkhier(hier)
+        import t1
 
-tests = [
-    ("t1", [("t1", None), ("t1 __init__"+os.extsep+"py", "")], "import t1"),
+    def test_2(self):
+        hier = [
+         ("t2", None),
+         ("t2 __init__"+os.extsep+"py", "'doc for t2'"),
+         ("t2 sub", None),
+         ("t2 sub __init__"+os.extsep+"py", ""),
+         ("t2 sub subsub", None),
+         ("t2 sub subsub __init__"+os.extsep+"py", "spam = 1"),
+        ]
+        self.mkhier(hier)
 
-    ("t2", [
-    ("t2", None),
-    ("t2 __init__"+os.extsep+"py", "'doc for t2'; print __name__, 'loading'"),
-    ("t2 sub", None),
-    ("t2 sub __init__"+os.extsep+"py", ""),
-    ("t2 sub subsub", None),
-    ("t2 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
-    ],
-"""
-import t2
-print t2.__doc__
-import t2.sub
-import t2.sub.subsub
-print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
-import t2
-from t2 import *
-print dir()
-from t2 import sub
-from t2.sub import subsub
-from t2.sub.subsub import spam
-print sub.__name__, subsub.__name__
-print sub.subsub.__name__
-print dir()
-import t2.sub
-import t2.sub.subsub
-print t2.__name__, t2.sub.__name__, t2.sub.subsub.__name__
-from t2 import *
-print dir()
-"""),
+        import t2
+        self.assertEqual(t2.__doc__, "doc for t2")
 
-    ("t3", [
-    ("t3", None),
-    ("t3 __init__"+os.extsep+"py", "print __name__, 'loading'"),
-    ("t3 sub", None),
-    ("t3 sub __init__"+os.extsep+"py", ""),
-    ("t3 sub subsub", None),
-    ("t3 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
-    ],
-"""
-import t3.sub.subsub
-print t3.__name__, t3.sub.__name__, t3.sub.subsub.__name__
-reload(t3)
-reload(t3.sub)
-reload(t3.sub.subsub)
-"""),
+        import t2.sub
+        import t2.sub.subsub
+        self.assertEqual(t2.__name__, "t2")
+        self.assertEqual(t2.sub.__name__, "t2.sub")
+        self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
 
-    ("t4", [
-    ("t4"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (t4"+os.extsep+"py)'"),
-    ("t4", None),
-    ("t4 __init__"+os.extsep+"py", "print __name__, 'loading'"),
-    ("t4 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"),
-    ("t4 sub", None),
-    ("t4 sub __init__"+os.extsep+"py", ""),
-    ("t4 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"),
-    ("t4 sub subsub", None),
-    ("t4 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
-    ],
-"""
-from t4.sub.subsub import *
-print "t4.sub.subsub.spam =", spam
-"""),
+        # This exec crap is needed because Py3k forbids 'import *' outside
+        # of module-scope and __import__() is insufficient for what we need.
+        s = """
+            import t2
+            from t2 import *
+            self.assertEqual(dir(), ['self', 'sub', 't2'])
+            """
+        self.run_code(s)
 
-    ("t5", [
-    ("t5", None),
-    ("t5 __init__"+os.extsep+"py", "import t5.foo"),
-    ("t5 string"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
-    ("t5 foo"+os.extsep+"py",
-     "print __name__, 'loading'; import string; print string.spam"),
-     ],
-"""
-import t5
-from t5 import *
-print dir()
-import t5
-print fixdir(dir(t5))
-print fixdir(dir(t5.foo))
-print fixdir(dir(t5.string))
-"""),
+        from t2 import sub
+        from t2.sub import subsub
+        from t2.sub.subsub import spam
+        self.assertEqual(sub.__name__, "t2.sub")
+        self.assertEqual(subsub.__name__, "t2.sub.subsub")
+        self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
+        for name in ['spam', 'sub', 'subsub', 't2']:
+            self.failUnless(locals()["name"], "Failed to import %s" % name)
 
-    ("t6", [
-    ("t6", None),
-    ("t6 __init__"+os.extsep+"py", "__all__ = ['spam', 'ham', 'eggs']"),
-    ("t6 spam"+os.extsep+"py", "print __name__, 'loading'"),
-    ("t6 ham"+os.extsep+"py", "print __name__, 'loading'"),
-    ("t6 eggs"+os.extsep+"py", "print __name__, 'loading'"),
-    ],
-"""
-import t6
-print fixdir(dir(t6))
-from t6 import *
-print fixdir(dir(t6))
-print dir()
-"""),
+        import t2.sub
+        import t2.sub.subsub
+        self.assertEqual(t2.__name__, "t2")
+        self.assertEqual(t2.sub.__name__, "t2.sub")
+        self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
 
-    ("t7", [
-    ("t7"+os.extsep+"py", "print 'Importing t7"+os.extsep+"py'"),
-    ("t7", None),
-    ("t7 __init__"+os.extsep+"py", "print __name__, 'loading'"),
-    ("t7 sub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (sub"+os.extsep+"py)'"),
-    ("t7 sub", None),
-    ("t7 sub __init__"+os.extsep+"py", ""),
-    ("t7 sub subsub"+os.extsep+"py", "print 'THIS SHOULD NOT BE PRINTED (subsub"+os.extsep+"py)'"),
-    ("t7 sub subsub", None),
-    ("t7 sub subsub __init__"+os.extsep+"py", "print __name__, 'loading'; spam = 1"),
-    ],
-"""
-t7, sub, subsub = None, None, None
-import t7 as tas
-print fixdir(dir(tas))
-verify(not t7)
-from t7 import sub as subpar
-print fixdir(dir(subpar))
-verify(not t7 and not sub)
-from t7.sub import subsub as subsubsub
-print fixdir(dir(subsubsub))
-verify(not t7 and not sub and not subsub)
-from t7.sub.subsub import spam as ham
-print "t7.sub.subsub.spam =", ham
-verify(not t7 and not sub and not subsub)
-"""),
+        s = """
+            from t2 import *
+            self.failUnless(dir(), ['self', 'sub'])
+            """
+        self.run_code(s)
 
-]
+    def test_3(self):
+        hier = [
+                ("t3", None),
+                ("t3 __init__"+os.extsep+"py", ""),
+                ("t3 sub", None),
+                ("t3 sub __init__"+os.extsep+"py", ""),
+                ("t3 sub subsub", None),
+                ("t3 sub subsub __init__"+os.extsep+"py", "spam = 1"),
+               ]
+        self.mkhier(hier)
 
-nontests = [
-    ("x5", [], ("import a" + ".a"*400)),
-    ("x6", [], ("import a" + ".a"*499)),
-    ("x7", [], ("import a" + ".a"*500)),
-    ("x8", [], ("import a" + ".a"*1100)),
-    ("x9", [], ("import " + "a"*400)),
-    ("x10", [], ("import " + "a"*500)),
-    ("x11", [], ("import " + "a"*998)),
-    ("x12", [], ("import " + "a"*999)),
-    ("x13", [], ("import " + "a"*999)),
-    ("x14", [], ("import " + "a"*2000)),
-]
+        import t3.sub.subsub
+        self.assertEqual(t3.__name__, "t3")
+        self.assertEqual(t3.sub.__name__, "t3.sub")
+        self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
 
-"""XXX Things to test
+    def test_4(self):
+        hier = [
+        ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
+        ("t4", None),
+        ("t4 __init__"+os.extsep+"py", ""),
+        ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
+        ("t4 sub", None),
+        ("t4 sub __init__"+os.extsep+"py", ""),
+        ("t4 sub subsub"+os.extsep+"py",
+         "raise RuntimeError('Shouldnt load subsub.py')"),
+        ("t4 sub subsub", None),
+        ("t4 sub subsub __init__"+os.extsep+"py", "spam = 1"),
+               ]
+        self.mkhier(hier)
 
-import package without __init__
-import package with __init__
-__init__ importing submodule
-__init__ importing global module
-__init__ defining variables
-submodule importing other submodule
-submodule importing global module
-submodule import submodule via global name
-from package import submodule
-from package import subpackage
-from package import variable (defined in __init__)
-from package import * (defined in __init__)
-"""
+        s = """
+            from t4.sub.subsub import *
+            self.assertEqual(spam, 1)
+            """
+        self.run_code(s)
 
-# Run the tests
+    def test_5(self):
+        hier = [
+        ("t5", None),
+        ("t5 __init__"+os.extsep+"py", "import t5.foo"),
+        ("t5 string"+os.extsep+"py", "spam = 1"),
+        ("t5 foo"+os.extsep+"py",
+         "from . import string; assert string.spam == 1"),
+         ]
+        self.mkhier(hier)
 
-args = []
-if __name__ == '__main__':
-    args = sys.argv[1:]
-    if args and args[0] == '-q':
-        verbose = 0
-        del args[0]
+        import t5
+        s = """
+            from t5 import *
+            self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
+            """
+        self.run_code(s)
 
-for name, hier, code in tests:
-    if args and name not in args:
-        print "skipping test", name
-        continue
-    print "running test", name
-    runtest(hier, code)
+        import t5
+        self.assertEqual(fixdir(dir(t5)),
+                         ['__doc__', '__file__', '__name__',
+                          '__path__', 'foo', 'string', 't5'])
+        self.assertEqual(fixdir(dir(t5.foo)),
+                         ['__doc__', '__file__', '__name__', 'string'])
+        self.assertEqual(fixdir(dir(t5.string)),
+                         ['__doc__', '__file__', '__name__', 'spam'])
 
-# Test
-import sys
-import imp
-try:
-    import sys.imp
-except ImportError:
-    # This is what we expect
-    pass
-else:
-    raise TestFailed, "No ImportError exception on 'import sys.imp'"
+    def test_6(self):
+        hier = [
+                ("t6", None),
+                ("t6 __init__"+os.extsep+"py",
+                 "__all__ = ['spam', 'ham', 'eggs']"),
+                ("t6 spam"+os.extsep+"py", ""),
+                ("t6 ham"+os.extsep+"py", ""),
+                ("t6 eggs"+os.extsep+"py", ""),
+               ]
+        self.mkhier(hier)
+
+        import t6
+        self.assertEqual(fixdir(dir(t6)),
+                         ['__all__', '__doc__', '__file__',
+                          '__name__', '__path__'])
+        s = """
+            import t6
+            from t6 import *
+            self.assertEqual(fixdir(dir(t6)),
+                             ['__all__', '__doc__', '__file__',
+                              '__name__', '__path__', 'eggs',
+                              'ham', 'spam'])
+            self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
+            """
+        self.run_code(s)
+
+    def test_7(self):
+        hier = [
+                ("t7"+os.extsep+"py", ""),
+                ("t7", None),
+                ("t7 __init__"+os.extsep+"py", ""),
+                ("t7 sub"+os.extsep+"py",
+                 "raise RuntimeError('Shouldnt load sub.py')"),
+                ("t7 sub", None),
+                ("t7 sub __init__"+os.extsep+"py", ""),
+                ("t7 sub "+os.extsep+"py",
+                 "raise RuntimeError('Shouldnt load subsub.py')"),
+                ("t7 sub subsub", None),
+                ("t7 sub subsub __init__"+os.extsep+"py",
+                 "spam = 1"),
+               ]
+        self.mkhier(hier)
+
+
+        t7, sub, subsub = None, None, None
+        import t7 as tas
+        self.assertEqual(fixdir(dir(tas)),
+                         ['__doc__', '__file__', '__name__', '__path__'])
+        self.failIf(t7)
+        from t7 import sub as subpar
+        self.assertEqual(fixdir(dir(subpar)),
+                         ['__doc__', '__file__', '__name__', '__path__'])
+        self.failIf(t7)
+        self.failIf(sub)
+        from t7.sub import subsub as subsubsub
+        self.assertEqual(fixdir(dir(subsubsub)),
+                         ['__doc__', '__file__', '__name__', '__path__',
+                          'spam'])
+        self.failIf(t7)
+        self.failIf(sub)
+        self.failIf(subsub)
+        from t7.sub.subsub import spam as ham
+        self.assertEqual(ham, 1)
+        self.failIf(t7)
+        self.failIf(sub)
+        self.failIf(subsub)
+
+
+def test_main():
+    test_support.run_unittest(__name__)
+
+
+if __name__ == "__main__":
+    test_main()
