处理可选测试

时间:2014-05-21 15:13:29

标签: unit-testing testing googletest unittest++ catch-unit-test

缺少在CATCHGoogle Test和其他框架中跳过测试的方法(至少在传统意义上,您指定了这样做的原因并在输出中看到它)让我觉得如果我需要它(我在过去的项目中一直使用UnitTest++)。

通常,是的,在桌面应用程序中不应该有任何理由跳过任何东西 - 无论是否进行测试。但是当谈到硬件时 - 有些事情是无法保证的。

例如,我有两个设备:一个带有嵌入式蜂鸣器,但另一个带有 - 没有。在UnitTest ++中,我会查询系统,发现蜂鸣器不可用,并且会跳过依赖它的测试。当然,在CATCH中,我可以做类似的事情:在初始化期间查询系统,然后只使用标记" beeper"排除所有测试。 (CATCH中的special feature)。

但是,有一点不同:测试人员(我以外的人)会读取输出而没有找到提到的那些可选测试(而在UnitTest ++中,他们被标记为跳过,原因是作为输出的一部分提供)。他的第一个想法是:

  • 这必须是测试应用程序的旧版本。
  • 也许我忘了启用X套件。
  • 可能有些东西坏了,我应该问开发商。
  • 等等,也许他们刚被跳过。但为什么?无论如何,我会问开发者。

此外,他可能没有注意到那些测试被跳过,而他们可能实际上不应该(即操作系统返回"假",无论是否存在蜂鸣器,这是一个主要的错误)。一种选择是标记"跳过"测试通过,但这感觉就像一个不必要的解决方法。

是否有一些我不知道的聪明技术(即,我不知道,将可选测试完全分离为独立程序)?如果不是 - 我应该坚持使用UnitTest ++吗?它完成了这项工作,但我非常喜欢CATCH的SECTIONstags,有助于避免代码重复。

2 个答案:

答案 0 :(得分:1)

如果您以编程方式检测到蜂鸣器的可用性,那么您还可以打印出您正在跳过的测试。

您可以使用以下内容获得与给定测试规范匹配的测试集:

  std::vector<TestCase> matchedTestCases;
  getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases );

testSpec是TestSpec的一个实例。您可以从config.testSpec()获取当前的一个 - 或者您可以动态创建它(如果您以编程方式过滤测试,则可能需要这样做。目前还没有真正记录为我本来想回过整个测试规范的东西并重做它。就像我上周那样做了。希望现在这应该是相当稳定的 - 但是我在提交文档之前让它解决了。

如果您搜索&#34;类TestSpec&#34;您应该能够解决这个问题。在代码中 - 尽管您可能会发现使用parseTestSpec()更容易从字符串中解析它。

您可以使用getCurrentContext().getConfig()获取配置对象。

答案 1 :(得分:0)

目前还不清楚您是否要求采用适用于googletest的技术, 或CATCH,或其中之一,或两者兼而有之。这个答案适用于googletest。

跳过不需要的测试的惯用技术是使用命令行 为此目的提供的选项--gtest_filter。 请参阅Documentation

这是一个用于测试套件的示例,其中蜂鸣器可能或 可能未启用:

<强> test_runner.cpp

#include "gtest/gtest.h"

TEST(t_with_beeper, foo) {
    SUCCEED(); // <- Your test code here
}

TEST(t_without_beeper, foo) {
    SUCCEED(); // <- Your test code here
}

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

执行命令

./test_runner --gtest_filter=t_with_beeper*

输出:

Note: Google Test filter = t_with_beeper*
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from t_with_beeper
[ RUN      ] t_with_beeper.foo
[       OK ] t_with_beeper.foo (0 ms)
[----------] 1 test from t_with_beeper (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.

执行命令

./test_runner --gtest_filter=t_without_beeper*

输出:

Note: Google Test filter = t_without_beeper*
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from t_without_beeper
[ RUN      ] t_without_beeper.foo
[       OK ] t_without_beeper.foo (0 ms)
[----------] 1 test from t_without_beeper (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.

该报告没有逐项列出跳过的测试,但它使得相当明显 是否启用了蜂鸣器测试,这应该足够了 预先防止你担心的任何误解或怀疑。

要在test_runner中启用或停用蜂鸣器测试,您可以使用 喜欢:

using namespace std;

int main(int argc, char **argv)
{   
    vector<char const *> args(argv,argv + argc);
    int nargs = argc + 1;
    if (have_beeper()) {
        args.push_back("--gtest_filter=t_with_beeper*");
    } else {
        args.push_back("--gtest_filter=t_without_beeper*");
    }
    ::testing::InitGoogleTest(&nargs,const_cast<char **>(args.data()));
    return RUN_ALL_TESTS();
}

其中have_beeper()是一个布尔函数,用于查询是否存在 一个哔哔声。