如何使用Boost实现测试套件和案例的组织?

Tor*_*örn 6 c++ boost unit-testing

前言

我是单元测试的新手,而不是C++的新手.最近我在使用RSpec的Ruby中进行了测试驱动开发的一些经验.现在我正在尝试使用Boost的单元测试框架在C++中进行类似的工作.

脚本

我正在/src项目的根文件夹下的目录中组织应用程序的头文件和源文件.正如我在其他C++程序中多次看到的那样/tests,在项目的根目录中的目录中进行测试似乎是合理的.

现在我想在测试中复制源文件的目录结构.因此,假设我有以下源/头文件结构:

/src
  /controller
    controller_class.h
    controller_class.cpp
  /model
    model_a.h
    model_a.cpp
    model_b.h
    model_b.cpp
  /view
    simple_view.h
    simple_view.cpp
Run Code Online (Sandbox Code Playgroud)

因此,测试组织如下

/tests
  TestRunner.cpp
  /controller
    controller_class_test.cpp
  /model
    model_a_test.cpp
    model_b_test.cpp
  /view
    simple_view_test.cpp
Run Code Online (Sandbox Code Playgroud)

对于TestRunner.cpp我从这篇博文中的例子:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "MyProgram Unit Tests"
#include <boost/test/unit_test.hpp>
Run Code Online (Sandbox Code Playgroud)

问题

我现在想继续TestRunner.cpp创建基本测试套件(用于控制器,模型和视图),如下所示

BOOST_AUTO_TEST_SUITE ( controller )
  //some stuff here
BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE ( model )
  //some stuff here
BOOST_AUTO_TEST_SUITE_END()

BOOST_AUTO_TEST_SUITE ( view )
  //some stuff here
BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)

欲望

但是,我现在如何将更多嵌套测试套件和案例集成到这些顶级测试套件中?我终于希望实际的测试用例只出现在*_test.cpp文件中.虽然每个文件都将测试用例包装到一个额外的测试套件中:

  • 主测试模块(TestRunner.cpp)
    • 控制器测试套件(TestRunner.cpp)
      • 控制器类测试套件(controller_class_test.cpp)
        • 控制器类测试用例(controller_class_test.cpp)
    • 模型测试套件(TestRunner.cpp)
      • A型测试套件(model_a_test.cpp)
        • A型测试案例(model_a_test.cpp)
      • B型测试套件(model_b_test.cpp)
        • B型测试案例(model_B_test.cpp)
    • 查看测试套件(TestRunner.cpp)
      • 简单视图测试套件(simple_view_test.cpp)
        • 简单查看测试用例(simple_view_test.cpp)

如何在相应的更高级别套件中包含嵌套套装和案例?虽然单元测试框架>用户指南>测试组织>测试套件>自动注册非常接近,但我在Boost文档中找不到任何内容.
在使用RSpec的Ruby中,只需要*_spec.rb按照我的方式放置测试文件(读取:),并自动迭代它们.我想,有了Boost,我必须明确地声明它.

Gen*_*tal 7

Boost.Test测试套件类似于C++名称空间.您可以随时重启它们.每个测试文件只需要将测试用例放在正确的测试套件中:

controller_class_a_test.cpp:

 BOOST_AUTO_TEST_SUITE( controller )

 BOOST_AUTO_TEST_CASE( test_class_a )
 {
 }

 BOOST_AUTO_TEST_SUITE_END()


controller_class_b_test.cpp:

 BOOST_AUTO_TEST_SUITE( controller )

 BOOST_AUTO_TEST_CASE( test_class_b )
 {
 }

 BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)

相同的概念适用于任何深度的测试树.此外,您根本不需要顶级TestRunner.cpp.只需将所有测试文件合并到一个测试模块中,Boost.Test将关注其余部分.