diff --git a/Lib/bsddb/test/test_thread.py b/Lib/bsddb/test/test_thread.py
index fb2ba1c..14f8d26 100644
--- a/Lib/bsddb/test/test_thread.py
+++ b/Lib/bsddb/test/test_thread.py
@@ -1,23 +1,31 @@
-"""
-TestCases for multi-threaded access to a DB.
+"""TestCases for multi-threaded access to a DB.
 """
 
-import sys, os, string
-import tempfile
+import os
+import sys
 import time
+import errno
+import shutil
+import tempfile
 from pprint import pprint
 from whrandom import random
 
 try:
-    from threading import Thread, currentThread
-    have_threads = 1
-except ImportError:
-    have_threads = 0
+    True, False
+except NameError:
+    True = 1
+    False = 0
 
+DASH = '-'
+
+try:
+    from threading import Thread, currentThread
+    have_threads = True
+except ImportError:
+    have_threads = False
 
 import unittest
 from test_all import verbose
-
 from bsddb import db, dbutils
 
 #----------------------------------------------------------------------
@@ -28,15 +36,16 @@
     dbsetflags   = 0
     envflags     = 0
 
-
     def setUp(self):
         if verbose:
             dbutils._deadlock_VerboseFile = sys.stdout
 
         homeDir = os.path.join(os.path.dirname(sys.argv[0]), 'db_home')
         self.homeDir = homeDir
-        try: os.mkdir(homeDir)
-        except os.error: pass
+        try:
+            os.mkdir(homeDir)
+        except OSError, e:
+            if e.errno <> errno.EEXIST: raise
         self.env = db.DBEnv()
         self.setEnvOpts()
         self.env.open(homeDir, self.envflags | db.DB_CREATE)
@@ -47,22 +56,16 @@
             self.d.set_flags(self.dbsetflags)
         self.d.open(self.filename, self.dbtype, self.dbopenflags|db.DB_CREATE)
 
-
     def tearDown(self):
         self.d.close()
         self.env.close()
-        import glob
-        files = glob.glob(os.path.join(self.homeDir, '*'))
-        for file in files:
-            os.remove(file)
-
+        shutil.rmtree(self.homeDir)
 
     def setEnvOpts(self):
         pass
 
-
     def makeData(self, key):
-        return string.join([key] * 5, '-')
+        return DASH.join([key] * 5)
 
 
 #----------------------------------------------------------------------
@@ -75,7 +78,6 @@
     writers     = 0
     records     = 1000
 
-
     def test01_1WriterMultiReaders(self):
         if verbose:
             print '\n', '-=' * 30
@@ -102,11 +104,11 @@
         for t in threads:
             t.join()
 
-
     def writerThread(self, d, howMany, writerNum):
         #time.sleep(0.01 * writerNum + 0.01)
         name = currentThread().getName()
-        start, stop = howMany * writerNum, howMany * (writerNum + 1) - 1
+        start = howMany * writerNum
+        stop = howMany * (writerNum + 1) - 1
         if verbose:
             print "%s: creating records %d - %d" % (name, start, stop)
 
@@ -117,7 +119,8 @@
             if verbose and x % 100 == 0:
                 print "%s: records %d - %d finished" % (name, start, x)
 
-        if verbose: print "%s: finished creating records" % name
+        if verbose:
+            print "%s: finished creating records" % name
 
 ##         # Each write-cursor will be exclusive, the only one that can update the DB...
 ##         if verbose: print "%s: deleting a few records" % name
@@ -130,8 +133,8 @@
 ##                 c.delete()
 
 ##         c.close()
-        if verbose: print "%s: thread finished" % name
-
+        if verbose:
+            print "%s: thread finished" % name
 
     def readerThread(self, d, readerNum):
         time.sleep(0.01 * readerNum)
@@ -142,16 +145,17 @@
             count = 0
             rec = c.first()
             while rec:
-                count = count + 1
+                count += 1
                 key, data = rec
-                assert self.makeData(key) == data
+                self.assertEqual(self.makeData(key), data)
                 rec = c.next()
-            if verbose: print "%s: found %d records" % (name, count)
+            if verbose:
+                print "%s: found %d records" % (name, count)
             c.close()
             time.sleep(0.05)
 
-        if verbose: print "%s: thread finished" % name
-
+        if verbose:
+            print "%s: thread finished" % name
 
 
 class BTreeConcurrentDataStore(ConcurrentDataStoreBase):
@@ -167,6 +171,7 @@
     readers = 10
     records = 1000
 
+
 #----------------------------------------------------------------------
 
 class SimpleThreadedBase(BaseThreadedTestCase):
@@ -176,11 +181,9 @@
     writers = 3
     records = 1000
 
-
     def setEnvOpts(self):
         self.env.set_lk_detect(db.DB_LOCK_DEFAULT)
 
-
     def test02_SimpleLocks(self):
         if verbose:
             print '\n', '-=' * 30
@@ -205,11 +208,10 @@
         for t in threads:
             t.join()
 
-
-
     def writerThread(self, d, howMany, writerNum):
         name = currentThread().getName()
-        start, stop = howMany * writerNum, howMany * (writerNum + 1) - 1
+        start = howMany * writerNum
+        stop = howMany * (writerNum + 1) - 1
         if verbose:
             print "%s: creating records %d - %d" % (name, start, stop)
 
@@ -227,7 +229,7 @@
                 for y in xrange(start, x):
                     key = '%04d' % x
                     data = dbutils.DeadlockWrap(d.get, key, max_retries=12)
-                    assert data == self.makeData(key)
+                    self.assertEqual(data, self.makeData(key))
 
         # flush them
         try:
@@ -242,14 +244,14 @@
             data = dbutils.DeadlockWrap(d.get, key, max_retries=12)
             if verbose and x % 100 == 0:
                 print "%s: fetched record (%s, %s)" % (name, key, data)
-            assert data == self.makeData(key), (key, data, self.makeData(key))
+            self.assertEqual(data, self.makeData(key))
             if random() <= 0.10:
                 dbutils.DeadlockWrap(d.delete, key, max_retries=12)
                 if verbose:
                     print "%s: deleted record %s" % (name, key)
 
-        if verbose: print "%s: thread finished" % name
-
+        if verbose:
+            print "%s: thread finished" % name
 
     def readerThread(self, d, readerNum):
         time.sleep(0.01 * readerNum)
@@ -260,17 +262,17 @@
             count = 0
             rec = c.first()
             while rec:
-                count = count + 1
+                count += 1
                 key, data = rec
-                assert self.makeData(key) == data
+                self.assertEqual(self.makeData(key), data)
                 rec = c.next()
-            if verbose: print "%s: found %d records" % (name, count)
+            if verbose:
+                print "%s: found %d records" % (name, count)
             c.close()
             time.sleep(0.05)
 
-        if verbose: print "%s: thread finished" % name
-
-
+        if verbose:
+            print "%s: thread finished" % name
 
 
 class BTreeSimpleThreaded(SimpleThreadedBase):
@@ -284,7 +286,6 @@
 #----------------------------------------------------------------------
 
 
-
 class ThreadedTransactionsBase(BaseThreadedTestCase):
     dbopenflags = db.DB_THREAD | db.DB_AUTO_COMMIT
     envflags    = (db.DB_THREAD |
@@ -296,15 +297,12 @@
     readers = 0
     writers = 0
     records = 2000
-
     txnFlag = 0
 
-
     def setEnvOpts(self):
         #self.env.set_lk_detect(db.DB_LOCK_DEFAULT)
         pass
 
-
     def test03_ThreadedTransactions(self):
         if verbose:
             print '\n', '-=' * 30
@@ -334,12 +332,11 @@
         for t in threads:
             t.join()
 
-        self.doLockDetect = 0
+        self.doLockDetect = False
         dt.join()
 
-
     def doWrite(self, d, name, start, stop):
-        finished = 0
+        finished = False
         while not finished:
             try:
                 txn = self.env.txn_begin(None, self.txnFlag)
@@ -349,18 +346,17 @@
                     if verbose and x % 100 == 0:
                         print "%s: records %d - %d finished" % (name, start, x)
                 txn.commit()
-                finished = 1
+                finished = True
             except (db.DBLockDeadlockError, db.DBLockNotGrantedError), val:
                 if verbose:
                     print "%s: Aborting transaction (%s)" % (name, val[1])
                 txn.abort()
                 time.sleep(0.05)
 
-
-
     def writerThread(self, d, howMany, writerNum):
         name = currentThread().getName()
-        start, stop = howMany * writerNum, howMany * (writerNum + 1) - 1
+        start = howMany * writerNum
+        stop = howMany * (writerNum + 1) - 1
         if verbose:
             print "%s: creating records %d - %d" % (name, start, stop)
 
@@ -368,10 +364,12 @@
         for x in range(start, stop, step):
             self.doWrite(d, name, x, min(stop, x+step))
 
-        if verbose: print "%s: finished creating records" % name
-        if verbose: print "%s: deleting a few records" % name
+        if verbose:
+            print "%s: finished creating records" % name
+        if verbose:
+            print "%s: deleting a few records" % name
 
-        finished = 0
+        finished = False
         while not finished:
             try:
                 recs = []
@@ -384,23 +382,24 @@
                         d.delete(key, txn)
                         recs.append(key)
                 txn.commit()
-                finished = 1
-                if verbose: print "%s: deleted records %s" % (name, recs)
+                finished = True
+                if verbose:
+                    print "%s: deleted records %s" % (name, recs)
             except (db.DBLockDeadlockError, db.DBLockNotGrantedError), val:
                 if verbose:
                     print "%s: Aborting transaction (%s)" % (name, val[1])
                 txn.abort()
                 time.sleep(0.05)
 
-        if verbose: print "%s: thread finished" % name
-
+        if verbose:
+            print "%s: thread finished" % name
 
     def readerThread(self, d, readerNum):
         time.sleep(0.01 * readerNum + 0.05)
         name = currentThread().getName()
 
         for loop in range(5):
-            finished = 0
+            finished = False
             while not finished:
                 try:
                     txn = self.env.txn_begin(None, self.txnFlag)
@@ -408,14 +407,14 @@
                     count = 0
                     rec = c.first()
                     while rec:
-                        count = count + 1
+                        count += 1
                         key, data = rec
-                        assert self.makeData(key) == data
+                        self.assertEqual(self.makeData(key), data)
                         rec = c.next()
                     if verbose: print "%s: found %d records" % (name, count)
                     c.close()
                     txn.commit()
-                    finished = 1
+                    finished = True
                 except (db.DBLockDeadlockError, db.DBLockNotGrantedError), val:
                     if verbose:
                         print "%s: Aborting transaction (%s)" % (name, val[1])
@@ -425,11 +424,11 @@
 
             time.sleep(0.05)
 
-        if verbose: print "%s: thread finished" % name
-
+        if verbose:
+            print "%s: thread finished" % name
 
     def deadlockThread(self):
-        self.doLockDetect = 1
+        self.doLockDetect = True
         while self.doLockDetect:
             time.sleep(0.5)
             try:
@@ -442,7 +441,6 @@
                 pass
 
 
-
 class BTreeThreadedTransactions(ThreadedTransactionsBase):
     dbtype = db.DB_BTREE
     writers = 3
