Я начал использовать googletest для реализации тестов и наткнулся на эту цитату в документации, касающейся тестов с параметризацией по значениям
- Вы хотите протестировать свой код на различных входных данных (также называемое тестирование на основе данных). Этой функцией легко злоупотребить, поэтому, пожалуйста, проявите здравый смысл, делая это!
I думаю, что я действительно "злоупотребляю" системой, когда делаю следующее, и хотел бы услышать ваш вклад и мнение по этому поводу.
Предположим, у нас есть следующий код:
template
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
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
T f_alt(T input[], int size);
Итак, с этим кодом он определенно делает смысл протестировать f ()
(по сравнению с f_alt ()
) с разными размерами входных массивов случайно сгенерированных данных a для проверки правильности веток.Вдобавок у меня есть несколько структур
, например SumMethod
, MultiplyMethod
и т. Д., Поэтому я запускаю довольно много тестов также для разных типов:
typedef MultiplyMethod MultInt;
typedef SumMethod SumInt;
typedef MultiplyMethod MultFlt;
// ...
ASSERT(f(int_in, 128), f_alt(int_in, 128));
ASSERT(f(int_in, 256), f_alt(int_in, 256));
// ...
ASSERT(f(int_in, 128), f_alt(int_in, 128));
ASSERT(f(int_in, 256), f_alt(int_in, 256));
// ...
const float ep = 1e-6;
ASSERT_NEAR(f(flt_in, 128), f_alt(flt_in, 128), ep);
ASSERT_NEAR(f(flt_in, 256), f_alt(flt_in, 256), ep);
// ...
Теперь, конечно, мой вопрос: имеет ли это какой-то смысл и почему это должно быть плохо?
На самом деле, я обнаружил «ошибку» при запуске тестов с float
, где ] f ()
и f_alt ()
дадут разные значения с помощью SumMethod
из-за округления, которое я мог бы улучшить, предварительно отсортировав входной массив и т. д. Исходя из этого опыта, я считаю это действительно хорошая практика.