Я начал использовать googletest для проведения тестов и наткнулся на эту цитату в документации по параметризованным параметрам
- Вы хотите протестировать свой код на разных входах (a.k.a. тестирование). Эта функция проста в использовании, поэтому, пожалуйста, смысл при этом!
Я думаю, что я действительно "злоупотребляю" системой, когда делаю следующее и хотел бы услышать ваши замечания и мнения по этому вопросу.
Предположим, что мы имеем следующий код:
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
, где f()
и f_alt()
будут давать разные значения с помощью SumMethod
из-за округления, что я мог бы улучшить, предварительно задав входной массив и т.д... Из этого опыта я считаю это на самом деле несколько хорошей практикой.