自動テストにCTest(CMakeの一部)を使用しています。
JenkinsダッシュボードでCTestの結果を取得するにはどうすればよいですか?または、言い換えると、CTestをJUnitのようなXMLで出力するにはどうすればよいですか?
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_32
CMakeプラグインのビルドディレクトリですTests
すべてのテストが存在するサブディレクトリです-T Test
CTestをXMLで出力します(?!)verify >nul
エラーレベルを0にリセットします。これは、テストが失敗した場合にCTestが> 0を返すためです。これは、Jenkinsが「ビルド全体が失敗した」と解釈します。これは望ましくありません。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)
Testing/TAG
ファイルの最初の行にあるため、追加のfopenxslは次のようになります。それはかなり最小限ですが、仕事を成し遂げます:[編集] 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プラグインのパスを使用します:...?)
これは最近jenkins-ciに統合されているようです: