Я начал использовать 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, где f()
и f_alt()
дал бы другие значения с SumMethod
из-за округления, которое я мог бы улучшить, предварительно отсортировав входной массив и т. д. Из этого опыта я считаю это на самом деле несколько хорошей практикой.