上面的Corey 建议使用junitxml,但我和larrycai 在同一条船上,因为我没有编写单元测试来测试Python 代码。我正在编写 Python 脚本来进行黑盒系统测试,并且只想在 JUnit XML 中输出结果,而无需重新发明轮子。
我简要查看了上面 larrycai 建议的 David Black 的“python junit xml 输出模块”,但最终选择了另一个类似的包。不确定哪个更好,因为我只尝试过这个,但它最终对我来说效果很好。
仅相差一个字符,但封装为“junit-xml”:
https ://pypi.python.org/pypi/junit-xml/1.0
当心...他的自述文件中的示例有错误并且不起作用。我在 github 上报告了错误(pypi 页面中包含 github 链接)。他的“prettyprint”arg 处理也有一个错误,但我会建议您参考我也在 github 上报告的问题 #3,其中包含了我的修复。如果您下载源代码,您可以查看他的 test.py 单元测试,但这也是我的测试脚本,我在其中测试/实验了几个示例(使用 Python 3.3):
#junit-xml 1.0 downloaded from https://pypi.python.org/pypi/junit-xml
from junit_xml import TestSuite, TestCase
#Good article that has examples of how Jenkins parses JUnit XML to display output:
#http://nelsonwells.net/2012/09/how-jenkins-ci-parses-and-displays-junit-output/
#One version of JUnit XML schema: http://windyroad.org/dl/Open%20Source/JUnit.xsd
def testBasicToConsole():
''' Perform the very basic test with 1 suite and 1 test case, output to console.
This is the example from the above referenced pypi webpage, but corrected to
actually work.
'''
test_cases = [TestCase('Test1', 'some.class.name', 123.345, 'I am stdout!', 'I am stderr!')]
ts = [TestSuite("my test suite", test_cases)]
# pretty printing is on by default but can be disabled using prettyprint=False
print(TestSuite.to_xml_string(ts, prettyprint=False))
def testBasicInfoToConsole():
''' Actually, even more basic than the test above, with classname, stdout, and stderror
removed to demonstrate they are optional. For system testing we often won't use them.
Output to console.
'''
test_cases = [TestCase('PathCheck: ApplicationControl', '', .0523, '', '')]
ts = [TestSuite("DirectorITG2", test_cases)]
# pretty printing is on by default but can be disabled using prettyprint=False
print(TestSuite.to_xml_string(ts))
def testFailureInfoToConsole():
''' 1 suite and test case with failure info added. Output to console.
'''
test_cases = TestCase('FileCheck: DesktopNotificationCenter', '', .0451, '', '')
test_cases.add_failure_info('Invalid File \'DNC.exe\'.')
ts = [TestSuite("DirectorITG2", [test_cases])]
# pretty printing is on by default but can be disabled using prettyprint=False
print(TestSuite.to_xml_string(ts))
def testMultiTestCasesToConsole():
''' Demonstrates a single test suite with multiple test cases, one of which
has failure info. Output to console.
'''
test_cases = [TestCase('FileCheck: DesktopNotificationCenter', '', .0451, '', '')]
test_cases.append(TestCase('FileCheck: PropertyServer', '', .0452, '', ''))
test_cases[0].add_failure_info('Invalid File \'DNC.exe\'.')
ts = [TestSuite("DirectorITG2", test_cases)]
# pretty printing is on by default but can be disabled using prettyprint=False
print(TestSuite.to_xml_string(ts))
def testMultiTestSuitesToConsole():
''' Demonstrates adding multiple test suites. Output to console.
'''
test_cases = [TestCase('FileCheck: DesktopNotificationCenter', '', .0451, '', '')]
ts = [TestSuite("FileChecks", test_cases)]
ts.append(TestSuite("ProcessChecks", [TestCase('ProcessCheck: ApplicationControl', '', 1.043, '', '')]))
# pretty printing is on by default but can be disabled using prettyprint=False
print(TestSuite.to_xml_string(ts))
def testMultiTestCasesToFile():
''' Demonstrates a single test suite with multiple test cases, one of which
has failure info. Output to a file with PrettyPrint disabled (Jenkins-friendly).
'''
test_cases = [TestCase('DesktopNotificationCenter', 'Integration.FileCheck', .0451, '', '')]
test_cases.append(TestCase('PropertyServer', 'Integration.FileCheck', .5678, '', ''))
test_cases[0].add_failure_info('Invalid File \'DNC.exe\'.')
ts = [TestSuite("GII_2013_R1", test_cases)]
# open the file, then call the TestSuite to_File function with prettyprint off.
# use raw text here to protect slashes from becoming escape characters
with open(r'C:\Users\Administrator\.jenkins\workspace\IntegrationTests\FileCheck.xml', mode='a') as lFile:
TestSuite.to_file(lFile, ts, prettyprint=False)
lFile.close()
if __name__ == '__main__':
''' If this module is being run directly, run all of the example test functions.
Test functions output JUnit XML for various scenarios to either screen (Console)
or file.
'''
testBasicToConsole()
# testBasicInfoToConsole()
# testFailureInfoToConsole()
# testMultiTestCasesToConsole()
# testMultiTestSuitesToConsole()
# testMultiTestCasesToFile()
else:
''' Function calls for an external run of this script.
'''
testMultiTestCasesToFile()