如何使用CMake的CTest进行单元测试

如何使用CMake和CTest进行单元测试。
CMake是一个跨平台的构建工具,可以自动生成与平台相关的Makefile或Visual Studio项目文件,简化了C++程序的构建过程。而CTest是CMake的测试工具,它可以自动化运行单元测试,收集测试结果并生成报告。

下面是使用CMake和CTest进行单元测试的步骤:

  • 编写C++程序代码和对应的单元测试代码。
  • 在CMakeLists.txt文件中添加测试目标(test target)和相关配置,如测试代码的编译选项、链接库等。
  • 运行CMake来生成Makefile或Visual Studio项目文件,包括测试目标。
    运行make或Visual Studio等构建工具来编译测试目标。
  • 运行ctest命令来自动化运行单元测试,并收集测试结果。
  • 可以使用CTest生成各种测试报告,如文本报告、XML报告、HTML报告等。
  • CTest的具体用法可以通过执行"ctest --help"查看CTest命令的帮助信息。

总的来说,CMake和CTest能够帮助C++程序员简化构建和测试过程,并提供各种工具来方便测试结果的收集和分析。
假设我们有一个简单的C++函数,计算两个整数的和,如下所示:

int add(int a, int b) {
    
    
    return a + b;
}

我们要编写一个单元测试,测试这个函数的正确性。首先在项目根目录下创建一个名为"CMakeLists.txt"的文件,并添加如下内容:

# 设置项目名称和版本号
project(my_project VERSION 1.0)

# 添加测试目录
add_subdirectory(tests)

接着,在"tests"目录下创建一个名为"CMakeLists.txt"的文件,并添加如下内容:

# 添加测试用例
add_executable(test_add test_add.cpp)

# 链接gtest库
find_package(GTest REQUIRED)
target_link_libraries(test_add GTest::GTest GTest::Main)

# 添加测试
add_test(NAME test_add COMMAND test_add)

其中,test_add.cpp是我们编写的测试用例代码,GTest是Google Test库,需要先安装并配置好环境。test_add.cpp的内容如下:

#include "gtest/gtest.h"

#include "../add.h"

TEST(addTest, testAdd) {
    
    
    EXPECT_EQ(add(1, 2), 3);
    EXPECT_EQ(add(0, 0), 0);
    EXPECT_EQ(add(-1, 1), 0);
}

int main(int argc, char** argv) {
    
    
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

其中,add.h是我们编写的函数头文件,保存了add函数的声明。在测试代码中,我们使用Google Test的宏EXPECT_EQ来断言add函数的返回值是否符合预期。

最后,我们可以在项目根目录下运行如下命令来生成Makefile并编译测试目标:

mkdir build && cd build
cmake ..
make

运行完上述命令后,可以在build目录下看到生成的可执行文件test_add和测试报告。我们可以运行如下命令来运行测试并查看测试报告:

ctest

这时,CTest会自动运行test_add测试,并在终端输出测试结果。如果测试通过,CTest的输出会显示"100% tests passed"的信息。如果测试失败,CTest会显示测试失败的详细信息。

这就是一个简单的使用CMake和CTest进行单元测试的示例。需要注意的是,实际使用时可能需要根据项目和需求进行适当调整和定制。

运行完CTest后,会输出测试结果的汇总信息,包括测试用例的执行情况、测试用例通过率、测试用例耗时等统计信息。如果有测试用例失败,还会输出详细的错误信息,以便于用户进行代码调试。

以下是一个简单的示例,假设我们有一个名为example的测试集,其中包含了两个测试用例addTest和subTest:

$ ctest -R example
Test project /home/user/my_project/build
      Start 1: addTest
 1/2 Test #1: addTest ......................   Passed    0.01 sec
      Start 2: subTest
 2/2 Test #2: subTest ......................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.03 sec

在这个例子中,我们使用了ctest命令执行example测试集,使用了-R选项来指定只执行测试名称中包含example的测试用例。执行结果显示,测试集中的两个测试用例addTest和subTest都通过了测试,测试通过率为100%,总共耗时0.03秒。

如果有测试用例失败,输出结果如下所示:

$ ctest -R example
Test project /home/user/my_project/build
      Start 1: addTest
 1/2 Test #1: addTest ......................***Failed    0.01 sec
      Start 2: subTest
 2/2 Test #2: subTest ......................   Passed    0.01 sec

50% tests passed, 1 tests failed out of 2

Total Test time (real) =   0.03 sec

The following tests FAILED:
          1 - addTest (Failed)

在这个例子中,测试集中的addTest测试用例执行失败,输出了详细的错误信息。测试通过率为50%,总共耗时0.03秒。

猜你喜欢

转载自blog.csdn.net/m0_49302377/article/details/130278449