2011-06-13 65 views

回答

14

在詹金斯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是在C進行build目錄插件
  • Tests是子目錄哪裏了所有的考試生活
  • -T Test使得CTEST輸出XML(?!)
  • verify >nul將errorlevel重置爲0,因爲如果有任何測試失敗,則Jenkins將返回> 0,這表示Jenkins將其解釋爲「整個構建失敗」,我們不想要
  • 最後一行將CTest的XML轉換爲最小 JUnit xml。 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,direct link
  • 它有兩個參數,目錄中的測試live(在build目錄中)和一個xsl文件
  • 它只是讀取最後的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可能嗎?使用Python插件的路徑而不是C:...?)

+0

非常感謝此解決方案。我目前正在玩它,它基本上適合我。 – MOnsDaR 2011-07-01 22:50:42

+5

我增強了您的XSL代碼以支持CTest XML輸出的更多功能:http://pastebin.com/GAj7Fzqd它現在增加了測試的執行時間,如果發生錯誤,它將errortype和errorcode添加爲信息。請評論是否有其他可添加到生成的JUnit-File的其他內容。 – MOnsDaR 2011-07-02 10:46:28

+1

新版本支持 -JUnit標籤並另外將屬性存儲爲系統輸出(因此可以在Jenkins中看到它們):http://pastebin.com/3mQ2ZQfa – MOnsDaR 2011-07-02 12:13:38