19

受け入れテストケースがあり、結果はプレーンテキストです。Jenkinsを使用して結果を表示したいのですが、JUnit形式が適しています。

そこで、JUnit形式のXMLを生成するための既存のPythonコードがあるかどうかを確認して、解析コードを簡単に追加できるようにします。

関連する質問

4

6 に答える 6

20

上記のCoreyはjunitxmlを提案しましたが、Pythonコードをテストするための単体テストを作成していないという点で、私はlarrycaiと同じボートにいました。私はブラックボックスシステムテストを行うためのPythonスクリプトを書いていますが、車輪の再発明をせずにJUnitXMLで結果を出力したかっただけです。

上記のlarrycaiによって提案されたDavidBlackの「pythonjunitxml出力モジュール」を簡単に調べましたが、最終的には別の同様のパッケージを使用することになりました。私はこれを試しただけなのでどちらが良いかわかりませんが、それは私にとって非常にうまく機能することになりました。

1文字だけ異なりますが、パッケージは「junit-xml」です: https ://pypi.python.org/pypi/junit-xml/1.0

注意してください...彼のreadmeの例にはエラーがあり、機能しません。github(pypiページに含まれているgithubリンク)でエラーを報告しました。彼の「prettyprint」引数処理にもバグがありますが、私が修正を含めた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をstdoutに出力します。

python -m junitxml.main discover

別のオプションはnose、スイートを使用して実行することです。

nosetests --with-xunit
于 2012-11-23T15:07:44.367 に答える
1

collective.recipe.xmltestreportビルドアウトレシピパッケージはまさにこれを行います。テストランナーの出力を受け取り、JUnitに適したXMLファイルを作成します。ただし、これはビルドアウト固有であり、zope.testrunnerテストランナーパッケージを使用します。

ビルドアウトに切り替えることができない場合は、そのソースコードを調べて、重要な部分を抽出することができます。

于 2012-11-23T14:58:13.937 に答える
0

1つのPythonモジュールhttps://bitbucket.org/db_atlass/python-junit-xml-output-module/が見つかりましたが、私のニーズに合っているようです。そこにthxデビッドブラック

# 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

ここで、githubhttps://github.com/kyrus/python-junit-xmlから別のパッケージを入手しまし

于 2013-06-18T02:14:21.470 に答える
0

ここでの良い答え:(それを行うには多くの方法があります) JenkinsでのPythonユニットテスト?

IMHOの最善の方法は、python unittestテストを記述し、 pytest('yum install pytest'など)をインストールしてpy.testをインストールすることです。次に、次のようなテストを実行します:'py.test --junitxmlresults.xmltest.py'。任意のunittestpythonスクリプトを実行して、jUnitxmlの結果を取得できます。

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

jenkinsビルド構成でビルド後のアクションresult.xmlおよび作成したその他のテスト結果ファイルを使用して「JUnitテスト結果レポートの公開」アクションを追加します。

于 2016-05-06T11:58:28.290 に答える