如何在django(单元测试)中存储来自多个TestCases的结果(到一个文件)?

时间:2019-01-24 23:22:48

标签: django python-unittest

我有几个测试用例,它们都具有类似的拆解:

def tearDown(self):
    execution_time = time.time() - self.startTime
    result_list = [self._testMethodName]
    result = [str(x) for x in sys.exc_info()]
    if result[0] == 'None':
        result_list.append('PASS')
    elif 'Assertion' in result[0]:
        result_list.append('FAIL')
    else:
        result_list.append('ERROR')
    result_list.append(result)
    result_list.append(str(execution_time))
    TEST_RESULTS.append(result_list)

我正在使用tearDown函数将每个测试(在测试用例中)的结果存储到全局TEST_RESULTS对象(因此,每个TestCase文件都定义了一个TEST_RESULTS全局对象)。

然后在tearDownClass函数中执行此操作以将结果存储到csv:

@classmethod
def tearDownClass(cls):
    with open ('tests/results/test_case_1_output.csv', 'wr') as resultFile:
        wr = csv.writer(resultFile)
        wr.writerows(TEST_RESULTS)

对我来说,这是一个糟糕的实现。全局变量定义在各处,并且在每个测试用例中一次又一次地执行tearDown / tearDownClass,而不是一次定义。

此外,我想创建一个测试结果文件,该文件收集所有测试用例的结果。

我的直觉是,这需要在运行程序级别(或调用TestCases之前的某个位置)定义文件句柄。这样一来,我就可以在更高级别(而不是在一个TestCase中任意地)重新初始化csv文件。

有人对如何做到这一点有建议吗?从文档中看不到执行此操作的方法,并且覆盖django TestCase似乎很危险。

1 个答案:

答案 0 :(得分:0)

我将发布我的解决方案(非常感谢@xyres),因为我认为这可能会对其他人有所帮助。

下面是一个TestCase的示例,该示例从基类(TestManager或TestCase)调用SetUp,tearDown和setUpClass。技巧是从基类“ TestCase”调用setUpClass并创建另一个初始化函数“ initialize”, “ TestManager”基类。

class MyTestCase(TestManager, TestCase)
    def setUp(self):
        self.param1, self.param2 = super(MyTestCase, self).setUp()

    def tearDown(self):
       test_name = self._testMethodName
       super(MyTestCase, self).get_and_write_results_to_csv(test_name)

    @classmethod
    def setUpClass(cls):
        super(MyTestCase, cls).setUpClass()
        super(MyTestCase, cls).initialize('my test case name')


class TestManager():

    @classmethod
    def initialize(cls, test_case_name):
        with open('path/to/my/testresults.csv', 'wr') as resultFile:
            wr = csv.writer(resultFile)
            wr.writerow("Results for " + test_case_name + "are below:")

    def setUp(self):
        """
        Do some setup stuff that's the same for each TestCase.
        Im not showing the actions here but assume you want this 
        function to return 2 params that are the same for every 
        TestCase setup
        """
        return param1, param2

    def get_and_write_results_to_csv(self, test_name):
        execution_time = time.time() - self.startTime
        result_list = [test_name]
        result = [str(x) for x in sys.exc_info()]
        if result[0] == 'None':
            result_list.append('PASS')
        elif 'Assertion' in result[0]:
            result_list.append('FAIL')
        else:
            result_list.append('ERROR')
        result_list.append(result)
        result_list.append(str(execution_time))

        with open('path/to/my/testresults.csv', 'a') as resultFile:
            wr = csv.writer(resultFile)
            wr.writerow(result_list)