Parasoft C/C++ test 自動(dòng)化用戶指南(十九):與 CppUnit 和 CppUtest 集成
Parasoft C/C++test針對(duì)C/C++開(kāi)發(fā)的專業(yè)白盒自動(dòng)化測(cè)試方案,能有效提高軟件開(kāi)發(fā)效率和代碼質(zhì)量。C++test 可以進(jìn)行靜態(tài)分析,全面代碼審查,運(yùn)行時(shí)錯(cuò)誤檢測(cè),并在單元測(cè)試和組件測(cè)試中集成覆蓋率分析。
Parasoft C/C++test申請(qǐng)免費(fèi)試用
Parasoft C/C++test 允許您運(yùn)行在單元測(cè)試工具中創(chuàng)建的單元測(cè)試并將結(jié)果報(bào)告給 DTP。
Parasoft C/C+test 可以將使用 CppUnit 和 CppUtest 執(zhí)行的測(cè)試的結(jié)果發(fā)送到 DTP 服務(wù)器,以及將測(cè)試與代碼覆蓋率相關(guān)聯(lián)。要將 CppUnit 或 CppUtest 與 C/C++test 集成,需要將結(jié)果偵聽(tīng)器和覆蓋注釋器安裝到現(xiàn)有的 CppUnit 或 CppUtest 基礎(chǔ)結(jié)構(gòu)中
典型的集成包括結(jié)果偵聽(tīng)器和覆蓋注釋器,它們?yōu)槟峁┯嘘P(guān)測(cè)試結(jié)果和覆蓋的完整信息。您可以選擇僅安裝結(jié)果偵聽(tīng)器以進(jìn)行輕量級(jí)測(cè)試或比較有覆蓋和無(wú)覆蓋的結(jié)果。
將 C/C++test 安裝到測(cè)試設(shè)置中
本節(jié)描述了 CppUnit 和 CppUtest 設(shè)置以及結(jié)果偵聽(tīng)器和覆蓋率注釋器。如果您選擇僅安裝結(jié)果偵聽(tīng)器,請(qǐng)?zhí)^(guò)所有提及覆蓋注釋器的行。
將 C/C++test 安裝到 CppUnit 安裝程序中
1、在包含 CppUnit 主函數(shù)的源文件中包含一個(gè)專用的頭文件:
#include "cpptest/extensions/cppunit/results_listener.h" #include "cpptest/extensions/cppunit/coverage_annotator.h"
2、安裝結(jié)果監(jiān)聽(tīng)器。安裝細(xì)節(jié)將取決于您用來(lái)執(zhí)行單元測(cè)試的 CppUnit 框架的 TestRunner 類。對(duì)于簡(jiǎn)單的設(shè)置,您修改后的 main 函數(shù)可能類似于以下內(nèi)容:
/* required header files */ int main() { CPPUNIT_NS::Test *suite = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest(); CPPUNIT_NS::TextUi::TestRunner runner; runner.addTest( suite ); CppTest_CppUnitResultsListener cpptestResListener; CppTest_CppUnitCoverageAnnotator cpptestCovAnnotator; runner.eventManager().addListener( &cpptestResListener ); runner.eventManager().addListener( &cpptestCovAnnotator ); runner.setOutputter( new CPPUNIT_NS::CompilerOutputter( &runner.result(), std::cout)); bool wasSucessful = runner.run(); return wasSucessful ? 0 : 1;
根據(jù)使用的類,修改的安裝可能會(huì)有所不同。下面的示例顯示了 CppUnit 框架的兩個(gè)類的安裝。CppUnit::TestRunner 類的安裝:
CppUnit::TestResult controller; CppTest_CppUnitResultsListener cpptestResListener; CppTest_CppUnitCoverageAnnotator cpptestCovAnnotator; controller.addListener( &cpptestResListener ); controller.addListener( &cpptestCovAnnotator ); CppUnit::TestRunner runner; runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest() ); runner.run( controller, testPath );
CppUnit::TextTestRunner 類的安裝:
CppUnit::TextTestRunner runner; CppTest_CppUnitResultsListener cpptestResListener; CppTest_CppUnitCoverageAnnotator cpptestCovAnnotator; runner.eventManager().addListener(&cpptestResListener); runner.eventManager().addListener(&cpptestCovAnnotator);
3、修改您的構(gòu)建系統(tǒng)配置以使用以下-I選項(xiàng)指定 results_listener.h 頭文件位置:
-I<C++test Installation Directory>/runtime/include
將 C/C++test 安裝到 CppUtest 安裝程序中
-
在包含 CppUtest 主函數(shù)的源文件中包含一個(gè)專用頭文件。
#include "cpptest/extensions/cpputest/results_listener.h"#include "cpptest/extensions/cpputest/coverage_annotator.h"#include "cpptest/extensions/cpputest/test_runner.h" -
安裝結(jié)果監(jiān)聽(tīng)器。安裝需要將覆蓋注釋器和結(jié)果偵聽(tīng)器注冊(cè)到 TestRegistry 類中。它還需要使用 C++test 提供的 TestRunner。
對(duì)于簡(jiǎn)單的設(shè)置,您修改后的 main 函數(shù)可能類似于以下內(nèi)容:/* required header files */int main(){// Register C++Test cpputest pluginsTestRegistry* registry = TestRegistry::getCurrentRegistry();TestPlugin* coverageAnnotator = new CppTest_CppUtestCoverageAnnotator();registry->installPlugin(coverageAnnotator);TestPlugin* resultsListener = new CppTest_CppUtestResultsListener();registry->installPlugin(resultsListener);// run the testsint result = CppTest_CppUtestTestRunner::RunAllTests(ac, av);delete coverageAnnotator;delete resultsListener;return result; -
修改您的構(gòu)建系統(tǒng)配置以使用以下 -I選項(xiàng)指定 results_listener.h 頭文件位置:
-I<C++test Installation Directory>/runtime/include
報(bào)告 CppUnit 和 CppUtest 測(cè)試結(jié)果
結(jié)果偵聽(tīng)器可以記錄單元測(cè)試執(zhí)行結(jié)果并將數(shù)據(jù)存儲(chǔ)在文件中。默認(rèn)情況下,執(zhí)行結(jié)果存儲(chǔ)在當(dāng)前工作目錄的 cpptest_results.utlog 文件中。您可以通過(guò)將路徑作為參數(shù)提供給 CppTest_CppUnitResultsListener (CppUnit) 或 CppTest_CppUtestResultsListener (CppUtest) 構(gòu)造函數(shù)來(lái)更改默認(rèn)文件位置:
-
對(duì)于 CppUnit
CppTest_CppUnitResultsListener cpptestResListener("c:/myworkspace/cpptest_results.utlog"); -
對(duì)于 CppUtest
CppTest_CppUtestResultsListener cpptestResListener("c:/myworkspace/cpptest_results.utlog");
或者,您可以使用以下定義在測(cè)試工具構(gòu)建過(guò)程中指定位置:
-DCPPTEST_UT_LOG_FILE=\"c:/home/my_workspace/cpptest_results.utlog\"
|
如果您選擇更改默認(rèn)文件位置,請(qǐng)務(wù)必保留.utlog文件擴(kuò)展名。
一旦構(gòu)建了帶有結(jié)果偵聽(tīng)器的測(cè)試可執(zhí)行文件,您就可以執(zhí)行預(yù)定的單元測(cè)試。在標(biāo)準(zhǔn)設(shè)置中,測(cè)試執(zhí)行期間生成的 cpptest_results.utlog 文件將放置在包含可執(zhí)行文件的目錄中。如果修改了文件路徑,文件將在指定位置創(chuàng)建。
單元測(cè)試執(zhí)行結(jié)果可以發(fā)布到 DTP 服務(wù)器或可以使用以下命令行生成本地報(bào)告:
cpptestcli -config "builtin://Unit Testing" -input <result_filename>.utlog -publish -report local_report
|
單元測(cè)試執(zhí)行結(jié)果通常與代碼覆蓋率結(jié)果相結(jié)合。
將測(cè)試與代碼覆蓋率相關(guān)聯(lián)
您可以使用測(cè)試開(kāi)始/停止信息自動(dòng)注釋代碼覆蓋率結(jié)果。這允許您有選擇地分析由特定測(cè)試或一組測(cè)試生成的代碼覆蓋率。將測(cè)試與代碼覆蓋率相關(guān)聯(lián)需要安裝覆蓋率結(jié)果注釋器和結(jié)果偵聽(tīng)器,以及 C/C++test。
覆蓋注釋器將特殊標(biāo)記添加到代碼覆蓋結(jié)果流中。這些標(biāo)記界定了每個(gè)測(cè)試用例的覆蓋結(jié)果。覆蓋注釋器將標(biāo)記添加到覆蓋結(jié)果文件中,該文件由 C/C++test 管理。注釋器不需要任何輸入?yún)?shù)。
一旦安裝了帶有結(jié)果偵聽(tīng)器的測(cè)試可執(zhí)行文件,您就可以執(zhí)行預(yù)定的單元測(cè)試。在標(biāo)準(zhǔn)設(shè)置中,在測(cè)試執(zhí)行期間生成的 cpptest_results.clog 文件和 cpptest_results.utlog 文件將放置在當(dāng)前工作目錄中。
運(yùn)行以下命令以生成本地報(bào)告并啟用對(duì) DTP 服務(wù)器上的代碼覆蓋率的選擇性分析:
cpptestcli -config "builtin://Unit Testing" -input cpptest_results.utlog -input cpptest_results.clog -publish -report local_report
|
Parasoft——領(lǐng)先的自動(dòng)化測(cè)試工具,滿足絕大多數(shù)行業(yè)標(biāo)準(zhǔn)
Parasoft是一家專門提供軟件測(cè)試解決方案的公司,幫助企業(yè)打造無(wú)缺陷的軟件。
從開(kāi)發(fā)到質(zhì)量檢查,Parasoft的技術(shù)通過(guò)集成靜態(tài)和運(yùn)行時(shí)分析,單元、功能和API測(cè)試,以及服務(wù)虛擬化,在不犧牲質(zhì)量和安全性的情況下加快軟件交付,節(jié)約交付成本。
強(qiáng)大的報(bào)告和分析功能可幫助用戶快速查明有風(fēng)險(xiǎn)的代碼區(qū)域,并了解新代碼更改如何影響其軟件質(zhì)量,而突破性的技術(shù)將人工智能和機(jī)器學(xué)習(xí)添加到軟件測(cè)試中,使組織更容易采用和擴(kuò)展跨開(kāi)發(fā)和測(cè)試團(tuán)隊(duì)的有效的軟件測(cè)試實(shí)踐。
Parasoft針對(duì)C/C++、Java、.NET和嵌入式的開(kāi)發(fā)測(cè)試都有著30多年的深入研究,很多全國(guó)500強(qiáng)企業(yè)使用Parasoft的產(chǎn)品實(shí)現(xiàn)了軟件快速、高質(zhì)量的交付。
獲取Parasoft資料或申請(qǐng)?jiān)囉每杉観Q:2867205852