【发布时间】:2011-10-06 15:26:33
【问题描述】:
我已经开始使用 googletest 来实施测试,并在有关 value-parameterized tests 的文档中偶然发现了这句话
- 您希望通过各种输入(也称为数据驱动)测试您的代码 测试)。这个功能很容易被滥用,所以请锻炼你的好 做的时候感觉!
我认为我在执行以下操作时确实在“滥用”系统,并希望听到您对此事的意见和意见。
假设我们有以下代码:
template<typename T>
struct SumMethod {
T op(T x, T y) { return x + y; }
};
// optimized function to handle different input array sizes
// in the most efficient way
template<typename T, class Method>
T f(T input[], int size) {
Method m;
T result = (T) 0;
if(size <= 128) {
// use m.op() to compute result etc.
return result;
}
if(size <= 256) {
// use m.op() to compute result etc.
return result;
}
// ...
}
// naive and correct, but slow alternative implementation of f()
template<typename T, class Method>
T f_alt(T input[], int size);
好的,所以有了这段代码,用随机生成的数据的不同输入数组大小来测试f()(通过与f_alt() 比较)来测试分支的正确性当然是有意义的。最重要的是,我有几个structs,比如SumMethod、MultiplyMethod 等,所以我也在为不同类型运行相当多的测试:
typedef MultiplyMethod<int> MultInt;
typedef SumMethod<int> SumInt;
typedef MultiplyMethod<float> MultFlt;
// ...
ASSERT(f<int, MultInt>(int_in, 128), f_alt<int, MultInt>(int_in, 128));
ASSERT(f<int, MultInt>(int_in, 256), f_alt<int, MultInt>(int_in, 256));
// ...
ASSERT(f<int, SumInt>(int_in, 128), f_alt<int, SumInt>(int_in, 128));
ASSERT(f<int, SumInt>(int_in, 256), f_alt<int, SumInt>(int_in, 256));
// ...
const float ep = 1e-6;
ASSERT_NEAR(f<float, MultFlt>(flt_in, 128), f_alt<float, MultFlt>(flt_in, 128), ep);
ASSERT_NEAR(f<float, MultFlt>(flt_in, 256), f_alt<float, MultFlt>(flt_in, 256), ep);
// ...
现在我的问题当然是:这有什么意义吗?为什么会不好?
事实上,我在使用floats 运行测试时发现了一个“错误”,其中f() 和f_alt() 由于四舍五入会给出不同的值SumMethod,我可以通过对输入数组进行预排序来改进等等。根据这次经验,我认为这实际上是一种很好的做法。
【问题讨论】:
标签: c++ testing googletest data-driven