Проще говоря, IMO-тестирование того, что метод не делает , может быть очень скользким, так как вы можете придумывать все больше и больше сценариев, когда вы думаете об этом.Иначе говоря, утверждение, что ваш код выполняет то, что вы намеревались сделать, в значительной степени является целью модульного тестирования.
Есть два простых вопроса, которые обычно помогают мне определитьподозрительный тест и выяснение, имеет ли смысл тест:
- какую часть желаемой функциональности выполняет тест?
- какое простое изменение я могу сделать в тестируемом классе, чтобы прервать тест?
Обратите внимание, что чрезвычайно легко иметь дело с этими вопросами, имея в виду второй тест (_CorrectCount
).На самом деле мы не видели Add
код метода, но мы, скорее всего, можем дать достойную догадку, что можно изменить, чтобы нарушить этот тест.Проверенная функциональность еще более очевидна.Ответы интуитивно понятны и выглядят быстро (что хорошо!).
Теперь давайте попробуем ответить на эти вопросы для первого теста (_NoException
).Это сразу поднимает новые вопросы ( Является ли рабочий код реальной функциональностью? Разве это не очевидно? Разве это не подразумевается? Разве это не то, к чему мы всегда стремимся? Почему нет конца в конце? Как я могузаставить его потерпеть неудачу? ).Что касается второго вопроса, то это еще хуже - для того, чтобы пройти этот тест, вероятно, потребовалось бы явное выбрасывание исключения ... с которым мы все согласны, это не тот путь.
Вывод
Прост.Второй тест - прекрасный пример хорошо написанного блока теста .Это коротко, оно проверяет одну вещь, это легко понять.Первый тест не является .Даже несмотря на то, что он такой же короткий и (что кажется) простым, он вводит новые вопросы (хотя он действительно должен отвечать на уже поставленные вопросы - Действительно ли Add
добавляет? Да. ) - и какрезультат приносит ненужную сложность.