升压测试中的命令行参数

Edw*_*nge 4 c++ boost boost-test

我希望为我的boost测试处理额外的命令行参数.我正在使用它来自动测试一个功能,我需要指定诸如servername,user,pass等之类的东西......

当我将测试可执行的额外命令参数传递给已经编码为单元测试的那些参数时,我得到了一个堆损坏错误.

我已经左右搜索了,只是找到了获取这些参数的位置是很难的.现在看起来我可能还需要先设置它们,否则命令行解析器会做一些愚蠢的事情.

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

编辑 - 最小的例子

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

BOOST_AUTO_TEST_CASE(empty) {}
Run Code Online (Sandbox Code Playgroud)

称之为: exename hello

这似乎与任何事情无关.这个问题应该删除.我不能谈论我认为发生了什么,但我认为这可能与此有关:

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

**非常重要的是,任何看过这里的读者都知道这里的问题和答案没有用.我遇到的问题对我的环境非常具体,我无法谈论.我真的希望mods和人们会停止删除这个警告或让我删除它,但它是什么.不要被这只野鹅误入黑暗的小巷.**

ste*_*fan 12

看看主测试套件.是

boost::unit_test::framework::master_test_suite().argc
boost::unit_test::framework::master_test_suite().argv
Run Code Online (Sandbox Code Playgroud)

你想要什么?


Ray*_*nda 10

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

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

/**
* 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;
};
Run Code Online (Sandbox Code Playgroud)

然后将它用于测试套件或测试用例:

BOOST_FIXTURE_TEST_SUITE( suite_name, ArgsFisture )
Run Code Online (Sandbox Code Playgroud)

要么

BOOST_FIXTURE_TEST_CASE( test_name, ArgsFixture )
Run Code Online (Sandbox Code Playgroud)

这将使您的测试套件/案例中的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!!");
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使这个夹具全球化,

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!!");
}
Run Code Online (Sandbox Code Playgroud)