如何使用Catch2测试我的CMake静态库项目?

时间:2019-03-18 18:09:39

标签: 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/)

2 个答案:

答案 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>

然后,您不必在库的内部版本中包含与库本身无关的内容,从而可以缩短客户端的编译时间,同时可以从测试夹具的角度进行工作