Слайд 1UI тесты мобильных приложений: ожидание
и реальность
Устинова Анна, тимлид команды тестирования
мобильных решений DIRECTUM
Слайд 2О чем
Основные виды автотестов и принципы их применения.
Наш опыт
автоматизации:
какие у нас АТ и почему;
XamarinUI.Test;
как АТ внедрены в процесс
разработки.
Слайд 3Продукты
DIRECTUM, DirectumRX;
веб-сервер NOMAD;
мобильные приложения DIRECTUM Solo, DIRECTUM Jazz.
Слайд 4Пирамида автоматизации тестирования
Слайд 7Виды тестирования на примере наших продуктов
Слайд 8Интеграционное
Проверяют взаимодействие веб-сервиса с СЭД через API.
Имитируется работа клиентского приложения.
Слайд 9Сквозное тестирование
Через UI приложения обращаются к веб-сервису.
Веб-сервис взаимодействует с СЭД.
Имитируется
полноценная работа конечного пользователя.
Слайд 10Зачем нам АТ мобильных приложений
Слайд 11Зачем нам АТ мобильных приложений
Покрыть АТ основные кейсы приложения
Уменьшить количество
багов на регрессии
Слайд 12Текущие цели
Уменьшение количества ручных регрессионных тестов
Раннее нахождение багов в стабильной
функциональности
Проверка UI
Слайд 13Когда пора внедрять АТ
Есть стабильная функциональность
Есть понимание, что приложение будет
развиваться дальше
Есть ресурсы (на поддержку и развитие)
Слайд 14Автотесты мобильных приложений.
Ожидания
Тестируют UI
Большое покрытие конфигураций
Массмаркет, частые релизы
Слайд 15Наши автотесты. Реальность
Прогоняются раз в день
Локально
На двух девайсах (iOS, Android)
Минимально
проверяют UI, упор на функциональность
Android ~ 40 тестов, ~ 50
минут
iOS ~ 30 тестов, ~ 20 минут
Написаны с использованием Xamarin.UITest
Слайд 16Xamarin.UITest
фреймворк для автоматического тестирования UI;
C#, NUnit;
Xamarin.iOS, Xamarin.Android проекты (но поддерживает
и проекты на Objective-C / Swift и Java).
Слайд 17Встраивание в проект
iOS:
NuGet пакет Xamarin Test Cloud Agent
в метод
AppDelegate.FinishedLaunching:
#if ENABLE_TEST_CLOUD
Xamarin.Calabash.Start();
#endif
Android не требует дополнительной настройки в проекте.
Слайд 18Принцип работы
Поиск элемента (Queries)
Взаимодействие с ним (Actions):
Tap;
Swipe;
EnterText;
..
Слайд 19Пример теста
public void ShowErrIncorrectLoginOrPassword_IfLoginIsWrong()
{
var
wrongLogin = TestsSettings.UserLogin + "1";
app.EnterLoginAndPassword(wrongLogin, TestsSettings.UserPassword);
app.WaitForElement(Resources.Identifiers.ErrorMessage, "Login is incorrect, alert message wasn't shown.", TestsSettings.Delay);
Assert.AreEqual(CoreResources.ErrIncorrectLoginOrPassword, ErrorMessage);
}
Слайд 20Пример теста
public void ShowErrIncorrectLoginOrPassword_IfLoginIsWrong()
{
var
wrongLogin = TestsSettings.UserLogin + "1";
app.EnterLoginAndPassword(wrongLogin, TestsSettings.UserPassword);
app.WaitForElement(Resources.Identifiers.ErrorMessage, "Login is incorrect, alert message wasn't shown.", TestsSettings.Delay);
Assert.AreEqual(CoreResources.ErrIncorrectLoginOrPassword, ErrorMessage);
}
Слайд 21Пример теста
public void ShowErrIncorrectLoginOrPassword_IfLoginIsWrong()
{
var
wrongLogin = TestsSettings.UserLogin + "1";
app.EnterLoginAndPassword(wrongLogin, TestsSettings.UserPassword);
app.WaitForElement(Resources.Identifiers.ErrorMessage, "Login is incorrect, alert message wasn't shown.", TestsSettings.Delay);
Assert.AreEqual(CoreResources.ErrIncorrectLoginOrPassword, ErrorMessage);
}
Слайд 22Пример теста
public void ShowErrIncorrectLoginOrPassword_IfLoginIsWrong()
{
var wrongLogin = TestsSettings.UserLogin
+ "1";
app.EnterLoginAndPassword(wrongLogin,
TestsSettings.UserPassword);
app.WaitForElement(Resources.Identifiers.ErrorMessage, "Login is incorrect, alert message wasn't shown.", TestsSettings.Delay);
Assert.AreEqual(CoreResources.ErrIncorrectLoginOrPassword, ErrorMessage);
}
Слайд 23Пример теста
public void ShowErrIncorrectLoginOrPassword_IfLoginIsWrong()
{
var wrongLogin = TestsSettings.UserLogin
+ "1";
app.EnterLoginAndPassword(wrongLogin, TestsSettings.UserPassword);
app.WaitForElement(Resources.Identifiers.ErrorMessage, "Login is incorrect,
alert message wasn't shown.", TestsSettings.Delay);
Assert.AreEqual(CoreResources.ErrIncorrectLoginOrPassword, ErrorMessage);
}
private string ErrorMessage =>
app.Query(x => x.Marked(Resources.Identifiers.ErrorMessage)).First().Text;
Слайд 24Пример теста
public static void EnterLoginAndPassword(this AndroidApp app, string login, string
password)
{
app.WaitForElement(Resources.Identifiers.LoginEdit, TestsSettings.Delay);
app.EnterText(Resources.Identifiers.LoginEdit,
login);
app.EnterText(Resources.Identifiers.PasswordEdit, password);
app.Tap(Resources.Identifiers.LoginButton);
}
Слайд 28Цель – перейти в папку Outbox и выполнить в ней
определенные действия
Слайд 29Цель – перейти в папку Outbox и выполнить в ней
определенные действия
Пишем тест.
…
app.OpenFolder(Strings.ExplorerFoldersOutbox);
app.Tap(Resources.Identifiers.HeaderTaskJob);
…
Слайд 30Цель – перейти в папку Outbox и выполнить в ней
определенные действия
Пишем тест.
Нужные нам шаги:
app.OpenFolder(Strings.ExplorerFoldersOutbox);
app.Tap(Resources.Identifiers.HeaderTaskJob);
Запускаем локально – всё ок.
Запускаем на
стенде АТ – падает при открытии папки
Слайд 32Ограничения Xamarin.UITest
нет возможности запускать iOS тесты из Visual Studio for
Windows;
нет возможности работать с системными уведомлениями и диалогами;
нет возможности управлять
системными параметрами (сеть, интернет подключение и т.п);
нет интеграции с другими приложениями на устройстве.
Слайд 33Автотесты в CI
Unit тесты запускаются на PR;
Integration тесты на ночных
сборках сервиса;
E2E тесты ежедневно по расписанию на dev-ветке.
Слайд 35Автотесты в CI
Анализ
результатов
в TFS
Слайд 36Итог
писать автотесты, когда в этом есть смысл:
стабильная функциональность;
планы развития приложения.
Слайд 37Итог
писать автотесты, когда в этом есть смысл;
решать применением автотестов ваши
проблемы;
Слайд 38Итог
писать автотесты, когда в этом есть смысл;
решать применением автотестов ваши
проблемы, например:
уменьшить количество багов на регрессии;
снизить количество ручного тестирования;
ускорить релизы;
…
Слайд 39Итог
писать автотесты, когда в этом есть смысл;
решать применением автотестов ваши
проблемы;
количество тестов, конфигураций, подход к написанию и прогону тестов зависят
от ваших целей;
соблюдать принцип пирамиды при автоматизации тестирования