首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Catch2与CMake和

Catch2与CMake和
EN

Stack Overflow用户
提问于 2019-06-01 10:08:42
回答 2查看 3.4K关注 0票数 2

我正在尝试为我构建的库设置Catch2测试框架。我正在使用CMake和VisualStudio2017。

我的项目结构是:

代码语言:javascript
复制
executable-project/
|-- library
      |--include/
      |    |--SUT.h 
      |--src/
      |    |--SUT.cpp
      |--tests/
      |    |--catch.hpp
      |    |--SUTTest.cpp
      |CMakeLists.txt
|include/
|src/
| |--main.cpp
|CMakeLists.txt

SUT.hSUT.cppSUTTest.cpp只是在测试基于示例定义的阶乘函数。

我在库中的CMakeLists.txt文件是

代码语言:javascript
复制
cmake_minimum_required (VERSION 3.8)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
file(GLOB TEST_FILES "${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp")

add_library(MY_LIBRARY ${HEADER_FILES} ${SOURCE_FILES} ${TEST_FILES})

target_include_directories(MY_LIBRARY PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")

source_group("Test Files" FILES ${TEST_FILES})

SUTTest.cpp文件是:

代码语言:javascript
复制
#define CATCH_CONFIG_MAIN

#include "catch.hpp"
#include "SUT.h"

TEST_CASE("Factorials are computed", "[factorial]")
{
    SUT sut;

    REQUIRE(sut.Factorial(0) == 0);
    REQUIRE(sut.Factorial(1) == 1);
    REQUIRE(sut.Factorial(2) == 2);
    REQUIRE(sut.Factorial(3) == 6);
    REQUIRE(sut.Factorial(10) == 3628800);
}

“可执行项目”只是利用了库(它是实际的应用程序)。该项目中的CMakeLists.txt动态地将库链接到它。

当我在Visual中构建此解决方案时,生成可以正常工作。

然而,测试并没有失败,尽管断言Factorial(0) == 0。此外,Visual没有在“测试”文件夹中发现测试。我想要达到的目标是:

  1. 在中单击build时,将作为生成的一部分运行测试。
  2. (可选)使Visual能够发现测试。

编辑:

代码语言:javascript
复制
cmake_minimum_required (VERSION 3.8)

project("My Project")

file(GLOB HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB SOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")

add_subdirectory(library)
add_executable(MY_APP main.cpp ${HEADER_FILES} ${SOURCE_FILES})

target_include_directories(MY_APP PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_link_libraries(MY_APP MY_LIBRARY)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-14 14:51:14

最后,设法使Catch2与Visual一起工作。

首先,我从他们的Catch2中下载了GitHub版本,并使用(这实际上是文档化的这里)将其安装在我的计算机上。

代码语言:javascript
复制
cmake -Bbuild -S. -DBUILD_TESTING=OFF
cmake --build build/ --target install (Need admin rights)

这将在C:\Program (x86)\Catch2 2中安装x86。然后,我将这个安装目录中的所有内容复制到项目的deps/Catch2 2文件夹中。然后将下面的内容添加到CMakeLists.txt中:

代码语言:javascript
复制
find_package(Catch2 REQUIRED PATHS "${CMAKE_CURRENT_SOURCE_DIR}/deps/Catch2")
target_link_libraries(MY_LIBRARY Catch2::Catch2)

include(CTest)
include(Catch)
catch_discover_tests(MY_LIBRARY)

这会将RUN_TESTS项目添加到Visual中。当我构建这个项目时,我的单元测试会运行。希望这对任何试图与CMake集成的人都有帮助。

票数 1
EN

Stack Overflow用户

发布于 2019-09-03 06:18:08

尽管断言Factorial(0) == 0没有失败,但测试没有失败。

你应该断言什么是真实的/期望的。那么,如果您编写的代码是错误的,它将失败。

REQUIRE( Factorial(0) == 1 ); (非== 0)

在中单击build时,将作为生成的一部分运行测试。

在中,生成和运行是两个独立的步骤。如果您想要自动排序,请编写一个简单的.bat脚本,该脚本首先构建,然后运行。

(可选)使Visual能够发现测试。

Catch2具有CMake集成,其中包含用于在CTest中自动注册TEST_CASE__s的CMake脚本。

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.5)

project(baz LANGUAGES CXX VERSION 0.0.1)

find_package(Catch2 REQUIRED)
add_executable(foo test.cpp)
target_link_libraries(foo Catch2::Catch2)

include(CTest)
include(Catch)
catch_discover_tests(foo)

详情请参见Catch2 CMake集成

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56405754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档