Unit testing 处理可选测试
由于缺少跳过测试的方法,以及其他框架(至少在传统意义上,您可以指定这样做的原因并在输出中看到它),我开始思考是否需要它(我在过去的项目中一直在使用) 正常情况下,是的,在桌面应用程序中不应该有任何理由跳过任何东西——你要么测试它,要么不测试。但说到硬件,有些东西是无法保证的 例如,我有两个设备:一个带有嵌入式寻呼机,另一个没有。在UnitTest++中,我会查询系统,发现寻呼机不可用,然后跳过依赖它的测试。当然,在CATCH中,我可以做类似的事情:在初始化期间查询系统,然后用标记“beeper”(In-CATCH)排除所有测试 但是,有一点不同:测试人员(除了我之外的其他人)会读取输出,却找不到提到的可选测试(而在UnitTest++中,这些测试会被标记为跳过,并且原因会作为输出的一部分提供)。他最初的想法是:Unit testing 处理可选测试,unit-testing,testing,googletest,unittest++,catch-unit-test,Unit Testing,Testing,Googletest,Unittest++,Catch Unit Test,由于缺少跳过测试的方法,以及其他框架(至少在传统意义上,您可以指定这样做的原因并在输出中看到它),我开始思考是否需要它(我在过去的项目中一直在使用) 正常情况下,是的,在桌面应用程序中不应该有任何理由跳过任何东西——你要么测试它,要么不测试。但说到硬件,有些东西是无法保证的 例如,我有两个设备:一个带有嵌入式寻呼机,另一个没有。在UnitTest++中,我会查询系统,发现寻呼机不可用,然后跳过依赖它的测试。当然,在CATCH中,我可以做类似的事情:在初始化期间查询系统,然后用标记“beeper”
- 这一定是测试应用程序的旧版本
- 也许我忘了启用suitex
- 可能有东西坏了,我应该问问开发者
- 等等,也许他们只是被跳过了。但是为什么呢?无论如何,我会问开发者
是否有一些聪明的技巧我不知道(例如,我不知道,将可选测试分离成一个独立的程序)?如果不是,那么我应该坚持使用UnitTest++吗?它确实起到了作用,但我真的很喜欢CATCH's,它有助于避免代码重复。不清楚您是否要求一种适用于googletest的技术, 或者抓,或者要么抓,或者两者都抓。这个答案适用于谷歌测试 跳过不需要的测试的惯用方法是使用命令行 为此目的提供的选项,
--gtest_filter
。
看
下面是一个使用它的测试套件的例子,其中一个蜂鸣器可能会
可能未启用:
测试跑步者.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();
}
输出:
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.
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.
运行:
输出:
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.
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\u runner
中启用或禁用蜂鸣器测试,您可以使用
例如:
使用名称空间std;
int main(int argc,字符**argv)
{
向量args(argv,argv+argc);
int nargs=argc+1;
如果(有呼机()){
args.push_back(“--gtest_filter=t_with_beeper*”);
}否则{
参数。将_向后推(“--gtest_filter=t_,不带_蜂鸣器*”;
}
::测试::InitGoogleTest(&nargs,const_cast(args.data());
返回运行所有测试();
}
其中have_beeper()
是一个布尔函数,用于查询
寻呼机。如果您通过编程方式检测寻呼机的可用性,那么您也可以打印出跳过的测试 您可以通过以下方式获得与给定测试规范匹配的测试集:
std::vector<TestCase> matchedTestCases;
getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases );
std::向量匹配测试用例;
getRegistryHub().getTestCaseRegistry().getFilteredTests(testSpec、config、matchedTestCases);
testSpec是testSpec
的一个实例。您可以从config.testSpec()
中获取当前版本,也可以动态创建(如果您正在以编程方式筛选测试,您可能需要这样做。目前还没有真正的文档记录,因为我想回顾整个测试规范并重新编写它。碰巧我上周做了。希望现在应该相当稳定-但在提交文档之前,我会让它稳定下来
如果您在代码中搜索“class TestSpec”,您应该能够找到它,尽管您可能会发现使用parseTestSpec()
从字符串中解析它更容易
您可以使用
getCurrentContext().getConfig()获取配置对象
谢谢。CATCH的标记也可以做到这一点。但是,您的示例有点不对劲,因为蜂鸣器的可用性应该通过编程来确定。这意味着运行测试的人没有明确决定是否包含/排除依赖于蜂鸣器的测试-程序会为他这样做。在我考虑了关于这一点,我意识到我可以在执行的一开始就打印一条语句,指示是否找到了寻呼机。这样就少了一点误导性,但仍然不清楚到底跳过了哪些案例。谢谢提示!我们没有太多跳过的测试,所以我可能不会经历所有这些测试(目前)是双倍的,但至少我知道这是可能的。
std::vector<TestCase> matchedTestCases;
getRegistryHub().getTestCaseRegistry().getFilteredTests( testSpec, config, matchedTestCases );