gpt4 book ai didi

c++ - 是否有可能以类似于 Boost.MinimalTestFacility 的方式在 main 中调用 Boost.Unit Test 测试?

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:19 24 4
gpt4 key购买 nike

我正在扩展用于计算流体动力学的库,因此我正在处理遗留代码。应用程序涉及初始化有时非常大的对象,其中大多数是相互依赖的。初始化取决于存储在目录中的配置和输入文件。

尝试使用测试框架与我自己的测试被黑库相比应该是有意义的,因为有各种测试用例和系列,以及测试,我可以从拥有测试树和 Shiny 的报告 + 自动化测试的能力中受益.

但是,当我尝试在程序的特定点 调用特定测试时遇到了问题。当我尝试使用 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 完全可以做到这一点吗?与 Google Test 一样,可以通过 parsing during execution 选择特定的测试。 .这对我的问题没有任何用处。我已经使用 GTest 和 BoostTest 进行单元测试,其中固定装置的初始化是本地的,不依赖于 main(argc、argv、配置和输入文件),我没有遇到任何问题。

编辑:我可能会因此而被激怒,但是在处理遗留代码时,我相信能够以某种方式通过 const refs 访问 main 中的对象(以确保测试不会修改对象)是有益的),以一种比从夹具类继承更简单的方式。在我的例子中,与使用最小测试框架时放置在 main 中的简单 BOOST_TEST_REQUIRE 相比,这样做意味着一天的工作。当然,使用最小框架我没有测试树等,所以我回到了我开始的地方:在我自己的 hacked 测试库中。

最佳答案

一种可能的方法是执行您自己的手动测试注册,将要一起执行的测试分成套件并手动运行它们。例如:

using namespace boost::unit_test;

void test1() { std::cout << "Running test 1\n"; }
void test2() { std::cout << "Running test 2\n"; }
void test3() { std::cout << "Running test 3\n"; }

void init_test_tree() {

test_suite *ts1 = BOOST_TEST_SUITE( "suite_a");
ts1->add( BOOST_TEST_CASE( &test1 ) );
ts1->add(BOOST_TEST_CASE( &test2 ));
framework::master_test_suite().add(ts1);

test_suite *ts2 = BOOST_TEST_SUITE( "suite_b");
ts2->add( BOOST_TEST_CASE( &test3 ) );
framework::master_test_suite().add(ts2);
}

bool empty_init() { return true; }

int main( int argc, char *argv[] ) {

init_test_tree();

std::cout << "Run suite a\n";
framework::run( framework::master_test_suite().get("suite_a"));

std::cout << "Run suite b\n";
framework::run( framework::master_test_suite().get("suite_b"));

std::cout << "Run the tree\n";
// pass empty initialization function as we've already constructed the test tree
return unit_test_main(&empty_init, argc, argv);
}

关于c++ - 是否有可能以类似于 Boost.MinimalTestFacility 的方式在 main 中调用 Boost.Unit Test 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21331038/

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