diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst
index 22b2870..69227cf 100644
--- a/Doc/library/unittest.rst
+++ b/Doc/library/unittest.rst
@@ -950,7 +950,7 @@
    :func:`expectedFailure` decorator.
 
    The default implementation appends a tuple ``(test, formatted_err)`` to the
-   instance's ``expected_failures`` attribute, where *formatted_err* is a
+   instance's ``expectedFailures`` attribute, where *formatted_err* is a
    formatted traceback derived from *err*.
 
 
@@ -960,7 +960,7 @@
    decorator, but succeeded.
 
    The default implementation appends the test to the instance's
-   ``unexpected_successes`` attribute.
+   ``unexpectedSuccesses`` attribute.
 
 
 .. _testloader-objects:
diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py
index 6a32dbf..cd8f967 100644
--- a/Lib/test/test_unittest.py
+++ b/Lib/test/test_unittest.py
@@ -2362,7 +2362,7 @@
         test.run(result)
         self.assertEqual(events,
                          ['startTest', 'addExpectedFailure', 'stopTest'])
-        self.assertEqual(result.expected_failures[0][0], test)
+        self.assertEqual(result.expectedFailures[0][0], test)
         self.assertTrue(result.wasSuccessful())
 
     def test_unexpected_success(self):
@@ -2377,7 +2377,7 @@
         self.assertEqual(events,
                          ['startTest', 'addUnexpectedSuccess', 'stopTest'])
         self.assertFalse(result.failures)
-        self.assertEqual(result.unexpected_successes, [test])
+        self.assertEqual(result.unexpectedSuccesses, [test])
         self.assertTrue(result.wasSuccessful())
 
 
diff --git a/Lib/unittest.py b/Lib/unittest.py
index 8263887..74585ee 100644
--- a/Lib/unittest.py
+++ b/Lib/unittest.py
@@ -176,8 +176,8 @@
         self.errors = []
         self.testsRun = 0
         self.skipped = []
-        self.expected_failures = []
-        self.unexpected_successes = []
+        self.expectedFailures = []
+        self.unexpectedSuccesses = []
         self.shouldStop = False
 
     def startTest(self, test):
@@ -209,12 +209,12 @@
 
     def addExpectedFailure(self, test, err):
         """Called when an expected failure/error occured."""
-        self.expected_failures.append(
+        self.expectedFailures.append(
             (test, self._exc_info_to_string(err, test)))
 
     def addUnexpectedSuccess(self, test):
         """Called when a test was expected to fail, but succeed."""
-        self.unexpected_successes.append(test)
+        self.unexpectedSuccesses.append(test)
 
     def wasSuccessful(self):
         "Tells whether or not this result was a success"
@@ -923,10 +923,10 @@
         self.stream.writeln("Ran %d test%s in %.3fs" %
                             (run, run != 1 and "s" or "", timeTaken))
         self.stream.writeln()
-        results = map(len, (result.expected_failures,
-                            result.unexpected_successes,
+        results = map(len, (result.expectedFailures,
+                            result.unexpectedSuccesses,
                             result.skipped))
-        expected_fails, unexpected_successes, skipped = results
+        expectedFails, unexpectedSuccesses, skipped = results
         infos = []
         if not result.wasSuccessful():
             self.stream.write("FAILED")
