C++ 如何使用Catch2测试我的CMake静态库项目?
我正在编写一个静态库,其中包含几个项目之间的一些共享代码。为了验证该库中的代码是否正常工作,我想使用Catch2对其进行一些单元测试 不幸的是,在尝试运行测试时,我遇到了编译的输出文件是共享库(.a),而不是可执行文件的问题 我确信我可以创建一个单独的项目,使用静态库中的函数,然后以这种方式运行测试,但理想情况下,我希望测试和构建配置尽可能彼此接近 所以我的问题是: 设置我的项目以便使用Catch2对静态库代码进行单元测试的最佳方法是什么 以下是我的项目的CMakeLists.txt文件供参考:C++ 如何使用Catch2测试我的CMake静态库项目?,c++,catch2,C++,Catch2,我正在编写一个静态库,其中包含几个项目之间的一些共享代码。为了验证该库中的代码是否正常工作,我想使用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/)
如(重点矿山)中所述:
它被释放为<强>单个包含文件,允许在断言中使用自然C++表达式
因此,不需要为它添加任何库。在单元测试源代码中包含头就足够了
与托管GitHub项目中的声明相同:
有什么问题吗?
CasCH2是一个头上的C++自动化测试用例,是C++的多范式测试框架。这也支持Objective-C(可能还有C)。它主要作为一个单头文件分发,尽管某些扩展可能需要额外的头文件
只需确保有一个单元测试运行程序可执行文件,提供调用所有单元测试函数的main()
函数定义。从他们的经验来看,这可以很容易地做到:
不幸的是,在尝试运行测试时,我遇到了编译的输出文件是共享库(.a),而不是可执行文件的问题 您已经这样声明了您的CMake项目类型: 有关如何正确设置CMake单元测试项目的更多信息,请参阅本问答
请。测试静态库的常见模式是有一个包含所有测试的单独可执行文件,然后使用您的库。比如说
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)
在这里,我还添加了一些include-some目录到共享lib的实现细节中,您可能需要测试这些目录,但不希望通过公共头向客户机公开它们
test\u main.cpp
只需:
#define CONFIG_CATCH_MAIN
#include <catch2/catch.hpp>
\define CONFIG\u CATCH\u MAIN
#包括
然后,您不必在库的构建中包含与库本身无关的内容,从而加快客户机的编译时间,同时您可以从测试夹具的角度进行工作
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)
#define CONFIG_CATCH_MAIN
#include <catch2/catch.hpp>