19

I have an acceptance test case, the result is plain text. I want to use Jenkins to show the result, and the JUnit format is suitable for me.

So I want to check whether there is existing python code to generate JUnit-format XML, so that I can easily just add my parsing code.

Related question.

4

6 回答 6

20

上面的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()
于 2013-03-15T14:52:02.277 回答
7

您可以使用junitxml(Python JUnit XML 报告器)

在 PyPI 上:http: //pypi.python.org/pypi/junitxml

如果您有一个unittest名为suite. 您可以运行它,并将结果写入一个 xml 文件,如下所示:

import junitxml

fp = file('results.xml', 'wb')
result = junitxml.JUnitXmlResult(fp)
result.startTestRun()
TestSuite(suite).run(result)
result.stopTestRun()

或发现测试并将 xml 打印到标准输出:

python -m junitxml.main discover

另一种选择是使用nose和运行您的套件:

nosetests --with-xunit
于 2012-11-23T15:07:44.367 回答
1

collective.recipe.xmltestreport构建配方包正是这样做的。它获取测试运行器输出并创建适合 JUnit 的 XML 文件。但是,它是特定于构建的并使用zope.testrunner测试运行程序包

如果切换到 buildout 不是您的选择,您可以研究它的源代码以提取重要部分。

于 2012-11-23T14:58:13.937 回答
0

在这里,我从 github https://github.com/kyrus/python-junit-xml得到了另一个包

于 2013-06-18T02:14:21.470 回答
0

我找到了一个 python 模块https://bitbucket.org/db_atlass/python-junit-xml-output-module/,看起来很适合我的需要。谢谢大卫布莱克那里

# code snippet for the usage
""" a short example of how to use this module """
test_cases = []
for i in range(0, 5):
    type_c = ""
    if i % 2 == 0:
        type_c = "failure"
    test_cases.append(TestCase(i, str(i) + "contents", type_c) )

junit_xml = JunitXml("demo test example", test_cases)
于 2012-12-20T00:51:10.933 回答
0

这里有很好的答案:(有很多方法可以做到) Jenkins 中的 Python 单元测试?

恕我直言,最好的方法是编写 python unittest 测试安装 pytest(类似于'yum install pytest')来安装 py.test。然后像这样运行测试: 'py.test --junitxml results.xml test.py'。您可以运行任何 unittest python 脚本并获取 jUnit xml 结果。

https://docs.python.org/2.7/library/unittest.html

在 jenkins 构建配置 构建后操作 使用 result.xml 和您生成的任何更多测试结果文件添加“发布 JUnit 测试结果报告”操作。

于 2016-05-06T11:58:28.290 回答