Google Test: есть ли способ объединить тест с параметризованным типом и параметризованным значением? - PullRequest
24 голосов
/ 14 декабря 2011

Я знаю, как разработать тест с параметризацией типа и тест с параметризацией по отдельности.То, что я пытаюсь выяснить, - возможно ли объединить оба.Другими словами, создайте общий тест, который принимает любой тип и диапазон значений для этого типа.

1 Ответ

19 голосов
/ 08 марта 2014

Не существует готовой комбинации тестов с параметризацией типа и тестов с параметризацией значения.Разработчикам googletest был задан вопрос, и они ответили: Нет.

Однако есть рутинный и простой способ (как предложил Чжаньюн Ван в связанном обсуждении), в котором вы можете создатьу вас есть тестовый набор с параметризацией типа, который проверяет некоторые условия для указанного диапазона значений типа параметра.Вот простейший пример, когда условие просто больше 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. Тем не менее, ошибочные значения могут быть представлены, как показано, поэтому грубое зерно вполне может быть допустимым.

...