xmlrunner遇到subtest
最近在学Jenkins的自动化测试,生成报告时发现需要xml文件,查询到可以借用xmlrunner来自动生成xml文件的报告。我们需要创建一个XMLTestRunner的实例,并在执行unittest.main时将其testRunner参数设置为该实例,下面是我的代码:
top_dir = '/Volumes/D/auto_test/Selenium_CSDN'
start_dir = '/Volumes/D/auto_test/Selenium_CSDN/tests'
xRunner = xmlrunner.XMLTestRunner(output=os.path.join(top_dir, 'xml_report'), verbosity=2)
if __name__ == '__main__':
unittest.main(module=None, argv=['tests', 'discover', '-v', '-s', start_dir], testRunner=xRunner)
但时在执行过程时发生了错误,因此我的测试中代码中有使用subtest的功能,而XMLTestRunner中并没有重写addSubTest方法,没有创建每一个subtest的_TestInfo对象,导致在打印时调用该对象发生错误。
我的解决方法是直接在源码的_XMLTestResult中重写addSubTest方法,代码如下:
def addSubTest(self, test, subtest, err):
"让xmlrunner适用于subtest,但无法计算出每一个subtest的耗时"
if not err:
self.addSuccess(subtest)
verbose_str = 'OK'
short_str = '.'
elif issubclass(err[0], AssertionError):
self.addFailure(subtest, err)
verbose_str = 'FAIL'
short_str = 'F'
else:
self.addError(subtest, err)
verbose_str = 'ERROR'
short_str = 'E'
if self.showAll:
self.stream.write(' ' + subtest.id())
self.stream.writeln('--' + verbose_str)
elif self.dots:
self.stream.write(' ' + str(subtest))
self.stream.writeln('--' + short_str)
由于受unittest框架限制,无法记录每一个subtest的耗时。修改后执行,结果如下:
另外,我发现源码中的addFailure与addError是完全一样的,导致最后的汇总统计中只有error而没有failure。这里只需要将addFailure中的error部分改成failure就行了:
def addFailure(self, test, err):
"""
Called when a test method fails.
"""
testinfo = _TestInfo(self, test, _TestInfo.FAILURE, err)
self.failures.append((
testinfo,
self._exc_info_to_string(err, test)
))
self._prepare_callback(testinfo, [], 'FAIL', 'F')
在xmlrunner源码中,创建了TextTestRunner的子类XMLTestRunner和TestResult的子类_XMLTestResult。XMLTestRunner中增加了记录测试耗时的功能,_XMLTestResult中主要新增了将测试结果转换为xml格式并写入xml文件中的功能。