Параллелизация в Appium на симуляторах и эмуляторах

Команды, занимающиеся тестированием удобства и производительности знают, что тестирование на реальных устройствах позволяет устранить ограничения, присущие эмуляторам и симуляторам, выявить неизвестные ошибки и применить реальные пользовательские сценарии.

БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале Библиотека тестировщика

В этой статье мы рассмотрим, как использовать параллельное выполнение тестов в TestING на симуляторах и эмуляторах. Мы будем использовать связку Java + TestNG, это отличное сочетание в мире автоматизированного тестирования, позволяющее выполнять тесты параллельно.

Прежде чем погрузиться в эту тему, необходимо рассмотреть несколько предварительных условий. У вас должно быть настроено окружение для запуска Appium-сценариев в IntelliJ IDEA вместе с соответствующими зависимостями. Вам нужно просто выбрать Имя тестового метода > Щелкнуть правой кнопкой мыши > Выполнить.

Рисунок 1: Запуск тест-кейса.

Прежде чем перейти к параллельному тестированию, посмотрим на простой код для 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.

Настройка параллельного выполнения

Чтобы настроить параллельное выполнение тестов, выполните следующие действия:

  1. Вручную создайте testng.xml:.
    1. Указав имя пакета, можно выполнить тесты из всего пакета.
    2. Указав имя тестового класса, можно выполнить тесты для этого тестового класса.
    3. Укажите имя тестового метода для выполнения конкретного тест-кейса.
<?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>
  1. Укажите конкретные группы для включения или исключения. Здесь вам нужно сначала установить группу на тест-кейс, например:
<?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>
  1. Автоматически создайте 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Реальное имя устройстваUDIDWDA Local Port
14725John’s iPhone2b6f0cc904d137be2e1730235f5664094b8311868100
24726iPhoned137be2e12b6f0cc90473031186235f5664094b88200
34727iPhone X137b30235f5664094b831186e22b6f0cc904de178300

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».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *