Boost.Test 使用说明

1. 环境准备
  • 确保您的开发环境中已安装 C++ 编译器(如 GCC 或 Clang)。

  • 安装 Boost 库。可以从 Boost 官方网站下载并安装

2. 编写测试代码

Boost.Test 提供了丰富的宏和工具来帮助编写测试用例。以下是一个简单的示例:

说明:

(1) 测试套件(Test Suite)和测试用例(Test Case)是 Boost.Test 的核心组成部分。测试套件用于组织多个测试用例,而测试用例则是具体的测试逻辑。

(2) 使用 BOOST_AUTO_TEST_SUITE 宏开始一个测试套件

(3) 使用 BOOST_AUTO_TEST_CASE 宏定义测试用例

(4) 使用 BOOST_AUTO_TEST_SUITE_END 宏结束测试套件

(5) 确保您的 Boost.Test 版本支持动态链接(BOOST_TEST_DYN_LINK)。如果不确定,可以尝试定义 BOOST_TEST_DYN_LINK 宏

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE MyTestModule
#include <boost/test/included/unit_test.hpp>

// 定义一个测试套件
BOOST_AUTO_TEST_SUITE(MyTestSuite)

// 定义一个测试用例
BOOST_AUTO_TEST_CASE(TestAddition)
{
    int a = 2, b = 3;
    BOOST_CHECK_EQUAL(a + b, 5); // 检查 a + b 是否等于 5
}

BOOST_AUTO_TEST_SUITE_END()

3. 编译和运行测试
  1. 使用 CMake 编写构建文件:

     
    cmake_minimum_required(VERSION 3.10)
    project(MyTestProject)
    
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED True)
    
    find_package(Boost REQUIRED COMPONENTS unit_test_framework)
    
    add_executable(run_tests_fm main.cpp) // main.cpp 是测试代码文件
    target_link_libraries(run_tests_fm Boost::unit_test_framework)
  2. 编译项目:

    1. 创建一个 build 目录并进入该目录。

    2. 运行 cmake .. 生成构建文件。

    3. 运行 make 编译项目。

  3. 运行测试程序:

    1. 执行生成的可执行文件(如 ./run_tests)。

    2. 可以通过命令行参数调整测试输出,例如:

      1. --log_level=all:显示所有日志信息。

      2. --run_test=MyTestSuite/TestAddition:仅运行指定的测试用例。

  4. 测试问题截图
    1. 缺失Boost.Test 版本支持动态链接
    2. 完整的测试输出
      1. 不带完整日志
      2. 带完整日志
        单独测试指定用例

4. 常用断言和工具


(1)Boost.Test 提供了多种断言宏,用于不同的测试场景:

  • 基本断言:

    • BOOST_CHECK(condition):检查条件是否为真,失败时不中断测试。

    • BOOST_REQUIRE(condition):检查条件是否为真,失败时中断当前测试用例。

  • 比较断言:

    • BOOST_CHECK_EQUAL(lhs, rhs):检查两个值是否相等。

    • BOOST_CHECK_CLOSE(lhs, rhs, tolerance):检查浮点数是否在误差范围内。

  • 异常断言:

    • BOOST_CHECK_THROW(statement, exception):检查是否抛出指定异常。


(2)测试装饰器用于为测试套件和测试用例添加额外信息,例如标签、描述等。

  • 添加标签:

    BOOST_AUTO_TEST_CASE(t_case1, *boost::unit_test::label("low"))

    • 使用 boost::unit_test::label 为测试用例添加标签。

  • 添加描述:

    BOOST_AUTO_TEST_CASE(t_case1, *boost::unit_test::description("a normal test case"))

    • 使用 boost::unit_test::description 添加描述信息。

5. 更多功能
  • Boost.Test 的 GitHub 仓库地址:GitHub - boostorg/test: The reference C++ unit testing framework (TDD, xUnit, C++03/11/14/17)

  • 日志和报告:支持多种日志格式(如纯文本、XML、JUnit)。

    • 日志级别


      Boost.Test 支持多种日志级别,用于控制输出的详细程度。日志级别从低到高依次为:
      • nothing:不输出任何信息。

      • fatal:输出致命错误。

      • system_error:输出系统错误(如超时或浮点异常)。

      • cpp_exception:输出未捕获的 C++ 异常。

      • error:输出所有错误信息。

      • warning:输出警告信息。

      • message:输出用户信息。

      • test_suite:输出测试套件信息。

      • all / success:输出所有信息,包括成功测试的通知。

    • 控制日志输出


      可以通过命令行参数控制日志的输出级别和格式。常用参数包括:
      • --log_level=<level>:设置日志级别,如 allerrorwarning 等。

      • --log_format=<format>:设置日志格式,支持 HRF(可读格式)和 XML 格式。

      • --log_sink=<file>:将日志输出到指定文件,而不是标准输出

        • <TestLog>
              <TestSuite name="MyTestModule">
                  <TestSuite name="MyTestSuite" file="/home/mogo/data/matt/test1/my_test.cpp" line="5">
                      <TestCase name="TestAddition" file="/home/mogo/data/matt/test1/my_test.cpp" line="7">
                          <Info file="/home/mogo/data/matt/test1/my_test.cpp" line="10"><![CDATA[check a + b == 5 has passed]]></Info>
                          <TestingTime>124</TestingTime>
                      </TestCase>
                      <TestCase name="TestSubtraction" file="/home/mogo/data/matt/test1/my_test.cpp" line="13">
                          <Info file="/home/mogo/data/matt/test1/my_test.cpp" line="16"><![CDATA[check a - b == 2 has passed]]></Info>
                          <TestingTime>151</TestingTime>
                      </TestCase>
                  </TestSuite>
              </TestSuite>
          </TestLog>
      • 显示进度:使用 --show_progress=yes 参数显示测试进度。

      • 生成构建信息:使用 --build_info=yes 参数在测试开始前打印操作系统版本、编译器版本等信息。