2011-08-31 84 views
18

我是新來的CMake,我正在使用Google測試框架。我一直在尋找更復雜的結合CMake和Google測試框架的例子,但是我沒有發現很多運氣。我希望有人能夠提供他們對我所設置的設置的看法,併爲我回答一個問題。這裏是基本的項目結構:單元測試輸出和項目結構建議--- CMake + Google測試框架

ProjectFolder
-CMakeLists.txt
/建造
/包括
    - 所有我的.h文件
/src目錄
    -CMakeLists.txt
    -all我的.cpp文件
/測試
    -CMakeLists.txt
   /GTEST
        -Google的的CMakeLists.txt
    /嘲笑
        -CMakeLists.txt
        -cpp和h mocks的文件

簡而言之,根cmake文件將src和測試添加爲子目錄。 src cmake文件將cpp文件放入庫中。測試cmake文件添加mocks和gtest作爲子目錄。模擬cmake文件將其所有cpp文件放到第二個庫中。最後,tests文件夾中的cmake文件將src庫,google庫和mocks庫與單元測試可執行文件鏈接起來。

我最終得到的是一些可執行文件:objA_unittest,objB_unittest等

有幾件事情:

  1. 打造這一切,仍然保持我的項目目錄還算乾淨我的CD到構建文件夾並運行「cmake ..」這似乎工作得很好,我打算配置vim總是運行make該文件夾。有沒有人有任何提示,或看到這種方法的任何問題?

  2. 我不喜歡在我的項目文件夾中嵌套谷歌庫的想法(特別是如果我最終有幾個使用它的項目),但因爲它似乎高度建議你不要預編譯谷歌圖書館我看不出這個方法。但是,如果有人知道更好的方法,我很樂意聽到它。

  3. 運行測試。我喜歡我所要做的就是運行「make test」來用ctest執行所有的單元測試。但是,我發現我不太喜歡輸出。每個單元測試可執行文件包含幾個不同的單元測試直接運行這些提供了Google非常詳細的反饋。如果可執行文件中的某個測試失敗,我確切知道測試失敗的原因以及原因。以前,我使用了一個makefile,並且在makefile的最後我只執行了所有的測試。我首先嚐試通過在cmake中創建一個自定義構建目標來解決這個問題。但是,它只執行第一個命令。我需要一種方法來從CTest獲得更詳細的輸出,或者我需要一種方法來自動輸出一個bash腳本或類似的CMake來執行每個單元測試可執行文件。換句話說,我現在設置了cmake文件,所以我只需要在一個地方添加單元測試來生成可執行文件,而且如果我可以避免的話,我不想記住將它添加到第二個地方它。有沒有人有這方面的經驗?

非常感謝。

回答

11
  1. 它實際上是一個推薦的做法的CMake稱爲out-of-source build
  2. AFAIK不建議在系統中安裝編譯googletest庫。因此,如果將其作爲共享或靜態庫編譯爲項目構建的一部分,則不應該有任何問題。我已經在Windows,Linux,OSX和Android上使用googletest 1.6.0這種方式沒有問題。
  3. 我不確定CTest,但自定義目標絕對能夠爲您運行所有測試。這裏是一個簡短的解決方案我可以建議:

添加以下行到您的頂級CMakeLists.txt(添加任何測試前):

add_custom_target(test) 
macro(run_test test_target) 
    add_custom_target(${test_target}_runtest 
     COMMAND ${test_target} #cmake 2.6 required 
     DEPENDS ${test_target} 
     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") 
    add_dependencies(test ${test_target}_runtest) 
endmacro() 

接下來每個測試添加一行到您的測試追加到在test目標:

#add_executable(mytest ${mysources}) 
run_test(mytest) 
+3

請注意:已經有一個名爲'test'的預定義CMake目標。通常不建議添加具有相同名稱的自定義目標。你也可以在你調用「make test」的同一目錄下調用「ctest -V」或「ctest -VV」,它將運行完整的測試套件*和*顯示所有測試的輸出。 (-V == verbose,-VV ==非常詳細) – DLRdave

+0

只是FYI,我真的很感謝快速回復(以及下面的回覆)。我剛剛上學,沒有時間去測試其中的任何一個。只要我這樣做,我會選擇適當的最佳答案。只是想讓你知道我沒有忘記。 :) – Landon

11

在這裏,我example。我已經將它作爲我的開發團隊的簡短指南。也許你會發現它也很有用。

+0

我喜歡這個例子很簡單。但是,gtest團隊目前的指導意見是將gtest源代碼包含在內。任何這樣做的例子? –

+0

是的。我知道這個變化。將盡快檢查並相應更新。 –

+0

@KurtSchwehr我已經開始實施新方法,並最終在這裏找到解決方案http://stackoverflow.com/questions/9689183/cmake-googletest。將按照上面的答案建議進行更新。 –