[英]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_SOURCES
和MAIN_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.