私は 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
実際、 s wheref()
とf_alt()
を使用してテストを実行すると、丸めのために異なる値が返される「バグ」が見つかりましたSumMethod
。これは、入力配列を事前に並べ替えることなどで改善できます。