diff --git a/Lib/test/output/test_pty b/Lib/test/output/test_pty
deleted file mode 100644
index b6e0e32..0000000
--- a/Lib/test/output/test_pty
+++ /dev/null
@@ -1,3 +0,0 @@
-test_pty
-I wish to buy a fish license.
-For my pet fish, Eric.
diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
index 02290be..f0a0a60 100644
--- a/Lib/test/test_pty.py
+++ b/Lib/test/test_pty.py
@@ -1,5 +1,8 @@
-import pty, os, sys, signal
-from test.test_support import verbose, TestFailed, TestSkipped
+import pty
+import os
+import signal
+from test.test_support import verbose, TestSkipped, run_unittest
+import unittest
 
 TEST_STRING_1 = "I wish to buy a fish license.\n"
 TEST_STRING_2 = "For my pet fish, Eric.\n"
@@ -11,6 +14,7 @@
     def debug(msg):
         pass
 
+
 def normalize_output(data):
     # Some operating systems do conversions on newline.  We could possibly
     # fix that by doing the appropriate termios.tcsetattr()s.  I couldn't
@@ -32,116 +36,122 @@
 
     return data
 
+
 # Marginal testing of pty suite. Cannot do extensive 'do or fail' testing
 # because pty code is not too portable.
+class PtyTest(unittest.TestCase):
+    def setUp(self):
+        # isatty() and close() can hang on some platforms.  Set an alarm 
+        # before running the test to make sure we don't hang forever.
+        self.old_alarm = signal.signal(signal.SIGALRM, self.handle_sig)
+        signal.alarm(10)
+    
+    def tearDown(self):
+        # remove alarm, restore old alarm handler
+        signal.alarm(0)
+        signal.signal(signal.SIGALRM, self.old_alarm)
+    
+    def handle_sig(self, sig, frame):
+        self.fail("isatty hung")
+    
+    def test_basic(self):
+        try:
+            debug("Calling master_open()")
+            master_fd, slave_name = pty.master_open()
+            debug("Got master_fd '%d', slave_name '%s'" %
+                  (master_fd, slave_name))
+            debug("Calling slave_open(%r)" % (slave_name,))
+            slave_fd = pty.slave_open(slave_name)
+            debug("Got slave_fd '%d'" % slave_fd)
+        except OSError:
+            # " An optional feature could not be imported " ... ?
+            raise TestSkipped, "Pseudo-terminals (seemingly) not functional."
 
-def test_basic_pty():
-    try:
-        debug("Calling master_open()")
-        master_fd, slave_name = pty.master_open()
-        debug("Got master_fd '%d', slave_name '%s'"%(master_fd, slave_name))
-        debug("Calling slave_open(%r)"%(slave_name,))
-        slave_fd = pty.slave_open(slave_name)
-        debug("Got slave_fd '%d'"%slave_fd)
-    except OSError:
-        # " An optional feature could not be imported " ... ?
-        raise TestSkipped, "Pseudo-terminals (seemingly) not functional."
-
-    if not os.isatty(slave_fd):
-        raise TestFailed, "slave_fd is not a tty"
-
-    debug("Writing to slave_fd")
-    os.write(slave_fd, TEST_STRING_1)
-    s1 = os.read(master_fd, 1024)
-    sys.stdout.write(normalize_output(s1))
-
-    debug("Writing chunked output")
-    os.write(slave_fd, TEST_STRING_2[:5])
-    os.write(slave_fd, TEST_STRING_2[5:])
-    s2 = os.read(master_fd, 1024)
-    sys.stdout.write(normalize_output(s2))
-
-    os.close(slave_fd)
-    os.close(master_fd)
-
-def handle_sig(sig, frame):
-    raise TestFailed, "isatty hung"
-
-# isatty() and close() can hang on some platforms
-# set an alarm before running the test to make sure we don't hang forever
-old_alarm = signal.signal(signal.SIGALRM, handle_sig)
-signal.alarm(10)
-
-try:
-    test_basic_pty()
-finally:
-    # remove alarm, restore old alarm handler
-    signal.alarm(0)
-    signal.signal(signal.SIGALRM, old_alarm)
-
-# basic pty passed.
-
-debug("calling pty.fork()")
-pid, master_fd = pty.fork()
-if pid == pty.CHILD:
-    # stdout should be connected to a tty.
-    if not os.isatty(1):
-        debug("Child's fd 1 is not a tty?!")
-        os._exit(3)
-
-    # After pty.fork(), the child should already be a session leader.
-    # (on those systems that have that concept.)
-    debug("In child, calling os.setsid()")
-    try:
-        os.setsid()
-    except OSError:
-        # Good, we already were session leader
-        debug("Good: OSError was raised.")
-        pass
-    except AttributeError:
-        # Have pty, but not setsid() ?
-        debug("No setsid() available ?")
-        pass
-    except:
-        # We don't want this error to propagate, escaping the call to
-        # os._exit() and causing very peculiar behavior in the calling
-        # regrtest.py !
-        # Note: could add traceback printing here.
-        debug("An unexpected error was raised.")
-        os._exit(1)
-    else:
-        debug("os.setsid() succeeded! (bad!)")
-        os._exit(2)
-    os._exit(4)
-else:
-    debug("Waiting for child (%d) to finish."%pid)
-    ##line = os.read(master_fd, 80)
-    ##lines = line.replace('\r\n', '\n').split('\n')
-    ##if False and lines != ['In child, calling os.setsid()',
-    ##             'Good: OSError was raised.', '']:
-    ##    raise TestFailed("Unexpected output from child: %r" % line)
-
-    (pid, status) = os.waitpid(pid, 0)
-    res = status >> 8
-    debug("Child (%d) exited with status %d (%d)."%(pid, res, status))
-    if res == 1:
-        raise TestFailed, "Child raised an unexpected exception in os.setsid()"
-    elif res == 2:
-        raise TestFailed, "pty.fork() failed to make child a session leader."
-    elif res == 3:
-        raise TestFailed, "Child spawned by pty.fork() did not have a tty as stdout"
-    elif res != 4:
-        raise TestFailed, "pty.fork() failed for unknown reasons."
-
-    ##debug("Reading from master_fd now that the child has exited")
-    ##try:
-    ##    s1 = os.read(master_fd, 1024)
-    ##except os.error:
-    ##    pass
-    ##else:
-    ##    raise TestFailed("Read from master_fd did not raise exception")
+        self.assertTrue(os.isatty(slave_fd), 'slave_fd is not a tty')
+    
+        debug("Writing to slave_fd")
+        os.write(slave_fd, TEST_STRING_1)
+        s1 = os.read(master_fd, 1024)
+        self.assertEquals('I wish to buy a fish license.\n', 
+                          normalize_output(s1))
+    
+        debug("Writing chunked output")
+        os.write(slave_fd, TEST_STRING_2[:5])
+        os.write(slave_fd, TEST_STRING_2[5:])
+        s2 = os.read(master_fd, 1024)
+        self.assertEquals('For my pet fish, Eric.\n', normalize_output(s2))
+    
+        os.close(slave_fd)
+        os.close(master_fd)
 
 
-os.close(master_fd)
+    def test_fork(self):
+        debug("calling pty.fork()")
+        pid, master_fd = pty.fork()
+        if pid == pty.CHILD:
+            # stdout should be connected to a tty.
+            if not os.isatty(1):
+                debug("Child's fd 1 is not a tty?!")
+                os._exit(3)
+        
+            # After pty.fork(), the child should already be a session leader.
+            # (on those systems that have that concept.)
+            debug("In child, calling os.setsid()")
+            try:
+                os.setsid()
+            except OSError:
+                # Good, we already were session leader
+                debug("Good: OSError was raised.")
+                pass
+            except AttributeError:
+                # Have pty, but not setsid()?
+                debug("No setsid() available?")
+                pass
+            except:
+                # We don't want this error to propagate, escaping the call to
+                # os._exit() and causing very peculiar behavior in the calling
+                # regrtest.py !
+                # Note: could add traceback printing here.
+                debug("An unexpected error was raised.")
+                os._exit(1)
+            else:
+                debug("os.setsid() succeeded! (bad!)")
+                os._exit(2)
+            os._exit(4)
+        else:
+            debug("Waiting for child (%d) to finish." % pid)
+            ##line = os.read(master_fd, 80)
+            ##lines = line.replace('\r\n', '\n').split('\n')
+            ##if False and lines != ['In child, calling os.setsid()',
+            ##             'Good: OSError was raised.', '']:
+            ##    raise TestFailed("Unexpected output from child: %r" % line)
+        
+            (pid, status) = os.waitpid(pid, 0)
+            res = status >> 8
+            debug("Child (%d) exited with status %d (%d)." % (pid, res, status))
+            if res == 1:
+                self.fail("Child raised an unexpected exception in os.setsid()")
+            elif res == 2:
+                self.fail("pty.fork() failed to make child a session leader.")
+            elif res == 3:
+                self.fail("Child spawned by pty.fork() did not have a tty as stdout")
+            elif res != 4:
+                self.fail("pty.fork() failed for unknown reasons.")
+        
+            ##debug("Reading from master_fd now that the child has exited")
+            ##try:
+            ##    s1 = os.read(master_fd, 1024)
+            ##except os.error:
+            ##    pass
+            ##else:
+            ##    raise TestFailed("Read from master_fd did not raise exception")
+        
+        os.close(master_fd)
+        
+        # pty.fork() passed.
 
-# pty.fork() passed.
+def test_main(verbose=None):
+    run_unittest(PtyTest)
+
+if __name__ == "__main__":
+    test_main()
