Google测试:有没有一种方法可以组合类型参数化和值参数化的测试? [英] Google Test: Is there a way to combine a test which is both type parameterized and value parameterized?

查看:98
本文介绍了Google测试:有没有一种方法可以组合类型参数化和值参数化的测试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.

推荐答案

类型参数化测试没有现成的组合 和参数化测试. googletest开发人员已提出了 问题,他们说不.

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.

但是,有一种常规而简单的方法(如詹永勇在链接的讨论中所建议的),您可以手工制作自己的东西 类型参数化的测试用例,用于测试指定范围内的某些条件 参数类型的值.这是一个基本示例,其中 条件就是大于0 :

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

结果具有比理想情况更粗糙的粒度:仅进行3次测试 大于9.仍然可以报告失败值,如图所示,因此粗颗粒很可能是 可以忍受的.

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.

这篇关于Google测试:有没有一种方法可以组合类型参数化和值参数化的测试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆