PyUnit/UnittestDialog.py

changeset 6900
060a30488316
parent 6899
8c4cf9c405c7
child 6901
f2c774c8db7e
--- a/PyUnit/UnittestDialog.py	Sun Mar 24 19:18:56 2019 +0100
+++ b/PyUnit/UnittestDialog.py	Mon Mar 25 20:18:47 2019 +0100
@@ -327,6 +327,8 @@
         @type bool
         """
         self.discoverButton.setEnabled(checked)
+        self.discoveryList.clear()
+        
         if not bool(self.discoveryPicker.currentText()):
             if self.__forProject:
                 project = e5App().getObject("Project")
@@ -379,6 +381,10 @@
                             " auto-discovery."))
                 return
             
+            if discoveryStart:
+                sys.path = [os.path.abspath(discoveryStart)] + \
+                    self.savedSysPath
+            
             # clean up list of imported modules to force a reimport upon
             # running the test
             if self.savedModulelist:
@@ -391,22 +397,42 @@
             # now try to discover the testsuite
             os.chdir(discoveryStart)
             try:
-                test = unittest.defaultTestLoader.discover(discoveryStart)
+                testLoader = unittest.TestLoader()
+                test = testLoader.discover(discoveryStart)
                 if test:
-                    testsList = self.__assembleTestCasesList(test)
-                    self.__populateDiscoveryResults(testsList)
-                    self.sbLabel.setText(
-                        self.tr("Discovered %n Test(s)", "", len(testsList)))
-                    self.tabWidget.setCurrentIndex(0)
+                    if hasattr(testLoader, "errors") and \
+                       bool(testLoader.errors):
+                        E5MessageBox.critical(
+                            self,
+                            self.tr("Unittest"),
+                            self.tr(
+                                "<p>Unable to discover tests.</p>"
+                                "<p>{0}</p>"
+                            ).format("<br/>".join(testLoader.errors)
+                                     .replace("\n", "<br/>"))
+                        )
+                        self.sbLabel.clear()
+                    else:
+                        testsList = self.__assembleTestCasesList(test)
+                        self.__populateDiscoveryResults(testsList)
+                        self.sbLabel.setText(
+                            self.tr("Discovered %n Test(s)", "",
+                                    len(testsList)))
+                        self.tabWidget.setCurrentIndex(0)
             except Exception:
                 exc_type, exc_value, exc_tb = sys.exc_info()
                 E5MessageBox.critical(
                     self,
                     self.tr("Unittest"),
                     self.tr(
-                        "<p>Unable to discover tests.<br/>"
-                        "{0}<br/>{1}</p>")
-                    .format(str(exc_type), str(exc_value)))
+                        "<p>Unable to discover tests.</p>"
+                        "<p>{0}<br/>{1}</p>")
+                    .format(str(exc_type),
+                            str(exc_value).replace("\n", "<br/>"))
+                )
+                self.sbLabel.clear()
+            
+            sys.path = self.savedSysPath
     
     def __assembleTestCasesList(self, suite):
         """
@@ -424,7 +450,11 @@
             if isinstance(test, unittest.TestSuite):
                 testCases.extend(self.__assembleTestCasesList(test))
             else:
-                testCases.append((test.id(), test.shortDescription()))
+                testId = test.id()
+                if "ModuleImportFailure" not in testId and \
+                   "LoadTestsFailure" not in testId and \
+                   "_FailedTest" not in testId:
+                    testCases.append((test.id(), test.shortDescription()))
         return testCases
     
     def __findDiscoveryItem(self, modulePath):
@@ -621,6 +651,7 @@
             
             # now try to generate the testsuite
             try:
+                testLoader = unittest.TestLoader()
                 if failedOnly and self.__failedTests:
                     failed = self.__failedTests[:]
                     if discover:
@@ -629,7 +660,7 @@
                 else:
                     failed = []
                 if discover:
-                    test = unittest.defaultTestLoader.discover(discoveryStart)
+                    test = testLoader.discover(discoveryStart)
                 else:
                     if testFileName:
                         module = __import__(self.testName)
@@ -641,10 +672,10 @@
                                       for t in self.__failedTests]
                         else:
                             failed = self.__failedTests[:]
-                        test = unittest.defaultTestLoader.loadTestsFromNames(
+                        test = testLoader.loadTestsFromNames(
                             failed, module)
                     else:
-                        test = unittest.defaultTestLoader.loadTestsFromName(
+                        test = testLoader.loadTestsFromName(
                             testName, module)
             except Exception:
                 exc_type, exc_value, exc_tb = sys.exc_info()
@@ -652,10 +683,11 @@
                     self,
                     self.tr("Unittest"),
                     self.tr(
-                        "<p>Unable to run test <b>{0}</b>.<br>"
-                        "{1}<br>{2}</p>")
+                        "<p>Unable to run test <b>{0}</b>.</p>"
+                        "<p>{1}<br/>{2}</p>")
                     .format(self.testName, str(exc_type),
-                            str(exc_value)))
+                            str(exc_value).replace("\n", "<br/>"))
+                )
                 return
                 
             # now set up the coverage stuff
@@ -704,8 +736,11 @@
                 self,
                 self.tr("Unittest"),
                 self.tr(
-                    "<p>Unable to run test <b>{0}</b>.<br>{1}<br>{2}</p>")
-                .format(self.testName, exc_type, exc_value))
+                    "<p>Unable to run test <b>{0}</b>.</p>"
+                    "<p>{1}<br>{2}</p>")
+                .format(self.testName, exc_type,
+                        exc_value.replace("\n", "<br/>"))
+            )
             return
         
         self.totalTests = nrTests

eric ide

mercurial