Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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, create a generic test which takes any type and range of values for that type.

like image 734
linux fanatic Avatar asked Dec 14 '11 15:12

linux fanatic


1 Answers

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 <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(); } 

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.

like image 71
Mike Kinghan Avatar answered Sep 22 '22 09:09

Mike Kinghan