【问题标题】:Command line args in boost test升压测试中的命令行参数
【发布时间】:2012-12-17 19:25:40
【问题描述】:

我希望为我的 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

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

【问题讨论】:

  • 您能否向我们提供有关您正在做什么或遇到什么错误的更多详细信息?我敢打赌,您正在传递字符串常量。命令行参数必须是变量(可修改),不能是常量。向我们展示您的代码。
  • 你是什么意思命令行参数必须是可修改的变量??它们只是通过argv 进入程序的字符串。没有代码可看,因为我不知道如何告诉 boost 还有更多的命令行内容要处理。做一个空白测试,用“hello”作为命令参数调用它,就会发生堆错误。
  • 我的意思是命令行参数必须是可修改的,而不是字符串常量。如果它们通过argv 来,它们将是可修改的。但是,如果您尝试自己填写它们并使用常量,则它们不会。你能粘贴给出堆错误的实际代码吗——一个最小的例子。
  • 据我所知,C++ 命令行参数始终是字符串常量,无法修改。我真的不明白你在说什么。
  • 不,命令行参数总是可以修改的,这就是为什么 main 的原型在 argv 中没有 const。如果你传入常量,就会导致你描述的问题。

标签: c++ boost boost-test


【解决方案1】:

看看master test suite。 是

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

你想要什么?

【讨论】:

  • 这是你可以从中检索参数的地方,但是如果你传入任何 boost 测试框架不知道的东西,你就会从 MSVC 调试 c++ 运行时得到一个堆损坏错误。
  • 我无法通过将参数传递给测试模块来产生这样的错误。
  • 以下行对我来说运行良好 'test.exe erqwer wer w --log_level=all sfasdf as dfas --run_test=test_1 qwerqwer'
  • 是的,没有人能在我所处的环境之外重现这个问题。我在责备环境。
  • 删除参数和重新读取参数的代码。看到你的测试通过。再次添加参数而不阅读它们。看看会发生什么。
【解决方案2】:

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

【讨论】:

  • 这不能与error: ‘argc’ was not declared in this scopeerror: ‘argv’ was not declared in this scope 一起编译。
  • 最后一部分看起来不像一个全局夹具,坦率地说,我真的认为他们有时会过度使用宏。难怪人们在用宏语言编程时会出错。
【解决方案3】:

按照 @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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2015-12-10
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多