log = Logger()
def _checkIfBinExists(binary):
+ # Check if binary is accessible through PATH env and with no additional paths
paths = [s + "/" for s in os.environ["PATH"].split(os.pathsep)]
- exists = any([os.path.isfile(path + binary) and os.access(path + binary, os.X_OK)
+ paths.append('')
+ existsInPaths = any([os.path.isfile(path + binary) and os.access(path + binary, os.X_OK)
for path in paths])
- if not exists:
+ if not existsInPaths:
log.error(binary + " NOT FOUND.")
- return exists
+ return existsInPaths
if externalToolCmd and not _checkIfBinExists(externalToolCmd[0]):
return
- log.info("Starting " + cmd[0] + "...")
+ log.info("Starting " + cmd[0] + " ...")
if parsing:
parser = Parser()
if testResult != "":
domResult = minidom.parseString(testResult)
log.XMLSummary(domResult)
+ log.failedTestSummary(cmd[0])
else:
# Launching process without coloring does not require report in XML form
# Avoid providing --report_format=XML, redirect std* by default to system's std*
class Logger(object):
+ __failedTests = []
+
# Create summary of test providing DOM object with parsed XML
def info(self, msg):
print BOLD + msg + ENDC
__indentChar = " "
- def testCaseSummary(self, testName, testResult, recLevel):
- msg = self.__indentChar * recLevel + BOLD + "{:<50}".format(testName + ":")
+ def testCaseSummary(self, testSuite, testName, testResult, recLevel):
+ msg = self.__indentChar * recLevel + BOLD + "{:<50}".format(testName)
if testResult == "passed":
msg += GREEN
else:
msg += RED
+ self.__failedTests.append(testSuite + "/" + testName)
print msg + testResult + ENDC
if child.nodeName == "TestSuite":
self.testSuiteSummary(child, recLevel=recLevel + 1)
elif child.nodeName == "TestCase":
- self.testCaseSummary(child.attributes["name"].value,
+ self.testCaseSummary(suite.attributes["name"].value,
+ child.attributes["name"].value,
child.attributes["result"].value,
recLevel=recLevel + 1)
if summarize:
self.infoTitle(indPrefix + suite.attributes["name"].value + " summary:")
- self.info(indPrefix + "Passed tests: " + suite.attributes["test_cases_passed"].value)
- self.info(indPrefix + "Failed tests: " + suite.attributes["test_cases_failed"].value)
- self.info(indPrefix + "Skipped tests: " + suite.attributes["test_cases_skipped"].value +
- "\n")
+ self.info(indPrefix + "Passed tests: " + suite.attributes["test_cases_passed"].value)
+ self.info(indPrefix + "Failed tests: " + suite.attributes["test_cases_failed"].value +
+ '\n')
def XMLSummary(self, dom):
self.info("\n=========== SUMMARY ===========\n")
if child.nodeName == "TestSuite":
self.testSuiteSummary(child, summarize=True)
+ def failedTestSummary(self, bin):
+ if not self.__failedTests:
+ return
+
+ commandPrefix = "sc_test_launch " + bin + " -t "
+ self.infoTitle("Some tests failed. Use following command(s) to launch them explicitly:")
+ for test in self.__failedTests:
+ self.error(self.__indentChar + commandPrefix + test)
+
class Colorizer(object):