3

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

通常,是的,不应该有任何理由跳过桌面应用程序中的任何内容——你要么测试它,要么不测试。但是在硬件方面——有些事情是无法保证的。

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

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

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

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

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

4

2 回答 2

1

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

您可以获得与给定测试规范匹配的一组测试,如下所示:

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

testSpec 是TestSpec. 您可以从中获取当前的config.testSpec()- 或者您可以即时创建它(如果您以编程方式过滤测试,您可能需要这样做。目前还没有真正记录,因为我想回顾整个测试规范的东西并重做它。碰巧我上周做了。希望现在应该相当稳定 - 但我在提交文档之前让它安顿下来。

如果您在代码中搜索“class TestSpec”,您应该能够解决它 - 尽管您可能会发现使用parseTestSpec().

您可以使用getCurrentContext().getConfig().

于 2014-05-26T15:20:11.673 回答
0

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

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

以下是它用于测试套件的示例,其中可能会或可能不会启用蜂鸣器:

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();
}

wherehave_beeper()是一个查询蜂鸣器是否存在的布尔函数。

于 2014-05-22T14:50:47.733 回答