gpt4 book ai didi

c++ - 数据驱动测试不好吗?

转载 作者:可可西里 更新时间:2023-11-01 15:07:01 28 4
gpt4 key购买 nike

我已经开始使用 googletest 来实现测试,并在关于 value-parameterized tests 的文档中偶然发现了这句话。

  • You want to test your code over various inputs (a.k.a. data-driven testing). This feature is easy to abuse, so please exercise your good sense when doing it!

我认为我在执行以下操作时确实在“滥用”系统,并希望听到您对此事的意见和意见。

假设我们有以下代码:

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 等,所以我也运行了大量的测试不同类型:

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 运行测试时,我发现了一个“错误”,其中 f()f_alt() 会给出由于舍入,SumMethod 的值不同,我可以通过对输入数组等进行预排序来改进这一点。根据这次经验,我认为这实际上是一种很好的做法。

最佳答案

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

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

此外,正如 Ben Voigt 在下面评论的那样, 使用随机数据进行测试是不够的。您需要识别算法中的极端情况并单独测试它们,并使用专门为这些情况量身定制的数据。但是,在我看来,当/如果您不确定自己是否了解所有极端情况时,使用随机数据进行额外测试也是有益的。您可能会使用随机数据偶然命中它们。

关于c++ - 数据驱动测试不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676622/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com