diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py
new file mode 100644
index 0000000..aab1388
--- /dev/null
+++ b/Lib/test/test_dbm.py
@@ -0,0 +1,147 @@
+#! /usr/bin/env python
+"""Test script for the dbm.open function based on testdumbdbm.py"""
+
+import os
+import unittest
+import dbm
+import glob
+import test.support
+
+_fname = test.support.TESTFN
+
+#
+# Iterates over every database module supported by dbm currently available,
+# setting dbm to use each in turn, and yielding that module
+#
+def dbm_iterator():
+    old_default = dbm._defaultmod
+    for module in dbm._modules.values():
+        dbm._defaultmod = module
+        yield module
+    dbm._defaultmod = old_default
+
+#
+# Clean up all scratch databases we might have created during testing
+#
+def delete_files():
+    # we don't know the precise name the underlying database uses
+    # so we use glob to locate all names
+    for f in glob.glob(_fname + "*"):
+        test.support.unlink(f)
+
+
+class AnyDBMTestCase(unittest.TestCase):
+    _dict = {'0': b'',
+             'a': b'Python:',
+             'b': b'Programming',
+             'c': b'the',
+             'd': b'way',
+             'f': b'Guido',
+             'g': b'intended',
+             }
+
+    def __init__(self, *args):
+        unittest.TestCase.__init__(self, *args)
+
+    def test_anydbm_creation(self):
+        f = dbm.open(_fname, 'c')
+        self.assertEqual(list(f.keys()), [])
+        for key in self._dict:
+            f[key.encode("ascii")] = self._dict[key]
+        self.read_helper(f)
+        f.close()
+
+    def test_anydbm_modification(self):
+        self.init_db()
+        f = dbm.open(_fname, 'c')
+        self._dict['g'] = f[b'g'] = b"indented"
+        self.read_helper(f)
+        f.close()
+
+    def test_anydbm_read(self):
+        self.init_db()
+        f = dbm.open(_fname, 'r')
+        self.read_helper(f)
+        f.close()
+
+    def test_anydbm_keys(self):
+        self.init_db()
+        f = dbm.open(_fname, 'r')
+        keys = self.keys_helper(f)
+        f.close()
+
+    def test_anydbm_access(self):
+        self.init_db()
+        f = dbm.open(_fname, 'r')
+        key = "a".encode("ascii")
+        assert(key in f)
+        assert(f[key] == b"Python:")
+        f.close()
+
+    def read_helper(self, f):
+        keys = self.keys_helper(f)
+        for key in self._dict:
+            self.assertEqual(self._dict[key], f[key.encode("ascii")])
+
+    def init_db(self):
+        f = dbm.open(_fname, 'n')
+        for k in self._dict:
+            f[k.encode("ascii")] = self._dict[k]
+        f.close()
+
+    def keys_helper(self, f):
+        keys = sorted(k.decode("ascii") for k in f.keys())
+        dkeys = sorted(self._dict.keys())
+        self.assertEqual(keys, dkeys)
+        return keys
+
+    def tearDown(self):
+        delete_files()
+
+    def setUp(self):
+        delete_files()
+
+
+class WhichDBTestCase(unittest.TestCase):
+    # Actual test methods are added to namespace after class definition.
+    def __init__(self, *args):
+        unittest.TestCase.__init__(self, *args)
+
+    def test_whichdb(self):
+        for module in dbm_iterator():
+            # Check whether whichdb correctly guesses module name
+            # for databases opened with "module" module.
+            # Try with empty files first
+            name = module.__name__
+            if name == 'dbm.dumb':
+                continue   # whichdb can't support dbm.dumb
+            test.support.unlink(_fname)
+            f = module.open(_fname, 'c')
+            f.close()
+            self.assertEqual(name, dbm.whichdb(_fname))
+            # Now add a key
+            f = module.open(_fname, 'w')
+            f[b"1"] = b"1"
+            # and test that we can find it
+            self.assertTrue(b"1" in f)
+            # and read it
+            self.assertTrue(f[b"1"] == b"1")
+            f.close()
+            self.assertEqual(name, dbm.whichdb(_fname))
+
+    def tearDown(self):
+        delete_files()
+
+    def setUp(self):
+        delete_files()
+
+
+def test_main():
+    try:
+        for module in dbm_iterator():
+            test.support.run_unittest(AnyDBMTestCase, WhichDBTestCase)
+    finally:
+        delete_files()
+
+if __name__ == "__main__":
+    test_main()
