今天咱们来讲说,CMake 测试。php
不过,其实咱们仍是在说 C++ 的测试。git
CMake 给咱们提供了完善的测试支持,好比它有一个专门的模块 CTest。github
CMake 原生支持的测试很简单,只有两个函数:框架
enable_testing() add_test(NAME <name> COMMAND <command> [<arg>...] [CONFIGURATIONS <config>...] [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS])
这个用法,简单来讲,就是你须要先实现一个能够接受输入参数的可执行程序,用 add_executable
就能够,不用管这个可执行程序的存放目录,CMake 会帮你自动填上。函数
enable_testing() add_executable(test_example test.cpp) target_link_libraries(test_example example_lib) add_test(NAME test_example1 COMMAND test_example --arg1=a --arg2=b) add_test(NAME test_example2 COMMAND test_example --arg1=c --arg2=d)
而后,经过 add_test
注册你的测试用例后,就完成了准备,以后就能够在编译完成后,用如下三种方式来运行来运行测试用例。gitlab
make test
cmake --build . --target test
ctest
固然了,你也能够用 CTest 来结合 CDash 一块儿使用,CDash 就是一个能够记录测试日志的地方,你能够去 https://my.cdash.org/index.php 一探究竟,通常来讲,项目大了以后就会有这方面的需求。单元测试
除了上面的 ctest,咱们还有强大的 GoogleTest,这是目前用得比较普遍的 C++ 测试框架。不一样于上面须要本身实现测试框架逻辑、解析参数,GoogleTest 提供了测试框架,以及 Mock。测试
CMake 也提供了 GoogleTest 的支持:ui
gtest_add_tests(TARGET target [SOURCES src1...] [EXTRA_ARGS arg1...] [WORKING_DIRECTORY dir] [TEST_PREFIX prefix] [TEST_SUFFIX suffix] [SKIP_DEPENDENCY] [TEST_LIST outVar] )
它是用来取代 add_test
的,经过扫描源代码,它就能读出全部的测试用例,省却了两边重复写的问题,可是它有个问题:一旦测试用例改变,它就须要从新跑 cmake,否则没法知道改变后的测试用例。google
所以,CMake 自从 3.10 提供了新的方法:
gtest_discover_tests(target [EXTRA_ARGS arg1...] [WORKING_DIRECTORY dir] [TEST_PREFIX prefix] [TEST_SUFFIX suffix] [NO_PRETTY_TYPES] [NO_PRETTY_VALUES] [PROPERTIES name1 value1...] [TEST_LIST var] [DISCOVERY_TIMEOUT seconds] )
相比较于 gtest_add_tests
,gtest_discover_tests
是经过获取编译后的可执行程序里面的测试用例来达到注册的目的,所以会更鲁棒,在测试用例改变的状况下,不须要从新运行 cmake(其实原理也不神奇,你用编译后的程序运行时加上 --gtest_list_tests
参数就明白了)。
使用也很简单,在有 GoogleTest 依赖存在的状况下(不知道的须要复习前两篇文章的内容),经过 find_package
引入依赖。
enable_testing() include(GoogleTest) find_package(GTest 1.10.0) add_executable(test test.cpp) target_link_libraries(test GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main) gtest_discover_tests(test)
至于 GoogleTest 自己,也就是看文档写测试用例了(有兴趣的能够留言,有机会我另外写一篇),另外,我以前在 Golang 中的测试 也提到过该如何写单元测试,其实在这里道理也是同样的,结合 GoogleTest 提供的 Mock,咱们写单元测试能够变得很简单。
感谢阅读,本文首发于 Github issues: https://github.com/xizhibei/b... (Star 以及 Watch 强烈暗示 :P);另外这篇文章也能在本人博客内阅读:https://blog.xizhibei.me/2020... 。
本文采用 署名-非商业性使用-相同方式共享(BY-NC-SA)进行许可。