4.4 使用Boost Test进行单元测试

NOTE:此示例代码可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-04/recipe-04 中找到,包含一个C++的示例。该示例在CMake 3.5版(或更高版本)中是有效的,并且已经在GNU/Linux、macOS和Windows上进行过测试。

Boost Test是在C++社区中,一个非常流行的单元测试框架。本例中,我们将演示如何使用Boost Test,对求和示例代码进行单元测试。

准备工作

main.cppsum_integers.cppsum_integers.hpp与之前的示例相同,将更新test.cpp作为使用Boost Test库进行的单元测试:

  1. #include "sum_integers.hpp"
  2. #include <vector>
  3. #define BOOST_TEST_MODULE example_test_suite
  4. #include <boost/test/unit_test.hpp>
  5. BOOST_AUTO_TEST_CASE(add_example)
  6. {
  7. auto integers = {1, 2, 3, 4, 5};
  8. auto result = sum_integers(integers);
  9. BOOST_REQUIRE(result == 15);
  10. }

具体实施

以下是使用Boost Test构建项目的步骤:

  1. 先从CMakeLists.txt开始:

    1. # set minimum cmake version
    2. cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
    3. # project name and language
    4. project(recipe-04 LANGUAGES CXX)
    5. # require C++11
    6. set(CMAKE_CXX_STANDARD 11)
    7. set(CMAKE_CXX_EXTENSIONS OFF)
    8. set(CMAKE_CXX_STANDARD_REQUIRED ON)
    9. # example library
    10. add_library(sum_integers sum_integers.cpp)
    11. # main code
    12. add_executable(sum_up main.cpp)
    13. target_link_libraries(sum_up sum_integers)
  2. 检测Boost库并将cpp_test链接到它:

    1. find_package(Boost 1.54 REQUIRED COMPONENTS unit_test_framework)
    2. add_executable(cpp_test test.cpp)
    3. target_link_libraries(cpp_test
    4. PRIVATE
    5. sum_integers
    6. Boost::unit_test_framework
    7. )
    8. # avoid undefined reference to "main" in test.cpp
    9. target_compile_definitions(cpp_test
    10. PRIVATE
    11. BOOST_TEST_DYN_LINK
    12. )
  3. 最后,定义单元测试:

    1. enable_testing()
    2. add_test(
    3. NAME boost_test
    4. COMMAND $<TARGET_FILE:cpp_test>
    5. )
  4. 下面是需要配置、构建和测试代码的所有内容:

    1. $ mkdir -p build
    2. $ cd build
    3. $ cmake ..
    4. $ cmake --build .
    5. $ ctest
    6. Test project /home/user/cmake-recipes/chapter-04/recipe-04/cxx-example/build
    7. Start 1: boost_test
    8. 1/1 Test #1: boost_test ....................... Passed 0.01 sec
    9. 100% tests passed, 0 tests failed out of 1
    10. Total Test time (real) = 0.01 sec
    11. $ ./cpp_test
    12. Running 1 test case...
    13. *** No errors detected

工作原理

使用find_package来检测Boost的unit_test_framework组件(参见第3章,第8节)。我们认为这个组件是REQUIRED的,如果在系统环境中找不到它,配置将停止。cpp_test目标需要知道在哪里可以找到Boost头文件,并且需要链接到相应的库;它们都由IMPORTED库目标Boost::unit_test_framework提供,该目标由find_package设置。

更多信息

本示例中,我们假设系统上安装了Boost。或者,我们可以在编译时获取并构建Boost依赖项。然而,Boost不是轻量级依赖项。我们的示例代码中,我们只使用了最基本的设施,但是Boost提供了丰富的特性和选项,有感兴趣的读者可以去这里看看:http://www.boost.org/doc/libs/1_65_1/libs/test/doc/html/index.html