顯示具有 Jenkins 標籤的文章。 顯示所有文章
顯示具有 Jenkins 標籤的文章。 顯示所有文章

C++單元測試(13) - OpenCppCoverage指令快速參考

沒有留言:
Command-line 參考

翻譯自
原文最後編譯時間 9月7日的上午04時23分 by OpenCppCoverage, version 15

You can display a quick reference with -h or --help as command line argument:
指令加上 -h 或 --help 參數,可以取得顯示一份快速參考


用法: [options] -- program_to_run optional_arguments:
Command line only:
  -v [ --verbose ]      詳細模式.
  -q [ --quiet ]        安靜模式.
  -h [ --help ]         顯示說明訊息.
  --config_file arg     Filename of a configuration file.

Command line and configuration file:
  --modules arg (=*)        添加要加入的模組路徑。可以多筆。
  --excluded_modules arg    添加要排除的模組路徑。可以多筆。
  --sources arg (=*)        添加要加入的程式碼路徑。可以多筆。
  --excluded_sources arg    添加要排除的模組路徑。可以多筆。
  --input_coverage arg      加上一個export_type=binary的路徑,
                            指定的檔案會合併到目前的覆蓋率輸出檔。可以多筆。
  --export_type arg (=html) 格式: <產出檔案類型>:<產出檔案路徑>.
                            <產出檔案類型> 可以是二進制檔、cobertura, html
                            <產出檔案路徑> (非必要) 存放產出檔案的資料夾路徑。
                            例如: html:MyFolder\MySubFolder 
                            可以多筆。
  --working_dir arg         程式的工作目錄
  --cover_children          Enable code coverage for children processes.
  --no_aggregate_by_file    Do not aggregate coverage for same file path.

C++單元測試(11) - OpenCppCoverage可視化單元測試的覆蓋率, Jenkins顯示Report

沒有留言:
這一次,我們來討論一下,如何將unit test的成果可視化,也就是常見的覆蓋率(Coverage rate)。

我們採用的環境如下
Visual Studio + git + CppUnit + Jenkins + OpenCppCoverage

這樣一來,在Visual Studio寫好的code提交到git後,Jenkins會輪詢git,若改版就抓一版過來;li 呼叫MSBuild編譯,編譯好就編譯CppUnit,然後執行CppUnit編好的執行檔,產生單元測試的Report,之後再執行cppcheck,產生Report,最後執行這一次的主角OpenCppCoverage,產生Report。

條列式的呈現,如下

  1. Visual Studio寫好的code提交到git後
  2. Jenkins會輪詢git,若改版就抓一版過來
  3. 呼叫MSBuild編譯主程式+編譯CppUnit
  4. 執行CppUnit編好的執行檔,產生單元測試的Report
  5. 執行cppcheck,產生Report
  6. 執行OpenCppCoverage,產生Report。

第六步,是我們今天討論的內容。

下載軟體

官方網站下載OpenCppCoverage。
安裝到Jenkins的主機上(可以先安裝在自己的電腦先測試,執行成功再裝在Jenkins的主機上)

準備Command

參考官網的文件,上面的訊息就足夠了。
自己本機測試,可以使用這樣的command
OpenCppCoverage --sources <souce code的路徑> -- <你的單元測試程式.exe> 
可以參考這篇,Jenkins上,則要這樣寫(加上--export_type=cobertura)
OpenCppCoverage --sources <souce code的路徑> --export_type=cobertura -- <你的單元測試程式.exe>

安裝Jenkins外掛

安裝Cobertura plugin

可能會遇到的問題

為什麼報表都沒有值?(Xml是空的?)

因為,需要.pdb檔。
建議使用debug模式編譯,因為除了.pdb檔本來就應該在debug模式產生之外,最好不要將code最佳化,造成無法辨別.pdb內容的情況。

所以,我在Jenkins上的設定,分別設定兩個job,一個是release編譯,一個是debug編譯。等debug編好,就執行unit test、coverage、static code analysis...,通通成功了,再編譯release。

實例

為了方便瀏覽,在此有用斷行,真正使用的指令,無需斷行,但是要加空白。
OpenCppCoverage --sources <產品程式碼路徑>
--excluded_sources <前置編譯路徑>
--excluded_sources <前置編譯.lib的.h檔 路徑>
--excluded_sources <單元測試路徑>
--excluded_sources <使用.dll, .lib檔的.h檔 路徑>
--excluded_sources <其它編譯完, 編譯器幫你用到的檔案路徑>
-- <單元測試達行檔>

Jenkins的C++ 靜態程式碼分析 Cppcheck

沒有留言:
Jenkins加上靜態程式碼分析程式,真的是很棒的一件事。
所以,我也要來加!

因為我寫的是C++所以,選用了一個適合C++的程式碼分析程式 - Cppcheck
其實還有很多工具可以使用。
不過因為看見一篇文章[1]介紹,操作起來比SourceMonitor更加簡單好用,UI介面只要按一個鍵就開始分析了!哇呼!有沒有這麼簡單?!
但是其實兩個程式,不太一樣啦!
  • Cppcheck是分析編譯器無法做到的事。
  • SourceMonitor是分析程式碼複雜度之類的事。

Jenkins的git log的中文出現亂碼

沒有留言:
首先我要強調的是,git log盡量不要打中文!XD

好!接下來,來介紹一下怎麼解決中文的問題。
先說說有一個指令。

$git config --global i18n.logOutputEncoding <編碼方式>

這個指令,可以設定log輸出的編碼方式是要utf-8?還是要big5?還是別的。


一開始,我想說Jenkins的網頁,都嘛utf8,所以輸出成utf8吧!
結果一直都亂碼,無法解決,也覺得我是不是漏設定了什麼。

有一天,我想到了一個測試的方式。
看看是怎麼回事。

$git log >> gitlog.txt

將git的log輸出成檔案。再用文字編輯器去開。就可以知道它是不是我想要的編碼方式啦!
我使用的文字編輯器是windows提供的WordPad,它....開啟utf8,是亂碼!= =

Oh~

怎麼和Jenkins一樣呢?

用big5顯示

讓Git log輸出log的編碼為big5

就把輸出log的編碼改成big5
結果WordPad開,是正常的!= =

所以要在Jenkins的繁體中文介面顯示正常的git log內容。請用這個設定

$git config --global i18n.logOutputEncoding big5


用UTF8顯示[1]

改Jenkins用的Java字集為UTF8

以系統管理員身分
  1. 開啟命令提示字元視窗
  2. X:\SETX /M JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8
  3. 開啟Git Bash
  4. $git config --global i18n.logOutputEncoding utf8
  5. 重新啟動Jenkins


參考資料
[1] Jenkins on Windows 心得分享 (03):有效避免記錄檔或訊息出現亂碼的方法

C++單元測試(9) - CppUnit輸出Xml, Jenkins顯示Report

沒有留言:
這次的標題,下得很「關鍵字」
這次的故事是這樣的,使用CppUnit單元測試框架,使用Jenkins的CI系統+xUnitTest的plug-in。

要讓CppUnit輸出Xml,再讓xUnitTest的plug-in吃到Xml,在Jenkins上顯示。

第一步,就是先看單元測試專案的main怎麼改[1]

int main()
{
    CppUnit::TestResult testresult;
    CppUnit::TestResultCollector collectedresults;
    testresult.addListener (&collectedresults);

    CppUnit::TextUi::TestRunner runner;
    CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();
    runner.addTest( registry.makeTest() );
    runner.run(testresult);

    std::ofstream xmlFileOut("CppUnitTestDmServerResults.xml");
    CppUnit::XmlOutputter xmlOut(&collectedresults, xmlFileOut);
    xmlOut.write();

    return 0;
}

主要就是要讓 testresult 放進 runner.run(testresult) 參數中。
這樣Xml輸出就會有東西了。

接下來就是設定Jenkins。

Jenkins加上xUnitTest的plug-in很多文章都有寫。就不多說了。
進入你Job的設定裡
要注意的如下

  1. 建置時要建置單元測試專案
  2. 建置後要執行單元測試的執行檔。(輸出xml)
  3. xUnitTest的plug-in要吃的,也只是xml檔。

建置時要建置單元測試專案

在Visual Studio上,就是要設定.sln檔,在某種Config時,是不是會建置呢?(要把單元測試的專案打勾唷)

建置後要執行單元測試的執行檔。

在Jos的建置,加上一個「執行Windows批次指令」,執行單元測試執行檔。
(當然如果你是Linux系統,就要加一個「執行Shell」)

xUnitTest的plug-in要吃的,也只是xml檔。

在Jos的建置後動作,加上Publish xUnit test result report
在裡面再加上一個CppUnit-1.12.1 (default)
其中Pattern的欄位,填入單元測試專案的xml路徑檔名

剩下的就照說明填囉~


參考資料: [1] Using Hudson for C++/CMake/CppUnit - Posted by volkerkaiser