【问题标题】:Dealing with optional tests处理可选测试
【发布时间】:2014-07-10 08:06:37
【问题描述】:

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

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

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

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

  • 这一定是测试应用的某个旧版本。
  • 也许我忘了启用套件 X。
  • 可能有些东西坏了,我应该问开发人员。
  • 等等,也许他们只是被跳过了。但为什么?反正我会问开发者的。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    您可以通过以下方式获取与给定测试规范匹配的测试集:

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

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

    如果您在代码中搜索“class TestSpec”,您应该能够解决它 - 尽管您可能会发现使用 parseTestSpec() 从字符串中解析它更容易。

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

    【讨论】:

    • 感谢您的提示!我们没有太多跳过的测试,所以我可能不会经历所有这些麻烦(目前),但至少我知道这是可能的。
    【解决方案2】:

    不清楚您是否要求一种适用于 googletest 的技术, 或捕捉,或两者之一,或两者兼而有之。此答案适用于 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() 是一个布尔函数,用于查询是否存在 蜂鸣器。

    【讨论】:

    • 谢谢。 CATCH 的标签也可以做到这一点。但是,您的示例有点偏离,因为应该以编程方式确定蜂鸣器的可用性。这意味着运行测试的人不会明确决定包括/排除依赖于蜂鸣器的测试——程序会为他做这件事。再想一想,我意识到我可以在执行的最开始打印一条语句,指示是否找到了蜂鸣器。这样一来,误导性就小了一些,但仍然不清楚哪些案例被跳过了。
    猜你喜欢
    • 2019-04-07
    • 1970-01-01
    • 2016-04-25
    • 2014-07-27
    • 2017-06-07
    • 2011-05-29
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多