单元测试输出和项目结构建议--- CMake + Google测试框架

问题描述:

我是新来的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文件,所以我只需要在一个地方添加单元测试来生成可执行文件,而且如果我可以避免的话,我不想记住将它添加到第二个地方它。有没有人有这方面的经验?

非常感谢。

  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

在这里,我example。我已经将它作为我的开发团队的简短指南。也许你会发现它也很有用。

+0

我喜欢这个例子很简单。但是,gtest团队目前的指导意见是将gtest源代码包含在内。任何这样做的例子? –

+0

是的。我知道这个变化。将尽快检查并相应更新。 –

+0

@KurtSchwehr我已经开始实施新方法,并最终在这里找到解决方案http://*.com/questions/9689183/cmake-googletest。将按照上面的答案建议进行更新。 –