«Это бесполезно! Я не могу провести сквозное тестирование с помощью интеграционных тестов Flutter», — воскликнул один из наших клиентов около 9 месяцев назад. Я спросил, в чем проблема, и они объяснили, что используют аутентификацию Google для входа в систему и используют пакет , но невозможно использовать интеграционные тесты Flutter для взаимодействия с экранами входа в систему. Я так и не совсем понял, в чем проблема, и тут меня осенило: этот плагин использует , с которыми интеграционные тесты не работают. google_sign_in нативные компоненты пользовательского интерфейса Я был очень разочарован тем, что не смог предложить решение в то время, и мне пришлось оставить все как есть. Однако перенесемся в сегодняшний день, и появилось потрясающее новое решение под названием от . Я собираюсь рассказать вам все об этом, но прежде чем мы углубимся, давайте просто вспомним, почему важно запускать тесты, какие инструменты у вас были доступны до сих пор, а затем поговорим о том, как начать работу с Patrol. «Патруль» LeanCode Зачем вообще тестировать приложения Flutter? Одна из основных причин, по которой команды разработчиков используют службы (CI), такие как заключается в том, чтобы получить немедленную обратную связь по коду, который они фиксируют в своем репозитории. Тесты могут запускаться автоматически как часть вашего конвейера, чтобы обеспечить уровень качества и стабильности, поскольку ошибки или проблемы можно обнаружить на ранней стадии и сразу же исправить. Мы всегда рекомендуем клиентам проводить тестирование при настройке своих рабочих процессов, но нередко можно услышать: «У нас нет времени писать тесты». Надеюсь, вы не в такой ситуации и используете тестирование как часть цикла разработки приложений, чтобы создавать приложения отличного качества и без ошибок! непрерывной интеграции Кодмагия Каковы основные автоматизированные способы тестирования приложений Flutter? Существует четыре основных метода тестирования, которые можно автоматизировать в рамках рабочего процесса CI. Тестирование — это отдельная тема, поэтому я буду краток, но использование комбинации этих методов тестирования поможет вам улучшить качество вашего приложения и выявить проблемы раньше, чем позже. Во-первых, существует , которое обычно используется для изолированного тестирования функций и методов, чтобы убедиться, что они работают должным образом. Также можно написать модульные тесты, чтобы убедиться, что ваша бизнес-логика работает в различных сценариях без каких-либо неожиданных результатов. «Модульное тестирование» Далее у нас есть Flutter, которые позволяют вам протестировать компоненты пользовательского интерфейса и убедиться, что они отображаются правильно и работают так, как вы ожидаете. «тесты виджетов» Затем идет , во время которого вы проверяете, работают ли модули и компоненты вашего приложения вместе, как ожидалось. «Интеграционное тестирование» Наконец, существует , при котором вы тестируете приложение так, как если бы оно использовалось реальным пользователем. В рабочем процессе CI это обычно автоматизируется с помощью симуляторов или эмуляторов для тестирования различных путей в вашем приложении, чтобы убедиться в отсутствии каких-либо проблем после внесения изменений в код. «сквозное тестирование пользовательского интерфейса» Именно здесь застрял клиент, о котором я говорил вначале, потому что он не мог запустить сквозные тесты пользовательского интерфейса, потому что не было возможности войти в приложение. В то время они тестировали версию для разработчиков, которая обходила часть входа в систему. Однако теперь, когда доступен в этом больше нет необходимости! «Патруль», Входите, сцена слева, Патруль! Итак, прежде всего, что такое Патруль? Ну, я думаю, что документы говорят об этом лучше всего: Patrol — это новая платформа тестирования пользовательского интерфейса с открытым исходным кодом для Flutter, разработанная LeanCode. Он основан на существующих инструментах тестирования Flutter и позволяет вам делать то, что раньше было невозможно. Patrol позволяет вам получить доступ к собственным функциям платформы, на которой работает приложение Flutter. Самая важная часть здесь заключается в том, что он позволяет вам получить доступ к платформы, на которой работает ваше приложение . собственным функциям Flutter Это означает, что теперь вы можете делать такие вещи, как: Взаимодействуйте с диалоговыми окнами запросов на разрешение, чтобы отклонять или принимать запросы. Взаимодействие с WebViews. Сверните и разверните свое приложение. Взаимодействуйте с потоками аутентификации, такими как аутентификация Google или Apple. Взаимодействуйте с другими встроенными функциями, такими как открытие панели уведомлений, нажатие кнопки «Домой», включение или выключение подключения Wi-Fi, перевод устройства в темный режим и т. д. Хорошо, это звучит здорово, но в чем подвох? Ну, его нет! И более того, это не только , но и ! бесплатно Открытый исходный код Более того, Patrol также представляет , которые дают вам более краткий синтаксис для написания тестов. Вы можете прочитать о них больше . «пользовательские средства поиска» здесь Установка и настройка Патрола Чтобы начать работу с Patrol, вам необходимо установить CLI, добавить в ваш и настроить некоторые конфигурации в ваших проектах iOS и Android. зависимость Patrol pubspec.yaml создал отличную документацию. который проведет вас через процесс для каждой платформы, которую вы можете найти здесь. Их пошаговое руководство проведет вас через настройку как для , так и . LeanCode здесь iOS для Android Если у вас возникнут какие-либо проблемы, лучшее место, где можно получить помощь, — это сервер , к которому вы можете присоединиться. . Discord сообщества Patrol здесь Если вы обнаружите какие-либо ошибки, вы можете поднять проблему . здесь Установка и настройка Патрола Чтобы начать работу с Patrol, вам необходимо установить CLI, добавить в ваш и настроить некоторые конфигурации в ваших проектах iOS и Android. зависимость Patrol pubspec.yaml создал отличную документацию. который проведет вас через процесс для каждой платформы, которую вы можете найти здесь. Их пошаговое руководство проведет вас через настройку как для , так и . LeanCode здесь iOS для Android Если у вас возникнут какие-либо проблемы, лучшее место, где можно получить помощь, — это сервер , к которому вы можете присоединиться. . Discord сообщества Patrol здесь Если вы обнаружите какие-либо ошибки, вы можете поднять проблему . здесь Написание собственных тестов функций с помощью Patrol Теперь все настроено, давайте начнем тестировать некоторые встроенные функции. Чтобы попробовать это самому, я установил простое приложение Flutter с кнопкой с повышенными правами, при нажатии которой открывается диалоговое окно оповещения. собственное Нажатие «ОК» или «Отмена» просто закрывает диалоговое окно. Опять же, я бы рекомендовал использовать собственную документацию Patrol, которую вы можете найти. чтобы добавить свой первый тестовый файл. здесь Итак, для моего теста я хотел нажать на кнопку с повышенными правами, на которой есть текст «Нажмите на меня!». Это стандартный виджет Flutter, поэтому его можно нажать с помощью следующего средства поиска Patrol: await $('Click me!').tap(); После этого должен отобразиться собственный диалог, и теперь мы можем начать взаимодействовать с собственным компонентом пользовательского интерфейса. Итак, давайте добавим собственный поисковик, который позволит нам нажимать кнопку «ОК»: await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); Это было легко! Я также хочу протестировать кнопку «Отмена», поэтому давайте нажмем «Нажмите на меня!» кнопку еще раз, а затем нажмите кнопку «Отмена» в собственном диалоговом окне, добавив еще пару строк следующим образом: await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel')); Готовый тестовый файл должен выглядеть следующим образом: import 'package:cmpatrol/main.dart'; import 'package:patrol/patrol.dart'; void main() { patrolTest( 'Native tests', nativeAutomation: true, ($) async { await $.pumpWidgetAndSettle(const MyApp()); await $('Click me!').tap(); await $.native.tap(Selector(text: 'OK')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'Cancel')); await $('Click me!').tap(); await $.native.tap(Selector(text: 'NO')); }, ); } Теперь вы сможете запустить этот тест на своем эмуляторе или реальном устройстве, используя команду для запуска теста. Мой файл интеграционного теста назывался , поэтому я начал тесты из терминала следующим образом: «button_test» patrol test -t integration_test/button_test.dart Вы увидите, пройдут ли ваши тесты или нет, прямо в Терминале. Если тесты не пройдут, вы получите ссылку на полный отчет о тестировании. В качестве альтернативы, если вы запускаете тесты на Android, как это сделал я, вы можете получить доступ к отчету, щелкнув в следующем каталоге: index.html ./build/app/reports/androidTest/connected Вы можете поэкспериментировать с другими встроенными функциями, такими как открытие панели уведомлений, отключение Wi-Fi, включение темного режима, сворачивание и развертывание приложения: // minimize app await $.native.pressHome(); await $.native.openNotifications(); await $.native.disableWifi(); await $.native.enableDarkMode(); // maximize app await $.native.openApp(); ⚠️ Обратите внимание, что невозможно полностью закрыть приложение, а затем снова открыть его, поскольку это приведет к завершению всего теста и, следовательно, к его провалу. Проконсультируйтесь с патрулем дополнительные примеры. документация Использование Patrol в рабочих процессах Codemagic Чтобы включить Patrol в свои рабочие процессы, вам сначала необходимо установить на машине сборки. Это займет всего несколько секунд, и как только это будет сделано, вы сможете запустить тестовый скрипт. Ниже приведен пример добавления этих шагов в раздел «сценарии» файла конфигурации . Я бы рекомендовал запустить сценарий для установки Patrol CLI в качестве одного из первых шагов сценария, а затем вы можете запускать тесты Patrol либо сразу после этого, либо после любых других тестов, которые вы также можете запустить заранее. интерфейс командной строки Patrol codemagic.yaml Перед запуском тестов Patrol вам необходимо запустить эмулятор, поэтому мы добавим скрипт для запуска эмулятора и дождемся его полной загрузки. Обратите внимание, что эмуляторы Android недоступны на компьютерах, использующих компьютеры Apple Silicon M1 или M2, поскольку Apple Virtualization Framework не поддерживает вложенную виртуализацию. Поэтому я бы рекомендовал использовать экземпляр при тестировании приложений для Android. Linux Раздел скриптов вашего должен выглядеть примерно так: codemagic.yaml scripts: ... - name: Install Patrol CLI script: dart pub global activate patrol_cli - name: Launch Android emulator script: | cd $ANDROID_HOME/tools emulator -avd emulator & adb wait-for-device - name: Run tests with Patrol script: patrol test -t integration_test/your_test.dart ignore_failure: true ... Отображение результатов теста Patrol в журналах сборки Codemagic Результаты теста Patrol также доступны в формате , что означает, что их можно отображать в журналах сборки на экране обзора сборки Codemagic. Вам просто нужно добавить передачу свойства в путь к создаваемому XML-файлу JUnit. Вы можете использовать свойство с логическим значением, чтобы контролировать, хотите ли вы продолжать работу остальной части рабочего процесса или нет. Если вы хотите загрузить свои результаты в систему управления тестированием, как описано в следующем разделе, вам следует установить для этого параметра значение . JUnit XML test_report ignore_failure true Вот пример того, как должен выглядеть ваш скрипт: scripts: ... - name: Run tests with Patrol script: | patrol test -t integration_test/your_test.dart test_report: build/app/outputs/androidTest-results/connected/*.xml ignore_failure: true ... Неудачный тест может выглядеть примерно так: Сбор отчета о тестировании Patrol как артефакта сборки Еще одна вещь, которую вы, возможно, захотите сделать, — это собрать выходные данные отчета о тестировании в виде артефакта сборки, чтобы вы могли просмотреть полный отчет в случае возникновения каких-либо ошибок. После этого отчет станет доступен для загрузки в виде zip-файла на экране обзора сборки в разделе «Артефакты» слева. Самый простой способ сделать это — скопировать каталог, в котором находятся файлы отчетов, в каталог, который Codemagic использует для экспорта артефактов. Существует встроенная переменная среды , которая ссылается на этот каталог, который вы можете использовать в своем скрипте. $CM_EXPORT_DIR Скрипт для этого должен быть таким: scripts: ... - name: Export Patrol test report script: | cp -r build/app/reports/androidTests/connected $CM_EXPORT_DIR/report ... Заключение наконец-то решил проблему запуска тестов пользовательского интерфейса и интеграции, в которых используются встроенные функции. Теперь можно тестировать встроенные функции и взаимодействовать с потоками аутентификации, собственными диалоговыми окнами и даже переключать встроенные функции, такие как Wi-Fi, сотовая связь, темный режим, и даже сворачивать и разворачивать приложение. Кроме того, он , и обеспечивает решение реальной проблемы, которая существовала с момента запуска Flutter. Более того, его легко добавить и использовать в рабочих процессах Codemagic. Если вы хотите поддержать замечательную работу LeanCode, поставьте лайк Patrol на pub.dev. и поставьте репозиторию Patrol GitHub звезду . Patrol бесплатен имеет открытый исходный код здесь здесь Эта статья написана Кевином Сухайдой, руководителем отдела разработки решений в компании . Вы можете найти Кевина на , , и . Кодмагия Икс GitHub LinkedIn Также опубликовано . здесь