web-dev-qa-db-ja.com

Python別のテスト結果からJUnitレポートを生成するスクリプト

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

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

関連する質問

16
Larry Cai

私は1つを見つけましたpythonモジュール https://bitbucket.org/db_atlass/python-junit-xml-output-module/ 、私のニーズに合っているようです。thxDavidそこに黒

# 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)
0
Larry Cai

上記のCoreyはjunitxmlを提案しましたが、テストするユニットテストを記述していないという点でlarrycaiと同じボートにいましたPythonコード。Python =ブラックボックスシステムテストを実行するスクリプトであり、ホイールを再発明せずにJUnitXMLで結果を出力したかっただけです。

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

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

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

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

もう1つのオプションは、 nose を使用して、次のコマンドでスイートを実行することです。

nosetests --with-xunit
7
Corey Goldberg

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

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

1
Martijn Pieters

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

0
Larry Cai

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

私見の最善の方法は、write python unittest testsandinstall pytest( 'yum install pytest'のようなもの)py.testをインストールします。次に次のようなテストを実行します。'py.test--junitxml results.xmltest。 py '。任意のunittest pythonスクリプトを実行して、jUnitxmlの結果を取得できます。

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

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

0
gaoithe