代码之家  ›  专栏  ›  技术社区  ›  kovac

使用CMake和visualstudio的Catch2

  •  0
  • kovac  · 技术社区  · 5 年前

    Catch2 我建立的一个库的测试框架。我正在使用CMake和visualstudio2017。

    executable-project/
    |-- library
          |--include/
          |    |--SUT.h 
          |--src/
          |    |--SUT.cpp
          |--tests/
          |    |--catch.hpp
          |    |--SUTTest.cpp
          |CMakeLists.txt
    |include/
    |src/
    | |--main.cpp
    |CMakeLists.txt
    

    SUT.h SUT.cpp SUTTest.cpp 正在测试一个基于 example .

    我在库中的CMakeLists.txt文件是

    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})
    

    这个 测试.cpp 文件是:

    #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 在该项目中,动态地将库链接到它。

    当我在visualstudio中构建这个解决方案时,构建工作正常。

    然而,尽管断言 Factorial(0) == 0 . 另外,VisualStudio没有发现tests文件夹中的测试。我要达到的目标是:

    1. (可选)使VisualStudio能够发现测试。

    编辑:

    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)
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   kovac    5 年前

    终于让Catch2与visualstudio一起工作了。

    here ).

    cmake -Bbuild -S. -DBUILD_TESTING=OFF
    cmake --build build/ --target install (Need admin rights)
    

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

    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\u TESTS项目添加到visualstudio中。当我构建这个项目时,我的单元测试会运行。希望这对任何试图与CMake集成的人都有帮助。

        2
  •  0
  •   ap-osd    5 年前

    尽管断言阶乘(0)==0,但测试并没有失败

    REQUIRE( Factorial(0) == 1 ); (不是 == 0 )

    当我在visualstudio中单击Build时,要作为 建造。

    在visualstudioide中,构建和运行是两个独立的步骤。如果要自动排序,请编写一个简单的 .bat

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

    Catch2有CMake集成 包含用于自动注册的CMake脚本 TEST_CASE CTest中的s .

    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 Integration