Первый шаг — запустить тесты с параметром coverage:
flutter test --coverage
Эта команда сгенерирует файл с информацией о покрытии, но для его расшифровки понадобится инструмент lcov, доступный только для Unix-систем.
Установка lcov
Для Linux (на примере Ubuntu):
sudo apt-get update -qq -y
sudo apt-get install lcov -y
Для macOS:
brew install lcov
Генерация отчета в HTML
Далее, конвертируем полученный файл в удобный для чтения HTML-формат:
genhtml coverage/lcov.info -o coverage/html
Теперь в папке coverage/html можно просматривать отчет по покрытию. Однако тут возникает проблема: отчет может не учитывать все файлы вашего проекта, так как покрываются только те файлы, которые явно были импортированы в тесты.
Решение проблемы с неполным покрытием
Чтобы охватить все файлы, нужно импортировать их в тесты через специальный файл, например,
coverage_helper_test.dart. Этот процесс можно автоматизировать с помощью скрипта:
file=test/coverage_helper_test.dart
echo "// Helper file to make coverage work for all files\n" > $file
echo "// ignore_for_file: unused_import" > $file
find lib -name "*.dart" "!" -name "*.g.dart" | cut -c4- | awk -v package="my_package" '{printf "import '\''package:%s%s'\'';\n", package, $1}' >> $file
echo "void main(){}" >> $file
Тут мы создаем файл
coverage_helper_test.dart, ставим игнорирование определенного правила статического анализа на один файл и импортируем наши файлы. ⚙️ Важное правило: не импортировать файлы, которые были сгенерированы, можно дополнять такой скрипт файлами от freezed и других библиотек. В конце добавляем метод main, чтобы импорты попали в покрытие.
Автоматизация на CI/CD
Скрипт сохраняем в файл с расширением .sh и запускаем перед тестами.
./coverage_helper.sh
Все эти шаги можно интегрировать в ваш CI/CD процесс для автоматической проверки покрытия кода тестами.
А как вы подходите к тестированию? Какие используете методики? 🙂