Ускоряем прохождение iOS UI-тестов. Часть 2. Распараллеливание тестов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Хабр, привет!

Меня зовут Борис. Я Mobile AQA lead в Vivid Money.

Это вторая статья в цикле статей по iOS-автоматизации, в которых я расскажу о том, как ускорить прохождение UI-тестов.

Данная статья будет полезна iOS-автоматизаторам с опытом, либо разработчикам.

В рамках этой статьи мы разберем такие этапы:

  • зачем распараллеливать тесты?;

  • распараллеливаем тесты локально;

  • распараллеливаем тесты на CI.

Зачем распараллеливать тесты?

Параллельное тестирование — это ваш билет к более быстрому тестированию. При тестировании приложений важно помнить, что время является важным фактором. 100-процентное тестирование приложения — дело благородное, но не всегда так просто достичь желаемого тестового покрытия. Параллельное тестирование позволяет проводить больше тестов в более сжатые сроки.

Представим ситуацию: у вас есть 500 ui-тестов, которые прогоняются за 4 часа. Четыре часа на прогон - это очень много, но если поделить эти 500 тестов на 8 симуляторов, прогон займет 30 минут!

Распараллеливаем тесты локально

Вам понадобится:

  • Xcode версии ≥ 11.7;

  • Тест-план, содержащий ≥ 2 классов с тестами;

В тест плане нужно выбрать “Execute in parallel”

После этого вы можете просто запустить все тесты в вашем тестовом таргете, и Xcode автоматически создаст несколько клонов выбранного симулятора. Важно отметить, что Xcode делит тесты по классам, а не на равное количество симуляторов. Например: у вас есть 3 класса с тестами:

  • Первый содержит - 3,

  • Второй содержит - 2,

  • Третий содержит - 10.

В таком случае xcode создаст три симулятора и запустит на каждом классе с тестами. Xcode не станет вам делить их поровну для каждого симулятора.

Распараллеливаем тесты на CI

В качестве примера рассмотрим реализацию на multi_scan - это плагин для fastlane.

Представим ситуацию, что у нас 40 тестов, и мы хотим их прогнать на 4 симуляторах.

multi_scan(
  project: 'yourProjectPath',
  scheme: 'SwiftRadioUITests',
  fail_build: false,
	device: 'iPhone 8'
  batch_count: 4,
  parallel_testrun_count: 4
)

Нас интересуют параметры:

  • batch_count - на сколько частей стоит поделить общее количество тестов для запуска на симуляторе. Например, у вас 40 тестов, и мы указываем значение 4, тогда на каждом симуляторе запустится по 10 тестов.

  • parallel_testrun_count - это количество симуляторов для запуска тестов параллельно. Ограничений по количеству здесь нет, но советую руководствоваться здравым смыслом и протестировать, сколько симуляторов выдерживает ваш билд агент.

Указывайте одинаковые цифры в этих двух параметрах.

Теперь представим другой пример, в котором нам нужно явно указать тесты для каждого симулятора.

multi_scan(
  workspace: 'yourProjectPath',
  scheme: 'SwiftRadioUITests',
  fail_build: false,
	destination: 'platform=iOS Simulator,name=iPhone 8,OS=13.1'
  parallel_testrun_count: 2,
  batches: [
    [
      'SwiftRadioUITests/RegressionTests/testExample1',
      'SwiftRadioUITests/RegressionTests/testExample2',
      'SwiftRadioUITests/RegressionTests/testExample3'
    ],
    [
      'SwiftRadioUITests/RegressionTests/testExample4',
      'SwiftRadioUITests/RegressionTests/testExample5',
      'SwiftRadioUITests/RegressionTests/testExampl'
    ]
  ]
)

Обратим внимание на параметры:

  • batches - это массив с вашими тестами. Его следует использовать, если вы хотите явно указать какие тесты должны прогонять на каждом симуляторе. В массиве вы должны указать путь к вашему тесту по след схеме: Имя тестового таргета/ Имя класса с тестами/ Имя теста.

  • destination - это аргумент, в котором вы можете указать определенный: симулятор, физический девайс, mac.

Разберем более подробно destination:

Ключ

Описание

Пример значения

platform

Поддерживаемая платформа

iOS Simulator, tvOS Simulator, watchOS Simulator

name

Полное имя симулятора, которое можно найти в “Devices and Simulators”

iPhone 8, Apple TV, Apple Watch SE - 40mm

id

UDID вашего устройства. UDID можно достать используя утилиту simctl

6DC4A7BA-EA7F-40D6-A327-A0A9DF82F7F6

OS

Версия iOS, tvOS, watchOS. Указываем версию, которую поддерживает Xcode

OS=13.1

Немного примеров для понимания destination:

  1. Указываем симулятор iPhone X на версии ОС 13.1.

    -destination 'platform=iOS Simulator,name=iPhone X,OS=13.1'
    
  2. Указываем симулятор используя UDID симулятора.

    -destination 'platform=iOS Simulator,id=6DC4A7BA-EA7F-40D6-A327-A0A9DF82F7F6'
    

Самое важное

  • Распараллеливание тестов позволяет вам ускорить прохождение ваших тестов в несколько раз!

  • Вы можете это сделать локально через xcode, но он их будет делить по классам, а не на равное количество.

  • Для распараллеливании тестов на ci воспользуйтесь плагином multi_scan для fastlane. Реализация очень простая, а профита много.

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

Полезные статьи на эту тему:

  • Parallel Testing in Xcode 10;

  • Parallelizing UI Tests for iOS Applications;

  • Building from the Command Line with Xcode FAQ


Интересуешься автоматизацией на iOS? Подписывайся на мой телеграмм-канал, в котором я публикую материалы, которые будут полезны как начинающим, так и опытным iOS-автоматизаторам.

Источник: https://habr.com/ru/company/vivid_money/blog/652397/


Интересные статьи

Интересные статьи

Это вторая часть постройки космического корабля своими руками. (Внимание много фотографий)Металлический каркас стенда покрыл матовой краской из баллона. На тот момент попалась термокраска. Краска покр...
Статья является продолжением первой части, посвящённой организации практической безопасности сетей, построенных на оборудовании MikroTik. До этого уже даны общие рекомендации по настройке оборудован...
Данной статьёй мы хотим пролить свет на технический стек Wrike: каким он был раньше и каким мы видим его в будущем. Мы расскажем о том, почему пять лет назад мы выбрали я...
Как и обещал в предыдущей статье, продолжаю свои изыскания. Для тех, кто не читал мою первую статью про российские бесплатные образовательные платформы, сообщаю, что я пришел к следую...
Среди многообразия инструментов, анонсированных на Android Dev Summit, особое внимание хочется уделить механизму обновления приложения In-App Updates (IAUs), который помогает разработчикам ус...