Команды, занимающиеся тестированием удобства и производительности знают, что тестирование на реальных устройствах позволяет устранить ограничения, присущие эмуляторам и симуляторам, выявить неизвестные ошибки и применить реальные пользовательские сценарии.
БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале Библиотека тестировщика
В этой статье мы рассмотрим, как использовать параллельное выполнение тестов в TestING на симуляторах и эмуляторах. Мы будем использовать связку Java + TestNG, это отличное сочетание в мире автоматизированного тестирования, позволяющее выполнять тесты параллельно.
Прежде чем погрузиться в эту тему, необходимо рассмотреть несколько предварительных условий. У вас должно быть настроено окружение для запуска Appium-сценариев в IntelliJ IDEA вместе с соответствующими зависимостями. Вам нужно просто выбрать Имя тестового метода > Щелкнуть правой кнопкой мыши > Выполнить.

Прежде чем перейти к параллельному тестированию, посмотрим на простой код для iOS. Этот код мы будем использовать в качестве примера параллельного выполнения.
import io.appium.java_client.ios.IOSDriver;
import io.appium.java_client.ios.IOSElement;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
public class IOSTestCases {
public IOSDriver driver;
@BeforeTest
public void setUp() throws MalformedURLException {
String appiumServerURL = "https://127.0.0.1:4723/wd/hub";
DesiredCapabilities dc = new DesiredCapabilities();
dc.setCapability("platformName", "iOS");
dc.setCapability("platformVersion", "11.4");
dc.setCapability("app", "/Users/pratik/Downloads/FirstAutomationTest/src/test/resources/DemoApp-iPhoneSimulator.app");
dc.setCapability("deviceName", "iPhone X");
driver = new IOSDriver(new URL(appiumServerURL), dc);
}
@Test
public void sampleTestCase() throws InterruptedException {
int a = 5;
int b = 10;
driver.findElement(By.id("IntegerA")).sendKeys(a + "");
driver.findElement(By.id("IntegerB")).sendKeys(b + "");
driver.findElement(By.id("ComputeSumButton")).click();
String answer = driver.findElement(By.id("Answer")).getText();
Assert.assertEquals(answer, a + b + "", "Expected and Actual Result didn't match!");
}
}
Поместив приведенный выше тестовый код в java-проект IntelliJ, мы можем выполнять тест-кейсы. Но теперь мы будем использовать для выполнения метод testng.xml.
Настройка параллельного выполнения
Чтобы настроить параллельное выполнение тестов, выполните следующие действия:
- Вручную создайте testng.xml:.
- Указав имя пакета, можно выполнить тесты из всего пакета.
- Указав имя тестового класса, можно выполнить тесты для этого тестового класса.
- Укажите имя тестового метода для выполнения конкретного тест-кейса.
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE suite SYSTEM “https://testng.org/testng-1.0.dtd”>
<suite name=”All Test Suite”>
<test verbose=”2″ preserve-order=”true” name=”/Volumes/Disk2/AppiumBook/Chapter9-Test Execution on Parallel simulators and emulators”>
<classes>
<class name=”testcases.IOSTestCases”>
<methods>
<include name=”sampleTestCase”/>
</methods>
</class>
</classes>
</test>
</suite>
- Укажите конкретные группы для включения или исключения. Здесь вам нужно сначала установить группу на тест-кейс, например:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="/Volumes/Disk2/AppiumBook/Chapter9-Test Execution on Parallel simulators and emulators">
<groups>
<run>
<include name="sample"/>
</run>
</groups>
<classes>
<class name="testcases.IOSTestCases"/>
</classes>
</test>
</suite>
- Автоматически создайте testng.xml:.
- Сейчас это может показаться немного запутанным, поскольку вы еще не знаете подробностей того что делается. Но скоро все станет понятно.
- Создание testng.xml с помощью IntelliJ включает в себя следующие шаги:
- Перейдите в проект IntelliJ Idea и откройте Preferences.

- Теперь перейдите в раздел Плагины и нажмите Посмотреть репозитории… что приведет вас к диалогу Плагины.

- Наберите в поисковой строке «Create testng» и найдите плагин под названием «Create TestNG XML».

- После установки плагина необходимо перезапустить IntelliJ IDEA.

- Теперь, после перезапуска IntelliJ IDEA, вы сможете генерировать файл TestNG.xml.

- Через секунду testng.xml будет создан, и вы увидите диалоговое окно подтверждения.

- По умолчанию testng.xml будет создан в корневом каталоге проекта, поэтому он не будет найден java-компилятором во время выполнения или компиляции. Поэтому вам нужно переместить его в test/resources..

Как видите на скриншоте выше, здесь есть некоторые предопределенные XML-теги. Здесь по умолчанию тег class имеет атрибут name=»testcases.IOSTestCases», что означает, что TestNG будет выполнять все тест-кейсы только в этом тестовом классе. А поскольку у нас есть только один тест-кейс (sampleTestCase), определенный в testcases.IOSTestCases, то будет выполнен только один тест-кейс. Вы можете изменить testng.xml и заставить его выполняться на уровне пакетов, классов, методов и групп.
Разработка тестовых наборов для параллельного запуска
Параллельное выполнение тестов на симуляторе iOS
Наша цель — параллельно выполнить один тест-кейс (sampleTestCase), написанный в IOSTestCase.java, на 3 симуляторах iOS (iPhone 7, iPhone 8 и iPhone X).
На этапе распараллеливания вы можете запускать тест-кейсы параллельно, но для этого вам потребуется использовать атрибуты вместе с тегом.
- Parallel: Может иметь различные значения, такие как тесты, классы, методы и экземпляры.
- Используйте parallel=»tests», если вы хотите запустить распараллеливание.
- Thread count: Количество потоков для параллельного выполнения. Если вы хотите выполнить 5 тест-кейсов параллельно, то установите thread-count=»5″
Чтобы достичь цели, нам нужно выполнить тест-кейсы из IOSTestCases.java на 3 симуляторах iOS параллельно. Ниже приведен готовый файл testng.xml, который мы можем использовать:
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE suite SYSTEM “https://testng.org/testng-1.0.dtd”>
<suite name=”All Test Suite” parallel=”tests” thread-count=”3″>
<test name=”test1″>
<parameter name=”wda” value=”8100″/>
<parameter name=”deviceName” value=”iPhone 7″/>
<parameter name=”port” value=”4725″/>
<classes>
<class name=”testcases.IOSTestCases”/>
</classes>
</test>
<test name=”test2″>
<parameter name=”wda” value=”8200″/>
<parameter name=”deviceName” value=”iPhone 8″/>
<parameter name=”port” value=”4726″/>
<classes>
<class name=”testcases.IOSTestCases”/>
</classes>
</test>
<test name=”test3″>
<parameter name=”wda” value=”8300″/>
<parameter name=”deviceName” value=”iPhone X”/>
<parameter name=”port” value=”4727″/>
<classes>
<class name=”testcases.IOSTestCases”/>
</classes>
</test>
</suite>
Добавив этот код в testng.xml, щелкните на нем правой кнопкой мыши и выберите опцию Run. Три симулятора iOS откроются и будут выполнять тест-кейсы параллельно.
Этот пример — лишь одна из возможностей параллельного запуска. Существует множество других возможностей.
2) Параллельное выполнение тестов на реальных iOS-устройствах:
В предыдущем разделе мы рассмотрели выполнение тестов на симуляторах iOS, но что если вам нужно выполнить тесты на реальных устройствах?
Ответ довольно прост — нам просто нужно передать UDID в качестве 4-го параметра.
Давайте разберемся в этом на примере. Допустим, у нас есть 2 реальных устройства iOS, подключенных к нашему хосту Mac, и мы хотим запускать тест-кейсы на них параллельно. Информация об устройствах и их портах приведена в таблице ниже.
| No. | Порт сервера Appium | Реальное имя устройства | UDID | WDA Local Port |
|---|---|---|---|---|
| 1 | 4725 | John’s iPhone | 2b6f0cc904d137be2e1730235f5664094b831186 | 8100 |
| 2 | 4726 | iPhone | d137be2e12b6f0cc90473031186235f5664094b8 | 8200 |
| 3 | 4727 | iPhone X | 137b30235f5664094b831186e22b6f0cc904de17 | 8300 |
IOSTestCases.java и testng.xml будут выглядеть следующим образом.
IOSTestCases.java
@Parameters({"wda", "udid", "deviceName", "port"})
@BeforeTest
public void setUp(long wda, String udid, String deviceName, String port){
AppiumDriverLocalService service = new AppiumServiceBuilder().usingPort(Integer.valueOf(port)).build();
service.start();
DesiredCapabilities dc = new DesiredCapabilities();
dc.setCapability(IOSMobileCapabilityType.WDA_LOCAL_PORT, wda);
dc.setCapability(MobileCapabilityType.UDID, udid);
dc.setCapability(MobileCapabilityType.DEVICE_NAME, deviceName);
….
….
}
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="All Test Suite" parallel="tests" thread-count="2">
<test name="test1">
<parameter name="wda" value="8100"/>
<parameter name="udid" value="2b6f0cc904d137be2e1730235f5664094b831186"/>
<parameter name="deviceName" value="John’s iPhone"/>
<parameter name="port" value="4725"/>
<classes>
<class name="testcases.IOSTestCases"/>
</classes>
</test>
<test name="test2">
<parameter name="wda" value="8200"/>
<parameter name="udid" value="d137be2e12b6f0cc90473031186235f5664094b8"/>
<parameter name="deviceName" value="iPhone"/>
<parameter name="port" value="4726"/>
<classes>
<class name="testcases.IOSTestCases"/>
</classes>
</test>
<test name="test3">
<parameter name="wda" value="8300"/>
<parameter name="udid" value="137b30235f5664094b831186e22b6f0cc904de17"/>
<parameter name="deviceName" value="iPhone X"/>
<parameter name="port" value="4727"/>
<classes>
<class name="testcases.IOSTestCases"/>
</classes>
</test>
</suite>
Все остальное остается неизменным.
3) Параллельное выполнение тестов на реальных устройствах Android
Вам просто нужно изменить имя устройства в testng.xml. Используя $adb devices, вы можете получить имена подключенных реальных устройств.
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Android Test Suite" parallel="tests" thread-count="2">
<test name="test1">
<parameter name="platformVersion" value="7.0"/>
<parameter name="deviceName" value="B6AUTSZDYPSOZD7S"/>
<parameter name="port" value="4739"/>
<classes>
<class name="testcases.AndroidTestCases"/>
</classes>
</test>
<test name="test2">
<parameter name="platformVersion" value="8.0"/>
<parameter name="deviceName" value="c4e3f3cd"/>
<parameter name="port" value="4740"/>
<classes>
<class name="testcases.AndroidTestCases"/>
</classes>
</test>
</suite>
При выполнении приведенного выше testng.xml вы можете получить результат, аналогичный приведенному ниже изображению.

Вы также можете найти этот пример на нашей странице Github.
Итак, это было все о параллельном выполнении тестов в Appium с помощью TestNG. Как мы уже говорили, существует множество других способов добиться распараллеливания с помощью TestNG, как для iOS, так и для Android.
Перевод статьи «Parallel Test Execution on Simulators and Emulators».