如何使用 Catch2 测试我的 CMake 静态库项目?
How can I use Catch2 to test my CMake static library project?
我正在编写一个静态库,其中包含几个项目之间的一些共享代码。为了验证这个库中的代码是否正常运行,我想使用 Catch2 对其进行一些单元测试。
不幸的是,在尝试 运行 测试时,我 运行 遇到了编译输出文件是共享库 (.a) 而不是可执行文件的问题。
我确信我可以创建一个单独的项目,它使用我的静态库中的函数,然后 运行 以这种方式进行测试,但理想情况下,我希望保持测试和构建配置尽可能接近尽可能互相。
所以我的问题是:
设置我的项目以便我可以使用 Catch2 对我的静态库代码进行单元测试的最佳方法是什么?
这是我项目的 CMakeLists.txt 文件供参考:
project(sharedLib CXX)
find_package(OpenMP)
if (CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp -lpthread -Wall -Wextra -Wpedantic -std=c++17")
endif()
if (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fopenmp /W4 /std:c++latest")
endif()
include_directories (
src/
lib/Catch2/single_include/
)
file (GLOB_RECURSE LIBRARY_SOURCES src/*.cpp
src/*.c
tests/*.cpp)
add_library(${PROJECT_NAME} STATIC ${LIBRARY_SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC src/)
测试静态库的一个常见模式是有一个单独的可执行文件,其中包含所有测试,然后使用您的库。例如
file (GLOB_RECURSE TEST_SOURCES tests/*.cpp)
add_executable(my_lib_tests test_main.cpp ${TEST_SOURCES})
target_link_libraries(my_lib_tests PRIVATE sharedLib)
target_include_directories(my_lib_tests PRIVATE ../path/to/secret/impl/details)
在这里我还添加了一些包含一些目录到您可能需要测试的共享库的实现细节,但不想通过 public header 向客户公开。
test_main.cpp
只需:
#define CONFIG_CATCH_MAIN
#include <catch2/catch.hpp>
然后你不必在你的库构建中包含与库本身无关的东西,加快客户端的编译时间,同时你可以从测试夹具的角度工作
我正在编写一个静态库,其中包含几个项目之间的一些共享代码。为了验证这个库中的代码是否正常运行,我想使用 Catch2 对其进行一些单元测试。
不幸的是,在尝试 运行 测试时,我 运行 遇到了编译输出文件是共享库 (.a) 而不是可执行文件的问题。
我确信我可以创建一个单独的项目,它使用我的静态库中的函数,然后 运行 以这种方式进行测试,但理想情况下,我希望保持测试和构建配置尽可能接近尽可能互相。
所以我的问题是: 设置我的项目以便我可以使用 Catch2 对我的静态库代码进行单元测试的最佳方法是什么?
这是我项目的 CMakeLists.txt 文件供参考:
project(sharedLib CXX)
find_package(OpenMP)
if (CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp -lpthread -Wall -Wextra -Wpedantic -std=c++17")
endif()
if (MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fopenmp /W4 /std:c++latest")
endif()
include_directories (
src/
lib/Catch2/single_include/
)
file (GLOB_RECURSE LIBRARY_SOURCES src/*.cpp
src/*.c
tests/*.cpp)
add_library(${PROJECT_NAME} STATIC ${LIBRARY_SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC src/)
测试静态库的一个常见模式是有一个单独的可执行文件,其中包含所有测试,然后使用您的库。例如
file (GLOB_RECURSE TEST_SOURCES tests/*.cpp)
add_executable(my_lib_tests test_main.cpp ${TEST_SOURCES})
target_link_libraries(my_lib_tests PRIVATE sharedLib)
target_include_directories(my_lib_tests PRIVATE ../path/to/secret/impl/details)
在这里我还添加了一些包含一些目录到您可能需要测试的共享库的实现细节,但不想通过 public header 向客户公开。
test_main.cpp
只需:
#define CONFIG_CATCH_MAIN
#include <catch2/catch.hpp>
然后你不必在你的库构建中包含与库本身无关的东西,加快客户端的编译时间,同时你可以从测试夹具的角度工作