結(jié)合使用Parasoft C/C++test和CMake進(jìn)行單元測試
C/C++test 2020.1的更新引入了將C/C++test與CMake集成在一起以進(jìn)行靜態(tài)分析和單元測試的功能。這篇文章重點介紹如何在基于CMake的項目中使用Parasoft C/C++test進(jìn)行單元測試。(查看結(jié)合使用Parasoft C/C++test和CMake進(jìn)行靜態(tài)分析)
單元測試要集成到開發(fā)過程中要比靜態(tài)分析要復(fù)雜得多。最后,必須創(chuàng)建可執(zhí)行二進(jìn)制文件。對于由多個庫和可執(zhí)行文件組成的大型項目而言,這尤其成問題。
我們用于靜態(tài)分析的compile-info JSON文件還不夠。它沒有提供有關(guān)項目結(jié)構(gòu)的重要信息-哪些文件包含在哪些二進(jìn)制文件中,以及哪些文件應(yīng)一起進(jìn)行測試。
將單元測試集成到基于Cmake的項目中
為了使Parasoft C/C++test單元測試輕松集成到基于CMake的項目中,2020.1版本引入了CMake擴展,該擴展允許定義C/C++test的單元測試目標(biāo)。這些目標(biāo)會自動生成C/C++test項目文件,這些文件可用于創(chuàng)建,運行和維護(hù)單元測試。
此擴展旨在使用戶能夠定義Parasoft C/C++test單元測試所需的整個基礎(chǔ)架構(gòu),以及其在CMake配置文件中的常規(guī)目標(biāo)。
基于Cmake項目的單元測試示例
讓我們使用一個基于C/C++test Professional的示例(基于Eclipse的工具)來查看其工作原理,該工具具有豐富的UI。下載并安裝2020.1版本(如果尚未安裝):
按照這些步驟
在C/C++test Professional的主安裝目錄中,您可以找到帶有示例的CMake擴展。請參閱以下目錄:
對于我們的實驗,我建議將integration/cmake文件夾從安裝中復(fù)制到您的首選位置。該示例的結(jié)構(gòu)如下所示:
app文件夾包含“可執(zhí)行”目標(biāo)。具有三個子文件夾(mod1,mod2和mod3)的modules文件夾表示用于鏈接可執(zhí)行文件的靜態(tài)庫。另外,cmake文件夾包含CMake的C/C++test擴展。您可能需要將此文件夾復(fù)制到實際項目中才能使用此擴展名。
這種簡化的結(jié)構(gòu)描繪了團(tuán)隊嘗試實施單元測試工作時面臨的典型挑戰(zhàn):如何將整個項目分為可測試的塊,代表邏輯上屬于同一組的文件。
在大多數(shù)情況下,開發(fā)人員將不希望針對通過編譯整個項目中的所有文件而創(chuàng)建的一個Blob二進(jìn)制文件執(zhí)行單元測試。用戶很可能會對在項目中定義的相同二進(jìn)制目標(biāo)(可執(zhí)行文件和庫)添加測試用例感興趣。
如何為項目中定義的相同二進(jìn)制目標(biāo)添加測試用例
在討論配置語法的詳細(xì)信息之前,讓我們使用提供的示例了解其工作方式。
1.在app文件夾所在的頂級目錄中,創(chuàng)建一個構(gòu)建目錄,cd進(jìn)入該目錄,并調(diào)用生成腳本,如下所示:
2.使用生成腳本(makefile)生成CMake之后,調(diào)用make生成示例項目:
3.啟動C/C++test專業(yè)版(安裝文件夾中的cpptest可執(zhí)行文件)。選擇一個空的工作區(qū),使用“文件菜單->導(dǎo)入...->現(xiàn)有項目到工作區(qū)”,然后選擇“根目錄”作為復(fù)制示例的主文件夾。向?qū)⑦f歸掃描選定的文件夾,并找到所有自動生成的項目。如果您看到類似下面的內(nèi)容,則可以單擊“完成”。
Eclipse將導(dǎo)入所有項目,您將擁有一個新的工作區(qū),可以進(jìn)行單元測試。您無需執(zhí)行任何其他操作即可開始添加和運行測試用例,并努力提高代碼覆蓋率。
4.在項目導(dǎo)航器中,選擇所有三個項目,右鍵單擊并使用“Parasoft-> Test Using->內(nèi)置->單元測試->生成單元測試”測試配置自動生成測試用例。生成測試后,請從同一位置執(zhí)行“運行單元測試”配置。
通過這四個簡單的步驟,您就為單元測試準(zhǔn)備了項目基礎(chǔ)結(jié)構(gòu)?,F(xiàn)在,團(tuán)隊已準(zhǔn)備好開始處理測試用例。
它是如何工作的?
除了常規(guī)的構(gòu)建目標(biāo)外,CMakeLists.txt文件還包含單元測試目標(biāo)。當(dāng)使用cmake生成構(gòu)建腳本時,也會自動生成C/C++test項目文件。稍后在構(gòu)建過程中,會自動生成C/C++test項目所需的其他構(gòu)建數(shù)據(jù)文件。
定義單元測試項目的結(jié)構(gòu)所需的所有內(nèi)容都保存在CMakeLists.txt文件中。該團(tuán)隊不需要維護(hù)任何其他配置文件。一切都很好,干凈??梢詸z出項目,生成腳本和C/C++test項目,可以將測試與源代碼一起添加和檢入,并且可以在CI中執(zhí)行完整的測試。
近距離觀察
讓我們仔細(xì)看看C/C++test CMake擴展,以及它如何幫助定義測試項目基礎(chǔ)架構(gòu)。 打開modules/mod1/CMakeLists.txt文件。您應(yīng)該看到類似以下的內(nèi)容:
在前六行中,您可以看到常規(guī)目標(biāo)定義。在這里,我們定義了一個簡單的庫目標(biāo),其中包含一個源文件mod1.cpp和include文件目錄。 這就是您通常在CMake項目中看到的內(nèi)容。
在第11行中,我們有了C/C++test擴展提供的新CMake函數(shù)。此功能允許您定義單元測試目標(biāo),該目標(biāo)將生成所有必需的C/C++test項目文件。您可以在integrations/cmake/README.md中找到此功能的完整說明。在此特定示例中,完成以下操作:
- 第11行:定義了目標(biāo)名稱。默認(rèn)情況下,它將用作Eclipse項目名稱
- 第12行:為C/C++test指定了編譯器配置,以便能夠解析和檢測代碼。
- 第13行:添加了應(yīng)包含在單元測試目標(biāo)中的源文件
- 第14行:特定于目標(biāo)的包含文件位置已添加到單元測試目標(biāo)。這與您對常規(guī)目標(biāo)所做的相同。
這個簡單的目標(biāo)定義足以為Parasoft C/C++test生成單元測試項目。項目文件將在CMakeLists.txt文件的位置生成,這可能是最方便的。如果愿意,可以在源代碼樹之外生成項目文件,并避免任何合并問題。這顯示在app/CMakeLists.txt中:
- 第11行:定義了目標(biāo)名稱。默認(rèn)情況下,它將用作Eclipse項目名稱。
- 第12、13行:指定了C/C++test項目位置。在這里,我們在源代碼樹之外創(chuàng)建項目。
- 第14、15行:創(chuàng)建了一個與日食鏈接的文件夾。您需要指定文件夾的名稱和將鏈接的位置。
- 第16、17行:添加了應(yīng)該包含在單元測試目標(biāo)中的源文件
- 第19行:為單元測試目標(biāo)添加了三個庫。C/C++test在構(gòu)建測試可執(zhí)行文件時將使用這些庫。
有關(guān)更多詳細(xì)信息,請從
- README.mc
- app/CMakeLists.txt
- modules/mod1/CMakeLists.txt
- tests/cpptest_modules/CMakeLists.txt
總結(jié)
這是有關(guān)擴展的要點。
可以在以下目錄的C/C++test專業(yè)版安裝中找到CMake擴展:
要使用與C/C++test相關(guān)的擴展功能來啟用CMake,您將需要使用以下命令在CMakeLists.txt文件結(jié)構(gòu)中包括該擴展:
- 包含(cmake / cpptest.cmake)
- 請參閱integration/cmake/CMakeLists.txt中的示例。
您可以根據(jù)需要定義單元測試目標(biāo)(這會影響C/C++test項目)。您可以為可執(zhí)行文件、庫、庫的組合或文件的任意集合添加單元測試項目。
您需要確保所有必需的頭文件和庫都包含在目標(biāo)定義中。CMake的常規(guī)規(guī)則在這里適用。如果包含該庫或選項,則在全局級別設(shè)置。然后它將被包含在您的單元測試目標(biāo)中。如果您有任何特定于目標(biāo)的設(shè)置,則需要添加它們。
如果要為現(xiàn)有二進(jìn)制目標(biāo)(如庫或可執(zhí)行文件)添加單元測試目標(biāo),建議的過程是復(fù)制對原始目標(biāo)完成的所有設(shè)置。、注意:您可以將整個目標(biāo)添加到cpptest_add_executable函數(shù),該函數(shù)會將所有源文件復(fù)制到新目標(biāo)。
如果您不介意在源文件目錄中創(chuàng)建C/C++test項目文件,則這是最簡單且建議的設(shè)置。如果您希望將項目文件放置在源代碼樹之外的某個位置,則可以輕松實現(xiàn)。
您無需檢入生成的C/C++test項目文件(.project和.parasoft)。將為每個新版本重新創(chuàng)建它們。但是,您應(yīng)該檢入所有測試用例和存根。