Плохо ли тестирование на основе данных?

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

11
задан Vadim Kotov 20 August 2018 в 11:11
поделиться