Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用Catch2测试我的CMake静态库项目?_C++_Catch2 - Fatal编程技术网

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

C++ 如何使用Catch2测试我的CMake静态库项目?,c++,catch2,C++,Catch2,我正在编写一个静态库,其中包含几个项目之间的一些共享代码。为了验证该库中的代码是否正常工作,我想使用Catch2对其进行一些单元测试 不幸的是,在尝试运行测试时,我遇到了编译的输出文件是共享库(.a),而不是可执行文件的问题 我确信我可以创建一个单独的项目,使用静态库中的函数,然后以这种方式运行测试,但理想情况下,我希望测试和构建配置尽可能彼此接近 所以我的问题是: 设置我的项目以便使用Catch2对静态库代码进行单元测试的最佳方法是什么 以下是我的项目的CMakeLists.txt文件供参考:

我正在编写一个静态库,其中包含几个项目之间的一些共享代码。为了验证该库中的代码是否正常工作,我想使用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>