【问题标题】:Catch dynamically pass arguments to test casesCatch 动态地将参数传递给测试用例
【发布时间】:2016-09-28 13:43:12
【问题描述】:

我有一个正在使用 Catch.cpp 进行测试的 C++ 项目:

我编译并运行以下文件来运行我的测试:

 #define CATCH_CONFIG_MAIN
 #include "catch.hpp"
 #include "test1.h"
 #include "test2.h"

在不久的将来,我会想要运行更复杂的测试,这些测试需要命令行参数。

换句话说,我想在我的测试运行中应用一些逻辑,能够从内部循环或条件运行它们并将变量传递给它们。

我找到了这个页面:Supply your own main

这似乎是一个很好的方向,但我找不到更详细的解释。

这可以通过 catch 来完成吗?或者也许有更好的方法来实现我所描述的?

【问题讨论】:

  • 您可能正在寻找参数化测试。但是,据我所知,Catch 还不支持它们。对于单元测试,您不会真的希望这些输入值在运行之间发生变化。
  • 您可能想要使用更高级的测试框架,例如google test

标签: c++


【解决方案1】:

我设法做的是编写自己的main,解析命令行并将所需的参数(在我的情况下为 IP)存储在全局变量中。不是最漂亮的代码,但可以完成工作:

#define CATCH_CONFIG_RUNNER
#include "catch.hpp"

std::string IP;

int main(int argc, char* const argv[])
{
    Catch::Session session;

    int returnCode = session.applyCommandLine(argc, argv, Catch::Session::OnUnusedOptions::Ignore);
    if (returnCode != 0)
        return returnCode;

    for (auto token : session.unusedTokens()) {
        printf("Token: %s\n", token.data.c_str());
        IP = token.data;
    }

    return session.run();
}

然后我以TestRunner.exe [test-case-tag] --MY_IP_HERE 运行它。注意参数前面没有“--”,它们不会出现在unusedTokens中。

【讨论】:

  • 这不再编译,因为OnUnusedOptionsunusedTokens() 不存在(不再存在)。
  • 不过,起作用的是添加您自己的命令行选项:github.com/catchorg/Catch2/blob/devel/docs/…
  • 我已经应用了这两种策略(添加一个新的命令行选项,并将其值存储到一个全局变量中)。尽管它有效,但我觉得这个解决方案相当违反直觉(我希望其他一些机制可以将命令行注入特定测试)。有没有其他方法可以将自定义参数注入特定测试?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2015-03-14
  • 1970-01-01
相关资源
最近更新 更多