1. Проблемы с «пространством данных»
Ваш (плохой) код:
void f(int n, int increment)
{
while(n < 500)
{
cout << n;
n += increment;
}
}
Ваш тест:
f(200,100);
Ошибка в реальном мире:
f(200,0);
Моя точка зрения: ваш тест может охватывать 100% строк вашего кода, но он (как правило) не будет охватывать все ваше возможное пространство входных данных, то есть набор всех возможных значений входных данных.
2. Проверка на свою ошибку
Другой классический пример - когда вы просто принимаете плохое решение в дизайне и проверяете свой код на своем собственном плохом решении.
например. В техническом документе написано «печатать все простые числа до n », и вы печатаете все простые числа до n , но , исключая n И ваши юнит-тесты проверяют вашу неправильную идею.
3. Неопределенное поведение
Используйте значение неинициализированных переменных, вызовите недопустимый доступ к памяти и т. Д., И ваш код имеет неопределенное поведение (в C ++ или любом другом языке, который предполагает «неопределенное поведение»). Иногда он пройдет ваши тесты, но в реальном мире рухнет.
...