【问题标题】:Google Test: Is there a way to combine a test which is both type parameterized and value parameterized?谷歌测试:有没有办法结合类型参数化和值参数化的测试?
【发布时间】:2012-01-20 09:34:31
【问题描述】:

我知道如何分别开发类型参数化测试和值参数化测试。我想弄清楚的是是否可以将两者结合起来。换句话说,创建一个通用测试,该测试采用该类型的任何类型和值范围。

【问题讨论】:

    标签: unit-testing googletest parameterized-unit-test


    【解决方案1】:

    类型参数化测试没有任何现成的组合 和值参数化测试。 googletest 开发者一直是asked the question and they said No.

    但是,有一种常规且简单的方法(正如 Zhanyong Wan 在链接讨论中所建议的那样),您可以在其中制作自己的 类型参数化的测试用例,用于测试指定范围内的某些条件 参数类型的值。这是一个基本示例,其中 条件只是大于0:

    #include <vector>
    #include "gtest/gtest.h"
    
    template<class T>
    struct foo_test : public ::testing::Test {
        static std::vector<T> _range_;
    };
    
    TYPED_TEST_CASE_P(foo_test);
    
    TYPED_TEST_P(foo_test, IsGreaterThanZero) {
        for (TypeParam value : foo_test<TypeParam>::_range_) {
            EXPECT_GT(value,0);
        }
    }
    
    REGISTER_TYPED_TEST_CASE_P(foo_test,IsGreaterThanZero);
    
    typedef ::testing::Types<char, int, float> MyTypes;
    INSTANTIATE_TYPED_TEST_CASE_P(My, foo_test, MyTypes);
    
    template<> std::vector<char> foo_test<char>::_range_{'1','2','3'};
    template<> std::vector<int> foo_test<int>::_range_{1,2,3};
    template<> std::vector<float> foo_test<float>::_range_{1.1,2.2,0.0};
    
    int main(int argc, char **argv) {
      ::testing::InitGoogleTest(&argc, argv);
      return RUN_ALL_TESTS();
    }
    

    编译运行后的输出是:

    [==========] Running 3 tests from 3 test cases.
    [----------] Global test environment set-up.
    [----------] 1 test from My/foo_test/0, where TypeParam = char
    [ RUN      ] My/foo_test/0.IsGreaterThanZero
    [       OK ] My/foo_test/0.IsGreaterThanZero (0 ms)
    [----------] 1 test from My/foo_test/0 (0 ms total)
    
    [----------] 1 test from My/foo_test/1, where TypeParam = int
    [ RUN      ] My/foo_test/1.IsGreaterThanZero
    [       OK ] My/foo_test/1.IsGreaterThanZero (0 ms)
    [----------] 1 test from My/foo_test/1 (0 ms total)
    
    [----------] 1 test from My/foo_test/2, where TypeParam = float
    [ RUN      ] My/foo_test/2.IsGreaterThanZero
    /home/imk/develop/SO/gtest/main.cpp:14: Failure
    Expected: (value) > (0), actual: 0 vs 0
    [  FAILED  ] My/foo_test/2.IsGreaterThanZero, where TypeParam = float (0 ms)
    [----------] 1 test from My/foo_test/2 (1 ms total)
    
    [----------] Global test environment tear-down
    [==========] 3 tests from 3 test cases ran. (1 ms total)
    [  PASSED  ] 2 tests.
    [  FAILED  ] 1 test, listed below:
    [  FAILED  ] My/foo_test/2.IsGreaterThanZero, where TypeParam = float
    
    1 FAILED TEST
    

    结果的粒度比理想的要粗:只有 3 个测试而不是 大于 9。仍然可以报告失败的值,如图所示,因此粗粒度很可能是 可以忍受。

    【讨论】:

    • 知道如何在不进行硬编码的情况下获得类型/值参数的笛卡尔积吗?
    • 要非常清楚,您希望为一组值V0,..,Vm 中的每一个测试T0,..,Tn 中的每个类型,这样Ti 可以从Vj 构造为任何@987654328 @ 和 j &lt;= m。对吗?
    • 对,但不确定您所说的“Ti 可从 Vj 构造”是什么意思。我举个例子让你更清楚:假设我有三种类型 {T1,T2,T3} 和两个值参数 {V1,V2},我想针对以下元组进行测试:{(T1,V1), (T1,V2),(T1,V3),(T2,V1),(T2,V2)等...}。关键是,我有很多参数和类型要测试,我无法对所有参数和类型进行硬编码。
    • 有没有常见的Vs类型?甚至必须进行值参数化测试。
    • 不是真的,我主要使用数字类型,例如 char,uchar,ushort,short,int,float,double。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多