【发布时间】:2014-01-24 11:05:41
【问题描述】:
我正在扩展一个计算流体动力学库,因此我正在处理遗留代码。应用程序涉及初始化有时非常大的对象,其中大多数是相互依赖的。初始化取决于存储在目录中的配置和输入文件。
与我自己的测试被黑库相比,尝试使用测试框架应该是有意义的,因为有各种测试用例和系列以及测试,我可以从拥有测试树和闪亮的报告 + 自动化测试的能力中受益.
但是,当我尝试在程序中在特定点调用特定测试时遇到了问题。当我尝试使用 Google Test 时,已经出现了这个问题 - 请参阅 this question.
这是一个使用 Boost.Test 的问题模型:
#define BOOST_TEST_MODULE hugeObjectEvenTest
#define BOOST_TEST_NO_MAIN
#include <boost/test/included/unit_test.hpp>
#include<random>
#include<iostream>
BOOST_AUTO_TEST_SUITE (hugeObjectEvenTest)
BOOST_AUTO_TEST_CASE (test1)
{
BOOST_CHECK(hugeObject.value() % 2 == 0);
}
BOOST_AUTO_TEST_SUITE_END()
class HugeClass
{
int value_ = 0;
public:
HugeClass() = default;
HugeClass(int x) : value_(x) {};
int value () { return value_; }
void setValue (int val) { value_ = val; }
};
int main(int argc, const char *argv[])
{
HugeClass hugeObject;
std::random_device rd;
std::default_random_engine e1(rd());
std::uniform_int_distribution<int> dist(0,100);
for(int i = 0; i < 10; ++i)
{
hugeObject.setValue(dist(e1));
std::cout << hugeObject.value() << std::endl;
}
return 0;
}
这只是一个数值求解器应用程序的模型,就像在 here 找到的那个。
我认为我需要的是一个全局夹具,它能够引用hugeObject。
类似hugeObject 的实例在模拟期间在模拟循环内(用for循环建模)被修改(用随机数生成建模)。
我想做的就是在 main 中的特定点执行特定测试,并从拥有测试树以及使用测试框架的所有其他好处中受益。类似于Minimal Test Facility 的功能。
Boost.Test 是否可以做到这一点?和谷歌测试一样,选择具体的测试可以通过parsing during execution来完成。这对我的问题没有任何用处。我已经将 GTest 和 BoostTest 都用于单元测试,其中固定装置的初始化是本地的,不依赖于 main(argc、argv、配置和输入文件),我没有任何问题。
编辑:我可能会为此感到愤怒,但是在处理遗留代码时,我相信能够以某种方式通过 const refs 访问 main 中的对象将是有益的(以确保测试不会修改对象),以比从夹具类继承更简单的方式。就我而言,与使用最小测试框架时放在 main 中的简单 BOOST_TEST_REQUIRE 相比,这样做意味着一天的工作。当然,使用最小的框架,我没有测试树等,所以我回到了我开始的地方:在我自己的黑客测试库中。
【问题讨论】:
标签: c++ boost-test