5

我希望为我的 boost 测试处理额外的命令行参数。我正在使用它来自动测试功能,我需要指定服务器名、用户、密码等内容...

当我传递我的测试可执行额外命令参数时,除了已经编码到整个单元测试中的参数之外,我得到一个堆损坏错误。

我已经左右搜索过,仅仅找到访问这些参数的位置就已经够难了。现在看起来我可能还需要先设置它们,否则命令行解析器会做一些愚蠢的事情。

任何人都知道如何添加命令行参数来提升单元测试?

编辑——最小的例子

#define BOOST_TEST_MODULE xxx
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(empty) {}

调用它:exename hello

这似乎与任何事情无关。这个问题应该删除。我无法谈论我认为发生的事情,但我认为这可能与此有关:

http://forums.codeguru.com/showthread.php?506909-Boost-invalid-block-while-overloading-global-new-delete

**任何看这里的读者都知道这里的问题和答案没有用,这一点非常重要。我遇到的问题非常具体到我的环境,我无法谈论。我真的希望模组和人们停止删除此警告或让我删除此警告,但事实就是如此。不要被这只野鹅误导到黑暗的小巷里。**

4

3 回答 3

13

看看主测试套件。是

boost::unit_test::framework::master_test_suite().argc
boost::unit_test::framework::master_test_suite().argv

你想要什么?

于 2012-12-17T20:24:50.827 回答
13

我认为 stefan 给了你解决问题的关键。也许你想要的是一个测试夹具。

您可以使用夹具将所有命令行参数传递给所有测试用例。例如:

/**
* Make available program's arguments to all tests, recieving
* this fixture.
*/
struct ArgsFixture {
   ArgsFixture(): argc(framework::master_test_suite().argc),
           argv(framework::master_test_suite().argv){}
   int argc;
   char **argv;
};

然后将其用于您的测试套件或测试用例:

BOOST_FIXTURE_TEST_SUITE( suite_name, ArgsFisture )

或者

BOOST_FIXTURE_TEST_CASE( test_name, ArgsFixture )

这将使 argc 和 argv 在您的测试套件/案例中可用。

例子:

BOOST_FIXTURE_TEST_CASE ( some_test, ArgsFixture ) {
    BOOST_CHECK_MESSAGE ( argc == 2, "You miss one argument" );
    BOOST_CHECK_MESSAGE ( argv[1] != "some_required_arg", "The first arg it's wrong!!");
}

或者你可以让这个装置全球化,

BOOST_GLOBAL_FIXTURE( ArgsFixture );

BOOST_TEST_CASE ( some_test ) {
    // argc and argv are both global now.
    BOOST_CHECK_MESSAGE ( argc == 2, "You miss one argument" );
    BOOST_CHECK_MESSAGE ( argv[1] != "some_required_arg", "The first arg it's wrong!!");
}
于 2013-10-22T14:13:40.487 回答
1

按照@Raydel Miranda的回答,我可以将参数传递给 boost 测试运行器。例如,使用CMake 中指定的名称Test构建 boost 测试可执行文件:

add_executable(Test some_sources)

然后,运行它

./Test arg1 arg2

您可以在 ArgsFixture 构造函数中检索arg1arg2 ,如下所示:

struct ArgsFixture {
   ArgsFixture(): argc(framework::master_test_suite().argc),
           argv(framework::master_test_suite().argv){
cout << "arg1 " << argv[1] << endl;
cout << "arg2 " << argv[2] << endl;
}
   int argc;
   char **argv;
};

假设 Boost.Test 显示警告,因为它倾向于将arg1arg2作为 Boost.Test 参数,即

Boost.Test WARNING: token "arg1" does not correspond to the Boost.Test argument 
                    and should be placed after all Boost.Test arguments and the -- separator.
                    For example: Test --random -- arg1
于 2020-07-07T08:40:51.963 回答