Jenkins結合.net平台工具之Opencover


首先先介紹一下Opencover是什么,Opencover是.net平台下用於生成單元測試覆蓋率報告的一款軟件,是.net平台下為數不多的一款免費覆蓋率報告工具,類似的工具還有Jetbrains的dotcover以衣VisualStudio自帶的單元測試覆蓋率工具,dotcover是付費軟件,visualStudio自帶的單元測試覆蓋率報告工具僅限於在VisualStudio中使用,無法與Jenkins結合實現自動化,並且它只集成在企業版里面,社區版里是沒有這個功能的.

以下是Opencover的github倉庫地址

https://github.com/OpenCover/opencover

下面講解一下如何使用Opencover生成單元測試覆蓋率報告.

這里我們仍然基於上一節的項目,這里需要引入另一個Nuget包,opencover

添加引用完成以后項目的packages目錄下面有這樣一個目錄packages\OpenCover.xxx \tools(xxx為版本號)下面有一個OpenCover.Console.exe文件,它是我們與Jekins結合生成單元測試代碼覆蓋率報告要使用到的.

 

單元測試代碼覆蓋率報工具,顧名思義它是對單元測試進行分析生成報告的工具,因此它是依賴於單元測試的,我們使用的是Nunit,上一節我們通過命令生成了單元測試,這里我們把上一節的命令寫成一個bat批處理文件,以供opencover.console.exe調用

代碼如下

"E:\personal project\newTest2018\ConsoleApp1\packages\NUnit.ConsoleRunner.3.8.0\tools\nunit3-console.exe" "E:\personal project\newTest2018\ConsoleApp1\NunitTest\bin\Debug\NunitTest.dll" --work:"E:\personal project\newTest2018\ConsoleApp1\NunitTest\bin\Debug"

這里需要注意的是請不要復制上面的路徑,而是根據自己的實際情況(Nunit控制台工具所在位置,要進行的項目生成的dll所在位置以及工作目錄)

我們把這個bat命名為runnuit.bat(注意名稱可以隨便起,不必和示例一樣)

我們把opencover要執行的命令也放在bat文件里,這里命名opcover.bat

"C:\Users\tylerzhou\.nuget\packages\opencover\4.6.519\tools\OpenCover.Console.exe" -target:"E:\personal project\newTest2018\ConsoleApp1\NunitTest\bin\Debug\runnuit.bat" -targetargs:"/nologo /noshadow" -targetdir:"E:\personal project\newTest2018\ConsoleApp1\NunitTest\bin\Debug" -register:"user" -filter:"+[NunitTest*]*" -output:"E:\personal project\newTest2018\ConsoleApp1\NunitTest\bin\Debug\results.xml"

這里對以上代碼的關鍵部分進行說明:首先第一個空格前是Opencover.Console.exe文件所在的位置,用於執行它. Target是它要運行的單元測試命令目標,是一個批處理文件,我們使用剛才創建的runnuit.bat文件(這里我們都使用的是絕路徑,以防對Jenkins不熟悉造成各種不必要麻煩).targetdir則為工作目錄, output用於指定生成的覆蓋率報告文件所在的位置. –filter用於過濾要進行單元測試覆蓋的結果.如果不指定,它會對加載的Nunit庫里的代碼也進行覆蓋率測試,這不是我們想要的.我們目前只測試了NunitTest.dll這個文件,大家可以把它替換為自己的文件名.

 

下面我們新建一個名為OpencoverTest的freestyle項目,在Build欄里添加一個windows batch command步驟,然后在命令里面指定本地opcover.bat文件所在路徑.

需要注意的時你可能看到我們實際上創建了兩個bat,一個是runnuit.bat另一個是opcover.bat這里我們並沒有在步驟里面添加runnuit.bat這是因為opcover.bat的target參數里面引用了它,當opcover.bat執行的時候會先執行runnuit.bat.

添加命令以后,我們點擊保存,然后執行Build Now.

如果配置成功,則將會生成一條成功構建記錄.下面介紹一個坑:

如果你仔細查看Console Out,會發現有如下類似語句

其中Results(nunit3)saved as TEstResult.xml是runnuitt.bat生成的日志文件,下面是opcover生成的,可以看到是No Resultsxxxxx

如果你在本地執行opcover.bat則報告和在Jenkins上生成的是不一樣,本地是能成功執行的.這個問題經歷了一翻折騰才解決.原因在於opcover在生成代碼覆蓋率報告的時候,要訪問本地dll和pdb文件,

在本地執行的時候注冊-register user是ok的,到了jenkins環境中卻權限不足,猜測可能是Jenkins執行環境用戶和本地默認執行可執行文件時的用戶是不同的.用於對windows權限不是太清楚,這里僅是猜測.

下面說一下解決辦法:

以管理員身份打開cmd,然后執行regsvr32 "E:\personal project\newTest2018\ConsoleApp1\packages\OpenCover.4.6.519\tools\x86\OpenCover.Profiler.dll"

需要注意的是OpenCover.Profiler.dll"在所在項目的packages目錄下的opcoverxxx\tools目錄下,大家的項目絕對路徑可能和我的不一樣,不要復制.

執行以上操作成功后會有彈窗提示成功.

然后打開Jenkins再次執行Build now,查看console out,將會看到類似如下日志

此時已成功生成報告.我們打開本地生成的results.xml就可以看到opencover生成的報告了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM