24

自動テストにCTest(CMakeの一部)を使用しています。

JenkinsダッシュボードでCTestの結果を取得するにはどうすればよいですか?または、言い換えると、CTestをJUnitのようなXMLで出力するにはどうすればよいですか?

4

2 に答える 2

20

Jenkinsでは、CMakeパーツ(おそらくCMakeプラグインを介して作成されたもの)の後に、次のバッチスクリプトを追加するか、Linuxでのビルドに適応します。

del build_32\JUnitTestResults.xml
pushd build_32\Tests
"C:\Program Files\CMake 2.8\bin\ctest.exe" -T Test -C RelWithDebInfo --output-on-failure
popd
verify >nul
C:\Python27\python.exe external/tool/CTest2JUnit.py build_32/Tests external/tool/CTest2JUnit.xsl > build_32/JUnitTestResults.xml
  • build_32CMakeプラグインのビルドディレクトリです
  • Testsすべてのテストが存在するサブディレクトリです
  • -T TestCTestをXMLで出力します(?!)
  • verify >nulエラーレベルを0にリセットします。これは、テストが失敗した場合にCTestが> 0を返すためです。これは、Jenkinsが「ビルド全体が失敗した」と解釈します。これは望ましくありません。
  • 最後の行は、CTestのXMLを最小限のJUnitxmlに変換します。Pythonスクリプトとxsltはソースディレクトリにあります。これを変更することをお勧めします。

Pythonスクリプトは次のようになります(10分で一緒にハッキングされます。注意してください):

from lxml import etree
import StringIO
import sys

TAGfile = open(sys.argv[1]+"/Testing/TAG", 'r')
dirname = TAGfile.readline().strip()

xmlfile = open(sys.argv[1]+"/Testing/"+dirname+"/Test.xml", 'r')
xslfile = open(sys.argv[2], 'r')

xmlcontent = xmlfile.read()
xslcontent = xslfile.read()

xmldoc = etree.parse(StringIO.StringIO(xmlcontent))
xslt_root = etree.XML(xslcontent)
transform = etree.XSLT(xslt_root)

result_tree = transform(xmldoc)
print(result_tree)
  • lxml、直接リンクが必要です
  • これには、テストが存在するディレクトリ(ビルドディレクトリ内)とxslファイルの2つの引数が必要です。
  • 最後のxmlテスト結果を読み取り、xslで変換して、stdoutに出力するだけです。
  • 「最後のxmlテスト」はTesting/TAGファイルの最初の行にあるため、追加のfopen

xslは次のようになります。それはかなり最小限ですが、仕事を成し遂げます:[編集] MOnsDaRの改良版を参照してください:http://pastebin.com/3mQ2ZQfa

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>

    <xsl:template match="/Site/Testing">    
        <testsuite>
            <xsl:apply-templates select="Test"/>
        </testsuite>
    </xsl:template>

    <xsl:template match="Test">
        <xsl:variable name="testcasename"><xsl:value-of select= "Name"/></xsl:variable>
        <xsl:variable name="testcaseclassname"><xsl:value-of select= "FullName"/></xsl:variable>
        <testcase name="{$testcasename}" classname="{$testcaseclassname}">
            <xsl:if test="@Status = 'passed'">
            </xsl:if>
            <xsl:if test="@Status = 'failed'">
                <error type="error"><xsl:value-of select="Results/Measurement/Value/text()" /></error>
            </xsl:if>
            <xsl:if test="@Status = 'notrun'">
                <skipped><xsl:value-of select="Results/Measurement/Value/text()" /></skipped>
            </xsl:if>
        </testcase>
    </xsl:template>

</xsl:stylesheet>

最後に、「JUnitテスト結果の公開」(または同様のバージョンはフランス語)をチェックし、xmlパスを次のように設定します。build_32/JUnitTestResults.xml

まあ、それは醜いです。しかし、それでも、これが誰かに役立つことを願っています。そして改善は大歓迎です(Pythonからctestを実行するかもしれませんか?Cの代わりにPythonプラグインのパスを使用します:...?)

于 2011-06-13T10:28:03.253 に答える
0

これは最近jenkins-ciに統合されているようです:

于 2021-04-14T10:14:32.423 に答える