我有几个测试用例,它们都具有类似的拆解:
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似乎很危险。
答案 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)