簡體   English   中英

CMake + Boost測試:忽略無法構建的測試

[英]CMake + Boost test: ignore tests that fail to build

我們有一個C ++項目,在Boost / Test中實現了相對大量的測試套件。 所有測試都保留在主項目的樹中,每個測試套件都位於單獨的.cpp文件中。 因此,我們當前用於測試的CMakeLists.txt如下所示:

cmake_minimum_required(VERSION 2.6)

project(TEST_PROJECT)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)

set(SPEC_SOURCES
    main.cpp
    spec_foo.cpp
    spec_bar.cpp
    ...
)

set(MAIN_PATH some/path/to/our/main/tree)    
set(MAIN_SOURCES
    ${MAIN_PATH}/foo.cpp
    ${MAIN_PATH}/bar.cpp
    ...
)

add_executable (test_project
    ${SPEC_SOURCES}
    ${MAIN_SOURCES}
)

target_link_libraries(test_project
    ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)

add_test(test_project test_project)

enable_testing()

它可以正常工作,但是問題是SPEC_SOURCESMAIN_SOURCES是相當長的列表,有時有人會破壞主樹或spec源文件之一中的某些內容。 反過來,這使得無法構建目標可執行文件並測試其余部分。 必須手動找出損壞的部分,進入CMakeLists.txt並注釋掉無法編譯的部分。

因此, 問題是:有沒有辦法忽略那些無法在CMake中自動構建的測試,編譯,鏈接並運行其余的測試(理想情況下,將失敗的測試標記為“構建失敗”)?

遠程相關問題使用 CMake中的try_compile命令建議使用Boost測試和不應編譯的測試的最佳實踐 但是,它僅以裸露的形式執行新生成的臨時生成的CMakeList(它將像原始的那樣失敗),並且沒有任何鈎子來刪除不可編譯的單元。

我認為您的測試方法存在一些問題。

必須手動找出損壞的部分,進入CMakeLists.txt並注釋掉無法編譯的部分。

如果您具有良好的單元測試覆蓋率,那么您應該能夠真正快速地識別和定位問題。 持續集成(例如Jenkins,Buildbot,Travis(GitHub))可能會非常有幫助。 他們將運行您的測試,即使某些開發人員在提交之前沒有這樣做。

另外,您還假定非編譯類(及其測試)僅需從構建中刪除。 但是傳遞依賴呢?傳遞非依賴性類會導致非編譯類中斷其他類的編譯或導致鏈接錯誤。 破壞構建的測試又如何呢? 所有這些事情都是在開發過程中發生的。

我建議您將構建分為許多庫,每個庫都有自己的測試運行器。 將所有內容放在一起(內聚)。 還要盡量減少編譯中的依賴性(依賴性注入,接口等)。 即使某些庫(一段時間)沒有編譯,這也將通過編譯庫和測試運行程序來保持開發的進行。

我猜您可以為每個規范源創建一個測試可執行文件(使用foreach() loop ),然后執行以下操作:

make spec_foo &&  ./spec_foo

這只會嘗試構建與要運行的測試匹配的二進制文件

但是,如果您的構建經常失敗,則可能表明生產代碼中的某些不良設計...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM