Статьи

Чистое модульное тестирование

Это легко писать «модульные тесты» , что использование JUnit и некоторые насмешливые библиотеки. Они могут создавать покрытие кода, которое удовлетворяет некоторые заинтересованные стороны, даже если тесты могут даже не быть модульными тестами, и тест может дать сомнительную ценность. Также  может быть очень легко написать модульные тесты, которые (в теории) являются модульными, но гораздо сложнее, чем базовый код, и, следовательно, просто добавляют к общей энтропии программного обеспечения .

Этот конкретный тип программного обеспечения энтропии имеет неприятную характеристику , что делает его еще труднее для базового программного обеспечения , чтобы быть изменено или на поверхность новых требований. Это как тест имеет отрицательное значение .

Правильно выполнить юнит-тестирование намного сложнее, чем думают люди. В этой статье я обрисую несколько советов, направленных на улучшение читабельности, удобства обслуживания и качества ваших модульных тестов.

Примечание: для фрагментов кода используется  Спок  . Для тех, кто не знает Спока, рассмотрите это очень мощный DSL вокруг JUnit, который добавляет некоторые приятные функции и сокращает многословность.

Причина неудачи

Модульный тест должен провалиться, только если есть проблема с тестируемым кодом . Модульный тест для класса DBService  должен завершиться неудачей, только  если есть ошибка с DBService, а не  если есть ошибка с любым другим классом, от которого он зависит. Таким образом, в модульном тесте для DBService единственным экземпляром объекта должен быть DBService. Любой другой объект, от которого зависит DBService, должен быть заглушен  или смоделирован .

В противном случае вы тестируете код за пределами DBService. В то время как вы можете (неправильно) думать, что это больше денег , поиск основной причины проблем займет больше времени. Если тест не пройден, это может быть связано с тем, что существует проблема с любым из нескольких классов, но вы не знаете, какой именно. Принимая во внимание, что, если это может произойти сбой только потому, что тестируемый код неверен, то вы знаете, что вы окажетесь ближе к месту возникновения проблемы гораздо быстрее.

Более того, такое мышление улучшит объектно-ориентированную природу вашего кода. Если тест не пройден только потому, что тестируемый код нарушен, это означает, что тест только проверяет обязанности класса и, таким образом, проясняет их. Если обязанности класса не ясны, или он не может ничего сделать без другого класса, или класс настолько тривиален, тест не имеет смысла, возникает вопрос, что с классом что-то не так с точки зрения общности его обязанностей ,

Единственное исключение не издевается или гася зависимый класс, если вы используете хорошо известный класс из библиотеки Java , например , String. В этом нет особого смысла заглушки или насмешки. Или класс зависимостей настолько прост, например, неизменяемый POJO, что не имеет большого значения, чтобы заглушки или насмешки над ним.

Заглушка и издевательство

Термины « издевательство»  и « заглушка»  часто можно использовать взаимозаменяемо, как если бы они были одним и тем же. Они не одно и то же . Так в чем же разница? Таким образом, если ваш тестируемый код имеет зависимость от объекта, для которого он никогда не вызывает метод для этого объекта, который имеет побочные эффекты , этот объект должен быть заглушен.

Принимая во внимание, что если у него есть зависимость от объекта, для которого он вызывает методы, которые имеют побочные эффекты,  то это должно быть посмешищем. Почему это важно? Потому что ваш тест должен проверять разные вещи в зависимости от типов отношений, которые он имеет с его зависимостями.

Допустим, ваш тестируемый объект — BusinessDelegate . BusinessDelegate получает запросы на редактирование BusinessEntities . Он выполняет простую бизнес-логику, а затем вызывает методы в DBFacade (класс фасада перед базой данных). Итак, тестируемый код выглядит так:


Джава