首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据驱动测试不好吗?

数据驱动测试不好吗?
EN

Stack Overflow用户
提问于 2011-10-06 15:26:33
回答 2查看 1.7K关注 0票数 11

我已经开始使用googletest来实现测试,并且在有关值-参数化测试的文档中偶然发现了这个引号。

  • 您希望在各种输入(a.k.a )上测试您的代码。数据驱动测试)。这个功能很容易被滥用,所以在做它的时候请好好锻炼你的判断力!

我想我确实是在“滥用”系统做以下工作,我想听听你对这件事的意见和意见。

假设我们有以下代码:

代码语言:javascript
复制
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,如SumMethodMultiplyMethod等,所以我正在为不同的类型运行大量的测试:

代码语言:javascript
复制
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中给出了不同的值,我可以通过预先设置输入数组等来改进它。根据这一经验,我认为这实际上是一种不错的做法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-08 18:08:21

我认为主要的问题是用“随机生成的数据”进行测试。从您的问题中还不清楚,每次运行测试工具时,是否会重新生成这些数据。如果是的话,那么您的测试结果是不可复制的。如果某些测试失败了,那么每次运行它时,它都应该失败,而不是在某个奇怪的随机测试数据组合中运行一次。

因此,在我看来,您应该预先生成您的测试数据,并将其作为测试套件的一部分。您还需要确保数据集足够大、足够多样,以提供足够的代码覆盖率。

此外,正如Ben在下面评论的那样,仅用随机数据进行测试是不够的。您需要识别算法中的角案例,并分别对它们进行测试,并为这些情况专门定制数据。然而,在我看来,当/如果你不确定你是否知道你所有的角落情况时,用随机数据进行额外的测试也是有益的。你可能会偶然使用随机数据击中他们。

票数 11
EN

Stack Overflow用户

发布于 2011-10-06 15:30:45

问题是,您不能像处理ints那样在浮点数上断言正确性。

在某个epsilon内检查正确性,这是计算值和期望值之间的一个微小差异。这是你能做的最好的了。这对所有浮点数都是正确的。

我认为在执行以下操作时,我确实是在“滥用”系统

在你读那篇文章之前,你认为这很糟糕吗?你能说出它的坏处吗?

您必须在某个时候测试此功能。你需要数据才能这么做。虐待在哪里?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7676622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档