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

Lan*_*don 19 cmake googletest

我是CMake的新手,我正在使用Google Test Framework.我已经找到了将CMake和Google测试框架结合起来的更复杂的例子,但我没有太多运气.我希望有人可以就我到达的设置提出他们的意见并为我回答一个问题.这是基本的项目结构:

ProjectFolder
-CMakeLists.txt
/ build
/ include- all
  我的.h文件
/ src
  -CMakeLists.txt-
  所有我的.cpp文件
/测试
  -CMakeLists.txt
  / gtest
    -Google的CMakeLists.txt
  / mocks
    -CMakeLists.txt
    -cpp和h模拟文件

简而言之,根cmake文件将src和tests作为子目录添加.src cmake文件将cpp文件复制到库中.测试cmake文件添加了mocks和gtest作为子目录.模拟cmake文件将其所有cpp文件复制到第二个库中.最后,tests文件夹中的cmake文件将src库,google库和mocks库与单元测试可执行文件链接起来.

我最终得到的是几个可执行文件:objA_unittest,objB_unittest等

一些东西:

  1. 要构建所有这些并仍然保持我的项目目录相当干净我进入构建文件夹并运行"cmake .."这似乎工作得很好,我计划配置vim以始终运行make这个文件夹.有没有人有这方法的任何提示或看到任何问题?

  2. 我不喜欢在我的项目文件夹中嵌入谷歌库的想法(特别是如果我最终有几个项目使用它),但是因为它似乎强烈建议您不要预编译谷歌库我可以看到没办法解决这个问题.但是,如果有人知道更好的方式,我很乐意听到它.

  3. 运行测试.我喜欢我所要做的就是运行"make test"来用ctest执行我的所有单元测试.但是,我发现我不太喜欢输出.每个单元测试可执行文件包含几个不同的单 直接运行这些提供了Google非常详细的反馈.如果可执行文件中的某个测试失败,我确切知道测试失败的原因和原因.以前,我使用了makefile,在makefile的末尾我只执行了所有的测试.我首先尝试通过在cmake中创建自定义构建目标来解决此问题.但是,它只执行第一个命令.我要么需要一种方法来从CTest获得更详细的输出,或者我需要一种方法来自动输出bash脚本或类似于CMake的东西来执行每个单元测试可执行文件.换句话说,我现在已经设置了cmake文件,所以我只需要在一个地方添加单元测试来生成可执行文件,我不想记得将它添加到第二个位置,如果我能避免的话它.有没有人有这方面的经验?

首先十分感谢.

Ser*_*lov 12

这是我的例子.我已经把它作为我的开发团队的简短指南.也许你会发现它也很有用.


And*_*aev 11

  1. 它实际上是一种被称为源外构建的推荐cmake实践
  2. AFAIK建议不要在系统中安装重新编译的googletest库.因此,如果您将其编译为共享或静态库作为项目构建的一部分,那么应该没有任何问题.我在这种方式下使用googletest 1.6.0在Windows,Linux,OSX和Android上没有问题.
  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()
Run Code Online (Sandbox Code Playgroud)

接下来为每个测试添加一行以将测试附加到test目标:

#add_executable(mytest ${mysources})
run_test(mytest)
Run Code Online (Sandbox Code Playgroud)

  • 注意:已经有一个名为'test'的预定义CMake目标.通常不建议添加具有相同名称的自定义目标.您也可以在现在调用"make test"的同一目录中调用"ctest -V"或"ctest -VV",它将运行完整的测试套件*并*显示所有测试的输出.(-V ==详细,-VV ==非常详细) (3认同)