You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用CMake搭配Catch2构建并运行阶乘测试项目?

配置CMake搭配Catch2构建阶乘测试项目

我来帮你一步步搞定这个CMake配置,让你的阶乘测试项目顺利构建和运行:

1. 完善各目录的CMakeLists.txt

根目录 /factorial/CMakeLists.txt

这个文件是项目的核心配置,负责全局设置和子目录管理:

cmake_minimum_required(VERSION 3.10)
project(FactorialTest)

# 指定C++标准,确保兼容性
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 把所有可执行文件输出到项目根目录的bin文件夹
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)

# 让所有目标都能找到include目录下的头文件
include_directories(${PROJECT_SOURCE_DIR}/include)

# 添加源码和测试子目录
add_subdirectory(src)
add_subdirectory(test)

源码目录 /factorial/src/CMakeLists.txt

这里负责编译阶乘功能为库,方便测试代码调用:

# 生成静态库(如果需要动态库可以把STATIC改成SHARED)
add_library(fact STATIC fact.cpp)

# 确保库本身能找到include目录的头文件,同时让链接它的目标也能访问这些头文件
target_include_directories(fact PUBLIC ${PROJECT_SOURCE_DIR}/include)

测试目录 /factorial/test/CMakeLists.txt

这里配置测试可执行文件,并且对接Catch2和CTest:

# 生成测试可执行文件
add_executable(test_fact test_fact.cpp)

# 链接我们的阶乘库,让测试代码能调用factorial函数
target_link_libraries(test_fact PRIVATE fact)

# 启用CTest,方便批量运行测试
enable_testing()
# 添加测试用例,指定测试名称和对应的可执行文件
add_test(NAME FactorialTests COMMAND test_fact)

2. 补全测试文件 test_fact.cpp

你还需要编写测试逻辑,Catch2的单头文件版本只需要在测试文件中定义CATCH_CONFIG_MAIN来生成主函数:

#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "fact.hpp"

TEST_CASE("Factorial calculations are correct", "[factorial]") {
    // 注意:你的factorial函数返回number<=1时返回number,所以0的阶乘会返回0
    // 如果要符合数学定义(0! = 1),可以修改fact.cpp的逻辑为 return number <=1 ? 1 : ...
    REQUIRE(factorial(0) == 0);
    REQUIRE(factorial(1) == 1);
    REQUIRE(factorial(2) == 2);
    REQUIRE(factorial(3) == 6);
    REQUIRE(factorial(5) == 120);
    REQUIRE(factorial(10) == 3628800);
}

3. 构建和运行项目

按照以下步骤操作即可完成构建和测试:

  • 首先在项目根目录创建构建目录(推荐用out-of-source构建,避免污染源码):
    mkdir build && cd build
    
  • 运行CMake生成构建文件:
    cmake ..
    
  • 编译项目(Linux/macOS用make,Windows用cmake --build .):
    make
    
  • 运行测试:
    方式一:直接执行bin目录下的测试程序:
    ../bin/test_fact
    
    方式二:用CTest批量运行测试(适合有多个测试用例的场景):
    ctest
    

小提示:如果希望0的阶乘返回符合数学定义的1,可以修改fact.cpp中的函数实现:

unsigned int factorial( unsigned int number ) { 
    return number <= 1 ? 1 : factorial(number-1)*number; 
}

内容的提问来源于stack exchange,提问作者fronthem

火山引擎 最新活动