Полный гайд по тестированию на Flutter. Часть 2: Простые модульные тесты
Перед тем, как приступить к разбору нескольких примеров хочу пригласить вас в наш авторский телеграмм-канал Flutter.Много. Мы с командой мобильных разработчиков Amiga рассказываем о личном опыте, делимся полезными плагинами\библиотеками, переводами статей и кейсами. Присоединяйтесь!
Простой Unit-тест
Представим, что нам нужно протестировать функцию входа в приложение с функциями валидации email и пароля.
Используем две статичные функции.
Затем метод расширения под названием isNullOrEmpty.
И наконец, функция входа.
Полный исходный код можно найти по ссылке: https://github.com/ntminhdn/testing_examples/tree/main/lib/part2
Необходимо протестировать 4 функции, которые находятся в 3 разных файлах, поэтому создаем 3 файла для тестов в папке test. Чтобы различать файлы unit-тестов и файлы, относящиеся к другим методам тестирования, таким как Widget-тесты, назовем папку unit_test внутри папки test.
Naming convention для файлов с тестами гласит, что для названия файла нужно использовать код и суффикс _test.dart. И еще одно правило — структура папки test должна повторять структуру папки lib, как показано в примере:
Сначала напишем тесты для функции validateEmail. Каждый файл должен начинаться с функции main() как точки входа. Для написания Unit-тестов нужно импортировать пакет flutter_test.
Для того, чтобы создать Unit-тест, используем функцию test, передавая ей 2 параметра: description и body.
Не важно короткие или длинные наименования самих тестов. Главное, чтобы они были простыми для понимания без чтения кода.
Для тела теста обычно используется паттерн ААА: сначала, подготавливаем все необходимое (Arrange), потом выполняем нужное действие (Act) и проверяем его результат (Assert).
- Arrange — шаг, где создаем переменные и входные данные перед вызовом функции, которую хотим протестировать.
Например, если нужно проверить функцию validateEmail когда email не пустой, то нужно создать переменную String validEmail = ‘test@example.com’. - Act — вызов функции, которую нужно протестировать с уже подготовленными на прошлом шаге входными данными: Validator.validateEmail(validEmail).
- Assert — шаг, где проверяем соответствует ли результат ожиданиям, используя функцию expect.
Например: expect(result, true), expect(result, 1000), expect(result, “Minh”), …
Итак, один Unit-тест описан. Теперь функция validateEmail должна быть протестирована еще для одного случая: когда email пустой, она должна вернуть false.
Напишем Unit-тесты для функции validatePassword в похожем виде.
Теперь в файле utils_test.dart есть 4 тестовых кейса. Нужно сгруппировать их по самим функциям, используя group.
Для того, чтобы запустить Unit-тесты, набираем в консоли команду flutter test или нажимаем Run или Debug в IDE, как на картинке ниже. Если в консоль выводится фраза «All tests passed!», то все тесты успешно прошли. Если какой-то из них провалится, то появится лог в консоли.
Не стоит волноваться, если кто-то случайно удалит код, который сейчас тестируется. Во время рефакторинга тесты покажут ошибку!
Функция expect и Matcher
Функция expect используется для проверки соответствия результата условию (matcher).
Matcher может быть булевым значением, например true, false, строковым значением, например «OK», или числом: 0, -1 и т. д. Также он может быть комплексным выражением, таким как:
- isNull: используется для проверки, что текущее значение равно null.
- isNotNull: используется для проверки, что текущее значение не равно null.
- isTrue: одинаково со сравнением с true.
- isFalse: одинаково со сравнением с false.
- isList: используется для проверки, что текущее значение это List.
- isMap: используется для проверки, что текущее значение это Map.
- isA<T>(): используется для проверки, что текущее значение имеет тип T.
- isException: используется для проверки, что текущее значение это Exception.
- throwsArgumentError: используется для проверки, что во время выполнения кидает ArgumentError.
Мы познакомимся с большим количеством Matcher в следующих частях.
Заключение
В данной статье, мы написали простой Unit-тест. В следующих выпусках продолжим писать Unit-тесты для более сложных случаев с использованием продвинутых техник: Mock, Fake и Stub.
Подписывайтесь на телеграмм-канале Flutter. Много, чтобы не пропустить следующую статью!