我正在编写一个静态库,其中包含多个项目之间的一些共享代码。为了验证该库中的代码是否正常运行,我想使用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/)
答案 0 :(得分:1)
如catch2 tag wiki info(强调我的)中所述:
它作为单个包含文件发布,并允许在断言中使用自然的C ++表达式
因此,无需为其添加任何库。在单元测试源代码中包含标头就足够了。
与托管的GitHub项目在readme page上的声明相同:
有什么收获?
Catch2代表标题中的C ++自动测试用例,并且是C ++的多范式测试框架。它也支持Objective-C(也许还有C)。它主要作为单个头文件分发,尽管某些扩展名可能需要其他头。
只需确保您具有一个单元测试运行器可执行文件,并提供一个main()
函数定义,即可调用所有的单元测试函数。从他们的tutorial起,可以很容易地做到:
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
不幸的是,在尝试运行测试时,我遇到一个问题,即编译的输出文件是共享库(.a),而不是可执行文件。
好吧,您已经这样声明了CMake项目类型:
project(sharedLib CXX)
有关如何正确设置CMake单元测试项目的更多信息,请参见此问答
请
答案 1 :(得分:0)
测试静态库的常见模式是拥有一个单独的可执行文件,其中包含所有测试,然后使用您的库。例如
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)
在这里,我还为共享库的实现细节添加了一些目录,您可能需要对其进行测试,但又不想通过公共标头向客户端公开。
test_main.cpp
仅需:
#define CONFIG_CATCH_MAIN
#include <catch2/catch.hpp>
然后,您不必在库的内部版本中包含与库本身无关的内容,从而可以缩短客户端的编译时间,同时可以从测试夹具的角度进行工作