缺少在CATCH,Google Test和其他框架中跳过测试的方法(至少在传统意义上,您指定了这样做的原因并在输出中看到它)让我觉得如果我需要它(我在过去的项目中一直使用UnitTest++)。
通常,是的,在桌面应用程序中不应该有任何理由跳过任何东西 - 无论是否进行测试。但是当谈到硬件时 - 有些事情是无法保证的。
例如,我有两个设备:一个带有嵌入式蜂鸣器,但另一个带有 - 没有。在UnitTest ++中,我会查询系统,发现蜂鸣器不可用,并且会跳过依赖它的测试。当然,在CATCH中,我可以做类似的事情:在初始化期间查询系统,然后只使用标记" beeper"排除所有测试。 (CATCH中的special feature)。
但是,有一点不同:测试人员(我以外的人)会读取输出而没有找到提到的那些可选测试(而在UnitTest ++中,他们被标记为跳过,原因是作为输出的一部分提供)。他的第一个想法是:
此外,他可能没有注意到那些测试被跳过,而他们可能实际上不应该(即操作系统返回"假",无论是否存在蜂鸣器,这是一个主要的错误)。一种选择是标记"跳过"测试通过,但这感觉就像一个不必要的解决方法。
是否有一些我不知道的聪明技术(即,我不知道,将可选测试完全分离为独立程序)?如果不是 - 我应该坚持使用UnitTest ++吗?它完成了这项工作,但我非常喜欢CATCH的SECTIONs和tags,有助于避免代码重复。
答案 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()
是一个布尔函数,用于查询是否存在
一个哔哔声。