def get_test_id(self, test): if is_string(test): return test # Handle special "tests" test_class_name = get_class_fullname(test) if test_class_name == CONTEXT_SUITE_FQN: if inspect.ismodule(test.context): module_name = test.context.__name__ return module_name + "." + test.error_context elif inspect.isclass(test.context): class_name = get_class_fullname(test.context) return class_name + "." + test.error_context test_id = test.id() real_test = getattr(test, "test", test) real_test_class_name = get_class_fullname(real_test) test_arg = getattr(real_test, "arg", tuple()) if (type(test_arg) is tuple or type(test_arg) is list) and len(test_arg) > 0: # As written in nose.case.FunctionTestCase#__str__ or nose.case.MethodTestCase#__str__ test_arg_str = "%s" % (test_arg,) if test_id.endswith(test_arg_str): # Replace '.' in test args with '_' to preserve test hierarchy on TeamCity test_id = test_id[:len(test_id) - len(test_arg_str)] + test_arg_str.replace('.', '_') # Force test_id for doctests if real_test_class_name != "doctest.DocTestCase" and real_test_class_name != "nose.plugins.doctests.DocTestCase": desc = test.shortDescription() if desc and desc != test.id(): return "%s (%s)" % (test_id, desc.replace('.', '_')) return test_id
def get_message_description(linter, msgid): if hasattr(linter.msgs_store, "get_message_definitions"): definitions = linter.msgs_store.get_message_definitions(msgid) elif hasattr(linter.msgs_store, "get_message_definition"): definitions = [linter.msgs_store.get_message_definition(msgid)] elif hasattr(linter.msgs_store, "check_message_id"): definitions = [linter.msgs_store.check_message_id(msgid)] else: raise Exception("This version of linter.msgs_store is unsupported. " "pylint version: " + pylint_version + ". " + "linter.msgs_store type: " + get_class_fullname(linter.msgs_store)) descriptions = [] for definition in definitions: if hasattr(definition, 'descr'): descriptions.append(definition.descr) elif hasattr(definition, "description"): descriptions.append(definition.description) else: raise Exception( "This version of message definition is unsupported. " + "pylint version: " + pylint_version + ". " + "definition type: " + get_class_fullname(definition)) return " ".join(descriptions)
def addError(self, test, err): test_class_name = get_class_fullname(test) test_id = self.get_test_id(test) if issubclass(err[0], SkipTest): self.messages.testIgnored(test_id, message=("SKIPPED: %s" % str(err[1])), flowId=test_id) self.report_finish(test) elif issubclass(err[0], DeprecatedTest): self.messages.testIgnored(test_id, message="Deprecated", flowId=test_id) self.report_finish(test) elif test_class_name == CONTEXT_SUITE_FQN: self.messages.testStarted(test_id, captureStandardOutput='true', flowId=test_id) self.report_fail(test, 'error in ' + test.error_context + ' context', err) self.messages.testFinished(test_id, flowId=test_id) else: self.report_fail(test, 'Error', err) self.report_finish(test)
def report_fail(self, test, fail_type, err): test_id = self.get_test_id(test) diff_failed = None try: error = err[1] if isinstance(error, EqualsAssertionError): diff_failed = error except Exception: pass if is_string(err): details = err elif get_class_fullname(err) == "twisted.python.failure.Failure": details = err.getTraceback() else: frames_to_skip_from_tail = 2 if diff_failed else 0 details = convert_error_to_string(err, frames_to_skip_from_tail) subtest_failures = self.get_subtest_failure(test_id) if subtest_failures: details = "Failed subtests list: " + subtest_failures + "\n\n" + details.strip() details = details.strip() if diff_failed: self.messages.testFailed(test_id, message=diff_failed.msg, details=details, flowId=test_id, comparison_failure=diff_failed) else: self.messages.testFailed(test_id, message=fail_type, details=details, flowId=test_id) self.failed_tests.add(test_id)
def addError(self, test, err): test_class_name = get_class_fullname(test) test_id = self.get_test_id(test) if issubclass(err[0], SkipTest): self.messages.testIgnored(test_id, message=("SKIPPED: %s" % str(err[1])), flowId=test_id) self.report_finish(test) elif issubclass(err[0], DeprecatedTest): self.messages.testIgnored(test_id, message="Deprecated", flowId=test_id) self.report_finish(test) elif test_class_name == CONTEXT_SUITE_FQN: self.messages.testStarted( test_id, captureStandardOutput=self._captureStandardOutput_value(), flowId=test_id) self.report_fail(test, 'error in ' + test.error_context + ' context', err) self.messages.testFinished(test_id, flowId=test_id) else: # some test cases may report errors in pre setup when startTest was not called yet # example: https://github.com/JetBrains/teamcity-messages/issues/153 if test_id not in self.test_started_datetime_map: self.report_started(test) self.report_fail(test, 'Error', err) self.report_finish(test)
def report_fail(self, test, fail_type, err): test_id = self.get_test_id(test) diff_failed = None try: error = err[1] if isinstance(error, EqualsAssertionError): diff_failed = error except: pass if is_string(err): details = err elif get_class_fullname(err) == "twisted.python.failure.Failure": details = err.getTraceback() else: frames_to_skip_from_tail = 2 if diff_failed else 0 details = convert_error_to_string(err, frames_to_skip_from_tail) subtest_failures = self.get_subtest_failure(test_id) if subtest_failures: details = "Failed subtests list: " + subtest_failures + "\n\n" + details.strip() details = details.strip() if diff_failed: self.messages.testFailed(test_id, message=diff_failed.msg, details=details, flowId=test_id, comparison_failure=diff_failed) else: self.messages.testFailed(test_id, message=fail_type, details=details, flowId=test_id) self.failed_tests.add(test_id)
def addSkip(self, test, reason=""): if sys.version_info >= (2, 7): super(TeamcityTestResult, self).addSkip(test, reason) if reason: if isinstance(reason, Exception): reason_str = ": " + get_exception_message(reason) else: reason_str = ": " + to_unicode(reason) else: reason_str = "" test_class_name = get_class_fullname(test) if test_class_name == "unittest.case._SubTest" or test_class_name == "unittest2.case._SubTest": parent_test = test.test_case parent_test_id = self.get_test_id(parent_test) subtest = test block_id = self.get_subtest_block_id(parent_test, subtest) self.messages.subTestBlockOpened(block_id, subTestResult="Skip", flowId=parent_test_id) self.messages.testStdOut(parent_test_id, out="SubTest skipped" + reason_str + "\n", flowId=parent_test_id) self.messages.blockClosed(block_id, flowId=parent_test_id) else: test_id = self.get_test_id(test) if test_id not in self.test_started_datetime_map: # Test ignored without startTest. Handle start and finish events ourselves self.messages.testStarted(test_id, flowId=test_id) self.messages.testIgnored(test_id, message="Skipped" + reason_str, flowId=test_id) self.messages.testFinished(test_id, flowId=test_id) else: self.messages.testIgnored(test_id, message="Skipped" + reason_str, flowId=test_id)
def addSkip(self, test, reason=""): if sys.version_info >= (2, 7): super(TeamcityTestResult, self).addSkip(test, reason) if reason: reason_str = ": " + str(reason) else: reason_str = "" test_class_name = get_class_fullname(test) if test_class_name == "unittest.case._SubTest" or test_class_name == "unittest2.case._SubTest": parent_test = test.test_case parent_test_id = self.get_test_id(parent_test) subtest = test block_id = self.get_subtest_block_id(parent_test, subtest) self.messages.subTestBlockOpened(block_id, subTestResult="Skip", flowId=parent_test_id) self.messages.testStdOut(parent_test_id, out="SubTest skipped" + reason_str + "\n", flowId=parent_test_id) self.messages.blockClosed(block_id, flowId=parent_test_id) else: test_id = self.get_test_id(test) self.messages.testIgnored(test_id, message="Skipped" + reason_str, flowId=test_id)
def addError(self, test, err, *k): super(TeamcityTestResult, self).addError(test, err) if get_class_fullname(test) == "unittest.suite._ErrorHolder": # This is a standalone error test_name = test.id() # patch setUpModule (__main__) -> __main__.setUpModule test_name = re.sub(r'^(.*) \((.*)\)$', r'\2.\1', test_name) self.messages.testStarted(test_name, flowId=test_name) self.report_fail(test_name, 'Failure', err) self.messages.testFinished(test_name, flowId=test_name) elif get_class_fullname(err[0]) == "unittest2.case.SkipTest": message = getattr(err[1], "message", '') self.addSkip(test, message) else: self.report_fail(test, 'Error', err)
def get_test_id(self, test): if is_string(test): return test # Force test_id for doctests if get_class_fullname(test) != "doctest.DocTestCase": desc = test.shortDescription() if desc and desc != test.id(): return "%s (%s)" % (test.id(), desc.replace('.', '_')) return test.id()
def addError(self, test, err, *k): super(TeamcityTestResult, self).addError(test, err) test_class = get_class_fullname(test) if test_class in _ERROR_HOLDERS_FQN: # This is a standalone error test_id = self.get_test_id(test) self.messages.testStarted(test_id, flowId=test_id) self.report_fail(test, 'Failure', err) self.messages.testFinished(test_id, flowId=test_id) elif get_class_fullname(err[0]) == "unittest2.case.SkipTest": message = "" if hasattr(err[1], "message"): message = getattr(err[1], "message", "") elif hasattr(err[1], "args"): message = getattr(err[1], "args", [""])[0] self.addSkip(test, message) else: self.report_fail(test, 'Error', err)
def get_test_id(test): if is_string(test): return test # Force test_id for doctests if get_class_fullname(test) != "doctest.DocTestCase": desc = test.shortDescription() test_method_name = getattr(test, "_testMethodName", "") if desc and desc != test.id() and desc != test_method_name: return "%s (%s)" % (test.id(), desc.replace('.', '_')) return test.id()
def addError(self, test, err): test_class_name = get_class_fullname(test) test_id = self.get_test_id(test) if issubclass(err[0], SkipTest): self.messages.testIgnored(test_id, message=("SKIPPED: %s" % str(err[1])), flowId=test_id) elif issubclass(err[0], DeprecatedTest): self.messages.testIgnored(test_id, message="Deprecated", flowId=test_id) elif test_class_name == CONTEXT_SUITE_FQN: self.messages.testStarted(test_id, captureStandardOutput='true', flowId=test_id) self.report_fail(test, 'error in ' + test.error_context + ' context', err) self.messages.testFinished(test_id, flowId=test_id) else: self.report_fail(test, 'Error', err)
def report_fail(self, test, fail_type, err): test_id = self.get_test_id(test) if is_string(err): details = err elif get_class_fullname(err) == "twisted.python.failure.Failure": details = err.getTraceback() else: details = convert_error_to_string(err) subtest_failure = self.get_subtest_failure(test_id) if subtest_failure: details = subtest_failure + "\n" + details self.messages.testFailed(test_id, message=fail_type, details=details, flowId=test_id) self.failed_tests.add(test_id)
def get_test_id(test): if is_string(test): return test test_class_fullname = get_class_fullname(test) test_id = test.id() if test_class_fullname in _ERROR_HOLDERS_FQN: # patch setUpModule (__main__) -> __main__.setUpModule return re.sub(r'^(.*) \((.*)\)$', r'\2.\1', test_id) # Force test_id for doctests if test_class_fullname != "doctest.DocTestCase": desc = test.shortDescription() test_method_name = getattr(test, "_testMethodName", "") if desc and desc != test_id and desc != test_method_name: return "%s (%s)" % (test_id, desc.replace('.', '_')) return test_id
def addError(self, test, err): test_class_name = get_class_fullname(test) test_id = self.get_test_id(test) if issubclass(err[0], SkipTest): self.messages.testIgnored(test_id, message=("SKIPPED: %s" % str(err[1])), flowId=test_id) self.report_finish(test) elif issubclass(err[0], DeprecatedTest): self.messages.testIgnored(test_id, message="Deprecated", flowId=test_id) self.report_finish(test) elif test_class_name == CONTEXT_SUITE_FQN: self.messages.testStarted(test_id, captureStandardOutput=self._captureStandardOutput_value(), flowId=test_id) self.report_fail(test, 'error in ' + test.error_context + ' context', err) self.messages.testFinished(test_id, flowId=test_id) else: # some test cases may report errors in pre setup when startTest was not called yet # example: https://github.com/JetBrains/teamcity-messages/issues/153 if test_id not in self.test_started_datetime_map: self.report_started(test) self.report_fail(test, 'Error', err) self.report_finish(test)