В учебных целях я погрузился в область юнит-тестирования.Я прочитал несколько учебных пособий по этой проблеме с использованием QT и нашел следующее:
class QMyUnitTest : public QObject
{
Q_OBJECT
private:
bool isPrime(unsigned int ui);
private Q_SLOTS:
void myTest();
};
bool QMyUnitTest::isPrime(unsigned int n) {
typedef std::map<unsigned int, bool> Filter;
Filter filter;
for(unsigned int ui = 2; ui <= n; ui++) {
filter[ui] = true;
}
unsigned int ui = filter.begin()->first;
for(Filter::iterator it = filter.begin();
it != filter.end(); it++) {
if(it->second) {
for(unsigned int uj = ui * ui; uj <= n; uj += ui) {
filter[uj] = false;
}
}
ui++;
}
return filter[n];
}
void QMyUnitTest::myTest() {
}
QTEST_MAIN(QMyUnitTest)
#include "tst_myunittest.moc"
Я знаю, что мой основной алгоритм поиска неэффективен и особенно некорректен;это подразумевается таким образом.Теперь я хочу провести тщательное тестирование, но возник следующий вопрос:
Для правильного тестирования мне не нужно иметь очень точное представление о том, что может пойти не так?
Конечно, я могу пробежать первые 1000 простых чисел и проверить, получаются ли они true
или 1000, а не простые числа, и проверить, получаются ли они false
, но это может не уловить недостатки алгоритма (например,: return filter[n];
явно ужасно, поскольку filter[n]
может не существовать, если n<2
).
Какой смысл использовать модульное тестирование, если я уже должен знать, каковы потенциальные проблемы моей функции?
Я что-то не так делаю?Есть ли лучший способ проверить?