我已经开始使用 googletest 来实现测试,并在有关值参数化测试的文档中偶然发现了这句话
- 您想通过各种输入测试您的代码(也称为数据驱动测试)。此功能很容易被滥用,所以请在使用时锻炼您的良好意识!
我认为我在执行以下操作时确实“滥用”了系统,并希望听到您对此事的意见和意见。
假设我们有以下代码:
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
like 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);
// ...
当然,现在我的问题是:这有什么意义吗?为什么会这样?
事实上,我在使用float
s where运行测试时发现了一个“错误”,f()
并且由于四舍五入f_alt()
会给出不同的值,我可以通过对输入数组等进行预排序来改进它。根据这次经验,我认为这实际上是一种很好的做法。SumMethod