Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 处理可选测试_Unit Testing_Testing_Googletest_Unittest++_Catch Unit Test - Fatal编程技术网

Unit testing 处理可选测试

Unit testing 处理可选测试,unit-testing,testing,googletest,unittest++,catch-unit-test,Unit Testing,Testing,Googletest,Unittest++,Catch Unit Test,由于缺少跳过测试的方法,以及其他框架(至少在传统意义上,您可以指定这样做的原因并在输出中看到它),我开始思考是否需要它(我在过去的项目中一直在使用) 正常情况下,是的,在桌面应用程序中不应该有任何理由跳过任何东西——你要么测试它,要么不测试。但说到硬件,有些东西是无法保证的 例如,我有两个设备:一个带有嵌入式寻呼机,另一个没有。在UnitTest++中,我会查询系统,发现寻呼机不可用,然后跳过依赖它的测试。当然,在CATCH中,我可以做类似的事情:在初始化期间查询系统,然后用标记“beeper”

由于缺少跳过测试的方法,以及其他框架(至少在传统意义上,您可以指定这样做的原因并在输出中看到它),我开始思考是否需要它(我在过去的项目中一直在使用)

正常情况下,是的,在桌面应用程序中不应该有任何理由跳过任何东西——你要么测试它,要么不测试。但说到硬件,有些东西是无法保证的

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

但是,有一点不同:测试人员(除了我之外的其他人)会读取输出,却找不到提到的可选测试(而在UnitTest++中,这些测试会被标记为跳过,并且原因会作为输出的一部分提供)。他最初的想法是:

  • 这一定是测试应用程序的旧版本
  • 也许我忘了启用suitex
  • 可能有东西坏了,我应该问问开发者
  • 等等,也许他们只是被跳过了。但是为什么呢?无论如何,我会问开发者
此外,他无法注意到这些测试被跳过了,而实际上它们可能不应该被跳过(即操作系统返回“false”,而不管寻呼机是否在那里,这是一个主要的错误)。一种选择是将“跳过的”测试标记为通过,但这感觉像是一种不必要的解决方法


是否有一些聪明的技巧我不知道(例如,我不知道,将可选测试分离成一个独立的程序)?如果不是,那么我应该坚持使用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 );