Google Test: Is there a way to combine a test which is both type parameterized and value parameterized?

后端 未结 1 1499
再見小時候
再見小時候 2020-12-29 03:47

I know how to develop a type-parameterized test and value-parameterized test separately. What I am trying to figure out is if it\'s possible to combine both. In other words,

1条回答
  •  囚心锁ツ
    2020-12-29 04:03

    There isn't any ready-to-wear combination of type-parameterized tests and value-parameterized tests. The googletest developers have been asked the question and they said No.

    However, there is a routine and simple way (as suggested by Zhanyong Wan in the linked discussion) in which you can craft you own type-parameterised test case that tests some condition for a specified range of values of the parameter type. Here is an elementary example where the condition is just is greater than 0:

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

    When compiled and run the output of that is:

    [==========] 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
    

    The results have coarser granularity than would be ideal: just 3 tests rather than 9. Still, the failing values can be reported, as shown, so the coarse grain may well be tolerable.

    0 讨论(0)
提交回复
热议问题