
Мы ранее рассмотрели автоматические тесты и то, как сделать их специфичными, быстрыми и детерминированными при наличии параллелизма. Но есть много других свойств, которыми мы хотим, чтобы наши тесты обладали; некоторые из моих любимых:
- Вдохновляющий, т.е. каждое пройденное испытание придает вам уверенности.
- Конкретные, т.е. причина отказа очевидна из теста.
- Прогноз, т.е. нет провала значит все хорошо.
(Дополнительные свойства см. в отличном посте Кента Бека Test Desiderata.)
Все они имеют общую тему специфичности. (1) утверждает, что тест не должен проверять нулевые свойства. (2) утверждает, что тест не должен проверять несколько свойств. (3) утверждает, что в совокупности наши тесты должны быть завершены.
Написание конкретных тестов сложно, потому что нам нужно определить, как код может дать сбой. Чтобы помочь в этом, у нас есть несколько эвристик, таких как проверка границ или эвристика Майерса: «Вы можете одновременно тестировать много положительных случаев, но только один отрицательный».

Упражняться
Чтобы попрактиковаться в написании конкретных тестов, я создал репозиторий GitHub с девятью разными версиями одной и той же функции. Все они выглядят естественно, но у всех есть баги, кроме одного. Что-то вроде Где Уолдо, но с ошибками. Функция имеет довольно простое назначение:
- взять массив поплавков,
- найти среднее и
- вычесть среднее значение из каждого элемента.
Упражнение простое: создайте набор тестов, чтобы отсеять все плохие реализации. Иметь ввиду:
- Хороший тест проверяет что-то — т.е. выходит из строя хотя бы одна из ошибочных программ.
- Хороший тест специфичен — т.е. терпит неудачу как можно меньше реализаций. (Только один из моих тестов провалил более одной реализации.)
- Хороший тест правильный — т.е. никогда не подводит рабочая реализация.
- Хороший комплект должен быть полным, т.е. не удается все, кроме рабочей реализации.
В моем окончательном наборе тестов 11 тестовых случаев, сколько в вашем решении? Комментарий ниже.
Если вам нравятся подобные вещи, вы, вероятно, гордитесь своими техническими знаниями, тогда вам, вероятно, также понравится моя книга по рефакторингу:
