我知道如何分别开发类型参数化测试和值参数化测试。我想弄清楚的是是否可以将两者结合起来。换句话说,创建一个通用测试,该测试采用该类型的任何类型和值范围。
问问题
8182 次
1 回答
33
类型参数化测试和值参数化测试没有任何现成的组合。googletest 开发人员被问到这个问题,他们说不。
但是,有一种常规且简单的方法(正如 Zhanyong Wan 在链接讨论中所建议的那样),您可以在其中制作自己的类型参数化测试用例,以测试参数类型的指定值范围的某些条件。这是一个基本示例,其中条件 is just大于 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 个。不过,可以报告失败的值,如图所示,因此粗粒度可能是可以容忍的。
于 2014-03-08T17:30:27.673 回答