Ошибка «AttributeError:« _ErrorHolder »не имеет атрибута« _testMethodName »» - PullRequest
0 голосов
/ 02 мая 2018

У меня была эта проблема, когда я запускаю тесты, и я не могу сузить ее, потому что я немного новичок в этом, и я не могу понять это или найти помощь в другом месте. После выполнения тестов, если возникает ошибка, я обычно получаю такой вывод:

Traceback (most recent call last):
    File "./src/automated_tests/tests_launcher.py", line 215, in <module>
        pprint(result.jsonify())
    File "./src/automated_tests/tests_launcher.py", line 110, in jsonify
        json_out = self.json_append(t, ERROR, json_out, k)
    File "./src/automated_tests/tests_launcher.py", line 93, in json_append
        {LOGS: logs, STATUS: result, TITLE: test._testMethodName})
AttributeError: '_ErrorHolder' object has no attribute '_testMethodName'

Соответствующие строки:

class JsonTestResult(TextTestResult):

    def __init__(self, stream, descriptions, verbosity=2):
        super(JsonTestResult, self).__init__(stream, descriptions, verbosity)
        self.successes = []

    def addSuccess(self, test):
        super(JsonTestResult, self).addSuccess(test)
        self.successes.append(test)

    def json_append(self, test, result, out, logs):
        suite = test.__class__.__name__
        if suite not in out:
            out[suite] = {TESTCASES: []}
        if result is PASS:
            out[suite][TESTCASES].append(
                {LOGS: logs, STATUS: result, TITLE: test._testMethodName})
        elif result is FAIL:
            out[suite][TESTCASES].append(
                {LOGS: logs, STATUS: result, TITLE: test._testMethodName})
        elif result is ERROR:
            out[suite][TESTCASES].append(
# LINE 93:
                {LOGS: logs, STATUS: result, TITLE: test._testMethodName})
        elif result is SKIP:
            out[suite][TESTCASES].append(
                {LOGS: logs, STATUS: result, TITLE: test._testMethodName})
        else:
            raise KeyError("No such result: {}".format(result))
        return out

    def jsonify(self):
        json_out = dict()
        for t in self.successes:
            json_out = self.json_append(t, PASS, json_out, None)

        for t, k in self.failures:
            json_out = self.json_append(t, FAIL, json_out, k)

        for t, k in self.errors:
# LINE 110:
            json_out = self.json_append(t, ERROR, json_out, k)

        for t, k in self.skipped:
            json_out = self.json_append(t, SKIP, json_out, k)

        if BROWSER == 'chrome' and PLATFORM == 'LINUX':
            output_path = "{0}/linux_chrome.json".format(OUTPUT_FILE)
            json.dump(json_out, open(output_path, 'w'))
        elif BROWSER == 'chrome' and PLATFORM == 'WINDOWS':
            output_path = "{0}/windows_chrome.json".format(OUTPUT_FILE)
            json.dump(json_out, open(output_path, 'w'))
        if BROWSER == 'chrome' and PLATFORM == 'MAC':
            output_path = "{0}/mac_chrome.json".format(OUTPUT_FILE)
            json.dump(json_out, open(output_path, 'w'))
        return json_out

if __name__ == '__main__':
    with open(os.devnull, 'w') as null_stream:
        runner = TextTestRunner(stream=null_stream)
        runner.resultclass = JsonTestResult

        suite = TestSuite([tests])

        # run the testsuite
        result = runner.run(suite)
        # print json output
# LINE 215:
        pprint(result.jsonify())

Тесты выполняются с помощью команды makefile и выводят результаты в файл json.

1 Ответ

0 голосов
/ 06 апреля 2019

Это как-то связано с testsuite и конструктором для производного объекта, который неправильно вызывает конструктор суперкласса. Используя Python 2.7, ошибка может быть воспроизведена с помощью:

import unittest

class T(unittest.TestCase):
    def __init__(self,x):
       # unittest.TestCase.__init__(self,x)
       pass

    def test_X(self):
        pass

if __name__ == '__main__':
    unittest.main()

Если прокомментировать вызов конструктора базового класса, он сработал для меня. Это также работает, если я вообще не определяю init .

...