gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:41 27 4
gpt4 key购买 nike

前言

我是单元测试的新手,也是 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

因此测试的组织如下

/tests
TestRunner.cpp
/controller
controller_class_test.cpp
/model
model_a_test.cpp
model_b_test.cpp
/view
simple_view_test.cpp

对于 TestRunner.cpp,我从 this blog post 中获取了示例:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE "MyProgram Unit Tests"
#include <boost/test/unit_test.hpp>

问题

我现在想在 TestRunner.cpp 中继续创建基本测试套件(用于 Controller 、模型和 View ),如下所示

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()

欲望

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

  • 主测试模块 (TestRunner.cpp)
    • Controller 测试套件(TestRunner.cpp)
      • Controller 类测试套件 (controller_class_test.cpp)
        • Controller 类测试用例(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)
      • 简单 View 测试套件(simple_view_test.cpp)
        • 简单 View 测试用例(simple_view_test.cpp)

问题

如何将嵌套的套装和案例包含在相应的更高级别套装中?尽管 The Unit Test Framework > User's guide > Test organization > Test suite > Automated registration,我在 Boost 文档中找不到任何内容非常接近。
在带有 RSpec 的 Ruby 中,只需按照我所做的方式放置测试文件(阅读:*_spec.rb)并自动迭代它们。我想,对于 Boost,我必须以这种方式明确声明它。

最佳答案

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()

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

关于c++ - 如何使用 Boost 实现测试套件和用例的组织?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9302777/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com