- PVSM.RU - https://www.pvsm.ru -
На данный момент UWP приложения используют в качестве решения для тестирования через интерфейс Coded UI. Но если у вас приложение под несколько платформ, то в этом случае вам придется писать тесты под каждую платформу отдельно.
В 2016-ом году была анонсирована возможность тестирования UWP приложений с помощью Appium [1]. Для этого был создан драйвер под названием Windows Application Driver (WinAppDriver).
Selenium [2], использующий WebDriver API [3], был создан для автоматического тестирования веб приложений. Appium это фактически Selenium для Apps.
Тестировать с помощью Appium и WinAppDriver можно не только UWP, но и Win32 приложения (о .NET почему-то не упоминают, но можно тестировать и их). Мне же, как обычно, UWP приложения наиболее интересны.
Скачиваем последний релиз со странички релизов на GitHub [4]
После установки в директории C:Program Files (x86)Windows Application Driver будет расположен исполняемый файл WinAppDriver.exe, запустив который можно запустить сервис
Можно установить и Appium, который будет взаимодействовать с WinAppDriver, но WinAppDriver устанавливать нужно в любом случае. WinAppDriver должен устанавливаться вместе с Appium, но на момент написания статьи еще есть какие-то накладки, так что его приходится устанавливать отдельно. На всякий случай, давайте оставлю под спойлером как установить Appium на машину с Windows.
node –v
npm –v
Если установленные версии выше чем минимально требуемые, то можно следующей командой запустить установку (командная строка должна быть запущена от имени администратора):
npm install –g appium
Теперь в командной строке можно запустить appium и получить следующее сообщение:
Создадим простое UWP приложение, которое сразу же и протестируем. Пусть приложение совершает какую-нибудь простую операцию, например, возведение числа в квадрат. Исходный код демо приложения проще некуда.
В MainPage.xaml добавим:
<StackPanel Orientation="Vertical" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Margin="0,25,0,0" TextAlignment="Center">Введите число:</TextBlock>
<TextBox AutomationProperties.Name="txtNumber" x:Name="txtNumber"
Margin="0,5,0,0" FontSize="18" Width="150"> </TextBox>
<TextBlock Margin="0,25,0,0" TextAlignment="Center">Результат:</TextBlock>
<TextBox AutomationProperties.Name="txtResult" x:Name="txtResult"
TextAlignment="Center" FontSize="18" Width="150"> </TextBox>
<Button AutomationProperties.Name="btnGetSquare" x:Name="btnGetSquare"
Margin="0,20,0,0" HorizontalAlignment="Center" Click="btnGetSquare_Click">
Возвести в квадрат
</Button>
</StackPanel>
А MainPage.xaml.cs только одно событие:
private void btnGetSquare_Click(object sender, RoutedEventArgs e)
{
double n = Convert.ToDouble(txtNumber.Text);
txtResult.Text = (n * n).ToString();
}
Из манифеста нам необходимо сохранить Package family name. Оно необходимо для написания теста.
Это же значение можно взять и из файла vs.appxrecipe, который находится в папке Debug/AppX. Значение содержится внутри RegisteredUserModeAppID.
Перед тем, как тестировать приложение, необходимо его развернуть. Вот такое приложение получилось:
С помощью утилиты inspect.exe, которая расположена в директории C:Program Files (x86)Windows Kits10binx86 можно определить наименования элементов для использования в тесте.
Запустив приложение, которое необходимо протестировать, можно или выбрать в дереве любой интересующий контрол или даже просто кликнуть на контрол в окне самого приложения. Получим приблизительно такую информацию:
Для поиска элемента обычно используются следующие значения: ClassName и Name. С драйвером IOs можно использовать поиск элемента по его AutomationId.
В Visual Studio создаем проект типа Unit Test
В менеджере пакетов NuGet находим и устанавливаем Appium.WebDriver вместе с необходимыми для его работы зависимыми пакетами.
Для работы с UWP приложением может быть использован RemoteWebDriver, а может быть использован IOSDriver. Скорее всего после окончательного релиза появится какой-то третий драйвер именно под платформу Windows. Windows Namespace должен быть включен в NuGet пакет Appium .NET Driver.
Пишем код теста. В данном случае он может быть таким:
[TestClass]
public class UnitTest1
{
protected const string AppDriverUrl = "http://127.0.0.1:4723";
protected static RemoteWebDriver AppSession;
[ClassInitialize]
public static void Setup(TestContext context)
{
DesiredCapabilities cap = new DesiredCapabilities();
cap.SetCapability("app", "6b86c2c7-c428-4039-9281-8da10ee45769_dyre41xy79knw!App");
AppSession = new RemoteWebDriver(new Uri(AppDriverUrl), cap);
Assert.IsNotNull(AppSession);
}
[ClassCleanup]
public static void TestsCleanup()
{
AppSession.Dispose();
AppSession = null;
}
[TestMethod]
public void MakeOperation()
{
AppSession.FindElementByName("txtNumber").Clear();
AppSession.FindElementByName("txtNumber").SendKeys("5");
AppSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1));
AppSession.FindElementByName("btnGetSquare").Click();
AppSession.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1));
RemoteWebElement txtResultTextElement;
txtResultTextElement = AppSession.FindElementByName("txtResult") as RemoteWebElement;
Assert.IsNotNull(txtResultTextElement);
Assert.AreEqual("25", txtResultTextElement.Text);
AppSession.Quit();
}
}
Если используется IOSDriver, то код инициализации изменяется на следующий:
protected const string AppDriverUrl = "http://127.0.0.1:4723";
protected static IOSDriver<IOSElement> AppSession;
[ClassInitialize]
public static void Setup(TestContext context)
{
DesiredCapabilities cap = new DesiredCapabilities();
cap.SetCapability("app", "6b86c2c7-c428-4039-9281-8da10ee45769_dyre41xy79knw!App");
AppSession = new IOSDriver<IOSElement>(new Uri(AppDriverUrl), cap);
Assert.IsNotNull(AppSession);
}
Как вы можете заметить изменения минимальные. Код теста MakeOperation остается прежним.
Дополнительно можно (а если запускаете Appium, то даже нужно) указывать платформу и устройство:
cap.SetCapability("platformName", "Windows");
cap.SetCapability("deviceName", "WindowsPC");
Если вы запустили WinAppDriver, то строка URL:
protected const string AppDriverUrl = "http://127.0.0.1:4723";
Ну а если запустили Appium, то:
protected const string AppDriverUrl = "http://127.0.0.1:4723/wd/hub";
Запустим тест на выполнение. Можно таким образом:
И в случае, если все верно, получим:
Небольшая анимация автоматизированного процесса:
Напоследок, приведу стандартный пример работы с Win32 приложением:
DesiredCapabilities cap = new DesiredCapabilities();
cap.SetCapability("app", @"C:WindowsSystem32notepad.exe");
AppSession = new RemoteWebDriver(new Uri("http://127.0.0.1:4723"), cap);
AppSession.FindElementByClassName("Edit").SendKeys("Привет Appium!");
Этот пример открывает блокнот и вводит текст. Для тестирования .NET приложения точно так же достаточно прописать путь к исполняемому файлу.
Пара ссылок:
Страничка на GitHub [6]
Страничка официальной документации: Windows Application UI Testing [7]
Автор: asommer
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/testirovanie/223567
Ссылки в тексте:
[1] Appium: http://appium.io/
[2] Selenium: http://www.seleniumhq.org
[3] WebDriver API: http://www.seleniumhq.org/docs/03_webdriver.jsp
[4] со странички релизов на GitHub: https://github.com/Microsoft/WinAppDriver/releases
[5] официального сайта: https://nodejs.org/en/
[6] Страничка на GitHub: https://github.com/Microsoft/WinAppDriver
[7] Windows Application UI Testing: https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/windows-app-testing.md
[8] Источник: https://habrahabr.ru/post/316858/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.