升压测试中的命令行参数

时间:2012-12-17 19:25:41

标签: c++ boost boost-test

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

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

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

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

编辑 - 最小的例子

#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

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

3 个答案:

答案 0 :(得分:12)

查看master test suite。 是

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

你想要什么?

答案 1 :(得分: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;
};

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

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!!");
}

答案 2 :(得分:0)

@Raydel Miranda 的回答之后,我可以将参数传递给boost测试运行程序。例如,使用在CMake中指定为 Test 的名称构建增强测试可执行文件:

add_executable(Test some_sources)

然后,使用

运行它
./Test arg1 arg2

您可以通过以下方式在ArgsFixture构造函数中检索 arg1 arg2

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显示警告,因为它倾向于将 arg1 arg2 作为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