Команды, занимающиеся тестированием удобства и производительности знают, что тестирование на реальных устройствах позволяет устранить ограничения, присущие эмуляторам и симуляторам, выявить неизвестные ошибки и применить реальные пользовательские сценарии.
БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале Библиотека тестировщика
В этой статье мы рассмотрим, как использовать параллельное выполнение тестов в 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».