Issue 7893 and Issue 7588
diff --git a/Lib/unittest/runner.py b/Lib/unittest/runner.py
index 3afbc0e..cbec296 100644
--- a/Lib/unittest/runner.py
+++ b/Lib/unittest/runner.py
@@ -22,7 +22,7 @@
         self.write('\n') # text-mode streams translate to \r\n if needed
 
 
-class _TextTestResult(result.TestResult):
+class TextTestResult(result.TestResult):
     """A test result class that can print formatted text results to a stream.
 
     Used by TextTestRunner.
@@ -31,27 +31,28 @@
     separator2 = '-' * 70
 
     def __init__(self, stream, descriptions, verbosity):
-        super(_TextTestResult, self).__init__()
+        super(TextTestResult, self).__init__()
         self.stream = stream
         self.showAll = verbosity > 1
         self.dots = verbosity == 1
         self.descriptions = descriptions
 
     def getDescription(self, test):
-        if self.descriptions:
-            return test.shortDescription() or str(test)
+        doc_first_line = test.shortDescription()
+        if self.descriptions and doc_first_line:
+            return '\n'.join((str(test), doc_first_line))
         else:
             return str(test)
 
     def startTest(self, test):
-        super(_TextTestResult, self).startTest(test)
+        super(TextTestResult, self).startTest(test)
         if self.showAll:
             self.stream.write(self.getDescription(test))
             self.stream.write(" ... ")
             self.stream.flush()
 
     def addSuccess(self, test):
-        super(_TextTestResult, self).addSuccess(test)
+        super(TextTestResult, self).addSuccess(test)
         if self.showAll:
             self.stream.writeln("ok")
         elif self.dots:
@@ -59,7 +60,7 @@
             self.stream.flush()
 
     def addError(self, test, err):
-        super(_TextTestResult, self).addError(test, err)
+        super(TextTestResult, self).addError(test, err)
         if self.showAll:
             self.stream.writeln("ERROR")
         elif self.dots:
@@ -67,7 +68,7 @@
             self.stream.flush()
 
     def addFailure(self, test, err):
-        super(_TextTestResult, self).addFailure(test, err)
+        super(TextTestResult, self).addFailure(test, err)
         if self.showAll:
             self.stream.writeln("FAIL")
         elif self.dots:
@@ -75,7 +76,7 @@
             self.stream.flush()
 
     def addSkip(self, test, reason):
-        super(_TextTestResult, self).addSkip(test, reason)
+        super(TextTestResult, self).addSkip(test, reason)
         if self.showAll:
             self.stream.writeln("skipped {0!r}".format(reason))
         elif self.dots:
@@ -83,7 +84,7 @@
             self.stream.flush()
 
     def addExpectedFailure(self, test, err):
-        super(_TextTestResult, self).addExpectedFailure(test, err)
+        super(TextTestResult, self).addExpectedFailure(test, err)
         if self.showAll:
             self.stream.writeln("expected failure")
         elif self.dots:
@@ -91,7 +92,7 @@
             self.stream.flush()
 
     def addUnexpectedSuccess(self, test):
-        super(_TextTestResult, self).addUnexpectedSuccess(test)
+        super(TextTestResult, self).addUnexpectedSuccess(test)
         if self.showAll:
             self.stream.writeln("unexpected success")
         elif self.dots:
@@ -118,13 +119,18 @@
     It prints out the names of tests as they are run, errors as they
     occur, and a summary of the results at the end of the test run.
     """
-    def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
+    resultclass = TextTestResult
+
+    def __init__(self, stream=sys.stderr, descriptions=True, verbosity=1,
+                 resultclass=None):
         self.stream = _WritelnDecorator(stream)
         self.descriptions = descriptions
         self.verbosity = verbosity
+        if resultclass is not None:
+            self.resultclass = resultclass
 
     def _makeResult(self):
-        return _TextTestResult(self.stream, self.descriptions, self.verbosity)
+        return self.resultclass(self.stream, self.descriptions, self.verbosity)
 
     def run(self, test):
         "Run the given test case or test suite."