diff --git a/Lib/test/test_bsddb.py b/Lib/test/test_bsddb.py
index 87145fb..73a2d96 100755
--- a/Lib/test/test_bsddb.py
+++ b/Lib/test/test_bsddb.py
@@ -1,94 +1,167 @@
 #! /usr/bin/env python
-"""Test script for the bsddb C module
-   Roger E. Masse
+"""Test script for the bsddb C module by Roger E. Masse
+   Adapted to unittest format and expanded scope by Raymond Hettinger
 """
 import os
 import bsddb
 import dbhash # Just so we know it's imported
-from test.test_support import verbose, verify, TESTFN
+import unittest
+from test import test_support
+from sets import Set
 
-def test(openmethod, what, ondisk=1):
+class TestBSDDB(unittest.TestCase):
 
-    if verbose:
-        print '\nTesting: ', what, (ondisk and "on disk" or "in memory")
+    def setUp(self):
+        self.f = self.openmethod[0](self.fname, 'c')
+        self.d = dict(q='Guido', w='van', e='Rossum', r='invented', t='Python', y='')
+        for k, v in self.d.iteritems():
+            self.f[k] = v
 
-    if ondisk:
-        fname = TESTFN
-    else:
-        fname = None
-    f = openmethod(fname, 'c')
-    verify(f.keys() == [])
-    if verbose:
-        print 'creation...'
-    keys = ['0', 'a', 'b', 'c', 'd', 'e', 'f']
-    values = ['', 'Guido', 'van', 'Rossum', 'invented', 'Python']
-    items = zip(keys, values)
-    for k, v in items:
-        f[k] = v
-
-    # test mapping iteration methods
-    from sets import Set
-    def verifyset(s1, s2):
-        verify(Set(s1) == Set(s2))
-    verify(keys, f.keys())
-    verify(values, f.values())
-    verify(items, f.items())
-    verify(keys, f)
-    verify(keys, f.iterkeys())
-    verify(values, f.itervalues())
-    verify(items, f.iteritems())
-
-    if verbose:
-        print '%s %s %s' % (f['a'], f['b'], f['c'])
-
-    if what == 'BTree' :
-        if verbose:
-            print 'key ordering...'
-        f.set_location(f.first()[0])
-        while 1:
-            try:
-                rec = f.next()
-            except KeyError:
-                if rec != f.last():
-                    print 'Error, last != last!'
-                f.previous()
-                break
-            if verbose:
-                print rec
-        if not f.has_key('a'):
-            print 'Error, missing key!'
-
-    f.sync()
-    f.close()
-    if ondisk:
-        # if we're using an in-memory only db, we can't reopen it
-        # so finish here.
-        if verbose:
-            print 'modification...'
-        f = openmethod(fname, 'w')
-        f['d'] = 'discovered'
-
-        if verbose:
-            print 'access...'
-        for key in f.keys():
-            word = f[key]
-            if verbose:
-                print word
-
-        f.close()
+    def tearDown(self):
+        self.f.sync()
+        self.f.close()
+        if self.fname is None:
+            return
         try:
-            os.remove(fname)
+            os.remove(self.fname)
         except os.error:
             pass
 
-types = [(bsddb.btopen, 'BTree'),
-         (bsddb.hashopen, 'Hash Table'),
-         (bsddb.btopen, 'BTree', 0),
-         (bsddb.hashopen, 'Hash Table', 0),
-         # (bsddb.rnopen,'Record Numbers'), 'put' for RECNO for bsddb 1.85
-         #                                   appears broken... at least on
-         #                                   Solaris Intel - rmasse 1/97
-         ]
+    def test_getitem(self):
+        for k, v in self.d.iteritems():
+            self.assertEqual(self.f[k], v)
 
-for type in types:
-    test(*type)
+    def test_len(self):
+        self.assertEqual(len(self.f), len(self.d))
+
+    def test_change(self):
+        self.f['r'] = 'discovered'
+        self.assertEqual(self.f['r'], 'discovered')
+        self.assert_('r' in self.f.keys())
+        self.assert_('discovered' in self.f.values())
+
+    def test_close_and_reopen(self):
+        if self.fname is None:
+            # if we're using an in-memory only db, we can't reopen it
+            # so finish here.
+            return
+        self.f.close()
+        self.f = self.openmethod[0](self.fname, 'w')
+        for k, v in self.d.iteritems():
+            self.assertEqual(self.f[k], v)
+
+    def assertSetEquals(self, seqn1, seqn2):
+        self.assertEqual(Set(seqn1), Set(seqn2))
+
+    def test_mapping_iteration_methods(self):
+        f = self.f
+        d = self.d
+        self.assertSetEquals(d, f)
+        self.assertSetEquals(d.keys(), f.keys())
+        self.assertSetEquals(d.values(), f.values())
+        self.assertSetEquals(d.items(), f.items())
+        self.assertSetEquals(d.iterkeys(), f.iterkeys())
+        self.assertSetEquals(d.itervalues(), f.itervalues())
+        self.assertSetEquals(d.iteritems(), f.iteritems())
+
+    def test_first_next_looping(self):
+        items = [self.f.first()]
+        for i in xrange(1, len(self.f)):
+            items.append(self.f.next())
+        self.assertSetEquals(items, self.d.items())
+
+    def test_previous_last_looping(self):
+        items = [self.f.last()]
+        for i in xrange(1, len(self.f)):
+            items.append(self.f.previous())
+        self.assertSetEquals(items, self.d.items())
+
+    def test_set_location(self):
+        self.assertEqual(self.f.set_location('e'), ('e', self.d['e']))
+
+    def test_contains(self):
+        for k in self.d:
+            self.assert_(k in self.f)
+        self.assert_('not here' not in self.f)
+
+    def test_has_key(self):
+        for k in self.d:
+            self.assert_(self.f.has_key(k))
+        self.assert_(not self.f.has_key('not here'))
+
+    def test_clear(self):
+        self.f.clear()
+        self.assertEqual(len(self.f), 0)
+
+    def test_popitem(self):
+        k, v = self.f.popitem()
+        self.assert_(k in self.d)
+        self.assert_(v in self.d.values())
+        self.assert_(k not in self.f)
+        self.assertEqual(len(self.d)-1, len(self.f))
+
+    def test_pop(self):
+        k = 'w'
+        v = self.f.pop(k)
+        self.assertEqual(v, self.d[k])
+        self.assert_(k not in self.f)
+        self.assert_(v not in self.f.values())
+        self.assertEqual(len(self.d)-1, len(self.f))
+
+    def test_get(self):
+        self.assertEqual(self.f.get('NotHere'), None)
+        self.assertEqual(self.f.get('NotHere', 'Default'), 'Default')
+        self.assertEqual(self.f.get('q', 'Default'), self.d['q'])
+
+    def test_setdefault(self):
+        self.assertEqual(self.f.setdefault('new', 'dog'), 'dog')
+        self.assertEqual(self.f.setdefault('r', 'cat'), self.d['r'])
+
+    def test_update(self):
+        new = dict(y='life', u='of', i='brian')
+        self.f.update(new)
+        self.d.update(new)
+        for k, v in self.d.iteritems():
+            self.assertEqual(self.f[k], v)
+
+    def test_keyordering(self):
+        if self.openmethod[0] is not bsddb.btopen:
+            return
+        keys = self.d.keys()
+        keys.sort()
+        self.assertEqual(self.f.first()[0], keys[0])
+        self.assertEqual(self.f.next()[0], keys[1])
+        self.assertEqual(self.f.last()[0], keys[-1])
+        self.assertEqual(self.f.previous()[0], keys[-2])
+        self.assertEqual(list(self.f), keys)
+
+class TestBTree(TestBSDDB):
+    fname = test_support.TESTFN
+    openmethod = [bsddb.btopen]
+
+class TestBTree_InMemory(TestBSDDB):
+    fname = None
+    openmethod = [bsddb.btopen]
+
+class TestHashTable(TestBSDDB):
+    fname = test_support.TESTFN
+    openmethod = [bsddb.hashopen]
+
+class TestHashTable_InMemory(TestBSDDB):
+    fname = None
+    openmethod = [bsddb.hashopen]
+
+##         # (bsddb.rnopen,'Record Numbers'), 'put' for RECNO for bsddb 1.85
+##         #                                   appears broken... at least on
+##         #                                   Solaris Intel - rmasse 1/97
+
+def test_main(verbose=None):
+    test_support.run_unittest(
+        TestBTree,
+        TestHashTable,
+        TestBTree_InMemory,
+        TestHashTable_InMemory,
+    )
+
+if __name__ == "__main__":
+    test_main(verbose=True)
