我已经开始使用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,如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运行测试时,我发现了一个"bug“,其中f()和f_alt()由于舍入而在SumMethod中给出了不同的值,我可以通过预先设置输入数组等来改进它。根据这一经验,我认为这实际上是一种不错的做法。
发布于 2011-10-08 18:08:21
我认为主要的问题是用“随机生成的数据”进行测试。从您的问题中还不清楚,每次运行测试工具时,是否会重新生成这些数据。如果是的话,那么您的测试结果是不可复制的。如果某些测试失败了,那么每次运行它时,它都应该失败,而不是在某个奇怪的随机测试数据组合中运行一次。
因此,在我看来,您应该预先生成您的测试数据,并将其作为测试套件的一部分。您还需要确保数据集足够大、足够多样,以提供足够的代码覆盖率。
此外,正如Ben在下面评论的那样,仅用随机数据进行测试是不够的。您需要识别算法中的角案例,并分别对它们进行测试,并为这些情况专门定制数据。然而,在我看来,当/如果你不确定你是否知道你所有的角落情况时,用随机数据进行额外的测试也是有益的。你可能会偶然使用随机数据击中他们。
发布于 2011-10-06 15:30:45
问题是,您不能像处理ints那样在浮点数上断言正确性。
在某个epsilon内检查正确性,这是计算值和期望值之间的一个微小差异。这是你能做的最好的了。这对所有浮点数都是正确的。
我认为在执行以下操作时,我确实是在“滥用”系统
在你读那篇文章之前,你认为这很糟糕吗?你能说出它的坏处吗?
您必须在某个时候测试此功能。你需要数据才能这么做。虐待在哪里?
https://stackoverflow.com/questions/7676622
复制相似问题