Java: Автоматическое тестирование
Теория: Матчеры
Существует несколько популярных способов описывать утверждения. Кроме вызова обычных методов, популярностью пользуются "матчеры", которые внешне выглядят как мини-язык для описания проверок. Мы уже начали с ними знакомиться на прошлом уроке.
Матчеры стали популярны в тестовых фреймворках после появления подхода BDD (Behaviour Driven Development, разработка через поведение). Технически, такой подход стремится сделать тесты похожими на словесное описание выполняемой задачи. Это даёт возможность использовать их как документацию людям, которые не умеют программировать (В идеале, на практике всё сложнее). Матчеры заменили собой обычные утверждения на функциях во многих языках:
Любой матчер в AssertJ начинается с метода assertThat(data), в которую передаются данные на проверку. Затем assertThat возвращает специальный объект, у которого уже можно вызывать различные матчеры для проверки. В AssertJ десятки матчеров для самых разнообразных ситуаций. Такое количество объясняется желанием выдавать максимально точный отчёт о том что произошло.
Предположим, что метод возвращает массив и мы хотим проверить его размер. Для этого можно воспользоваться матчером isEqualTo:
Этот матчер прекрасно справится с задачей. Но в случае ошибки его вывод не слишком информативен:
Поэтому лучше взять специализированный матчер для проверки размера массива:
Тогда вывод расскажет гораздо больше:
Благодаря тому, что в assertThat() передаётся сам массив, а не его длина, у AssertJ появляется возможность выводить содержимое массива в случае ошибки. Это, опять же, упрощает отладку.
Ниже пример некоторых популярных матчеров, полезных в ежедневном тестировании:
Кроме того, практически все матчеры обладают как "позитивной" так и "негативной" версией:
Отдельно стоит выделить матчеры, которые работают с экземплярами классов. Для Java, как для ООП-языка, это особенно важно. В AssertJ есть матчеры, которые могут "обходить" переданные экземпляры классов и сравнивать их по отдельным полям.
Весь перечень подобных матчеров и примеров их использования можно найти в официальной документации AbstractObjectAssert.
Библиотека AssertJ позволяет собирать несколько тестов в один вызов:
Такие тесты выполняются последовательно. Если провалится одно утверждение, то следующие за ним уже проверяться не будут. Это становится очевидным, если вспомнить, что при провале теста пробрасывается исключение.




