捕获lib(单元测试)和CTest(CMake)集成

25

我正在寻找关于如何将CatchLib 成功集成到CMake测试(Ctest)中的成功案例。据我了解,这是一个额外的CMake脚本,需要解析应用程序输出?是否已有人编写过此脚本并分享过呢?

==================================================

更新(已经找到解决方案):

我已经提交了 CMake脚本 到CatchLib,用于将Catch与CTest集成。这是Fraser99的CMake脚本这里的简化版本。


1
Catch的构建系统文档中有关于CMake的讨论。 - phoenix
2个回答

44

将Catch与CMake集成非常简单,因为它是一个仅包含头文件的库。

以下是您需要执行的快速概述:

您可以假设Catch源已经安装在构建机器上,或者使用ExternalProject作为构建过程的一部分来获取它们。

无论哪种情况,您都会在构建机器上的某个已知目录中拥有Catch头文件。我建议创建一个接口目标,以便向测试可执行文件公开此信息:

add_library(Catch INTERFACE)
target_include_directories(Catch INTERFACE ${YOUR_CATCH_INCLUDE_DIR})

这样,您可以直接将Catch作为依赖项指定给target_link_libraries

add_executable(my_test ${MY_TEST_SOURCES})
target_link_libraries(my_test PUBLIC Catch)

像往常一样,使用CMake时,add_test负责将测试引入CTest:

enable_testing()
add_test(NAME MyAwesomeTest COMMAND my_test)

就是这样了。在构建的项目上运行make test以运行您的测试。

如果您需要查看完整的工作示例,我在Github上有一个项目可以实现这一点。

针对较新版本的Catch更新: 如果您已经升级到Catch2,则该软件包附带其自己的软件包配置文件,因此您只需调用 find_package 来集成它即可。 这提供了更顺畅的CMake集成,您不必开始定义自己的接口目标。 尽管上面的方法即使使用Catch2仍将起作用,但如果您的Catch版本已经支持它,请使用find_package


但是是否有脚本可以自动添加 ctest 测试呢? - amigo421
只有当你编写一个时,CMake才会知道哪些可执行文件是测试。 - ComicSansMS
https://github.com/Fraser999/MaidSafe/blob/846ce37c23bd86ee261e439919dfd7000a8f9372/cmake_modules/add_catch_tests.cmake - amigo421
为Catch lib提出一个pull request,用于自动生成CTest定义以进行Catch测试 https://github.com/philsquared/Catch/pull/879 希望在审核后能够使用。 - amigo421
catch 不需要链接... 它是一个仅包含头文件的库。那么为什么要写 target_link_libraries 呢? - Sandburg
CMake (2.6)、现代 CMake (3.0) 还是 更现代的 CMake (3.10)? - Sandburg

6

使用以下命令安装Catch:

 $ git clone https://github.com/catchorg/Catch2 <catch_src_dir>
 $ mkdir <catch_bin_dir>
 $ cd <catch_bin_dir>
 $ cmake -DBUILD_TESTING:BOOL=FALSE <catch_src_dir>
 $ make
 $ make install

然后在 CMakeLists.txt 文件中添加以下内容:

find_package(Catch2 REQUIRED)
target_link_libraries(tests Catch2::Catch2)

请查看 此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接