Как я могу запускать независимые тесты Robotium UI параллельно?

Я использую Jenkins для моей постоянной интеграции с Android. У меня есть отдельные изолированные независимые тесты Robotium UI, которые в настоящее время занимают 12 минут, чтобы поочередно запускать один эмулятор. Может ли кто-нибудь рекомендовать хороший способ запускать их параллельно, так что потребуется всего 6 минут (или меньше)?

Я знаю о различных способах запуска полного набора тестов параллельно на нескольких устройствах/эмуляторах, например. см. раздел Многоконфигурационное (матричное) задание раздела Jenkins Android Emulator Plugin, Spoon, или облачные компании, такие как AppThwack.

Я знаю, как запускать определенное подмножество моих тестов, используя аннотации JUnit, или, по-видимому, Spoon поддерживает аналогичную функцию (см. мой вопрос об этом).

Теперь я использую Spoon для запуска моего полного набора тестов (в основном, чтобы воспользоваться прекрасным выходом HTML со скриншотами). Если у кого-нибудь есть советы по лучшему способу разделить мои тесты и запустить их параллельно, это будет здорово.

Я предполагаю, что смогу достичь этого, разделив тесты на два отдельных задания CI, но это звучит как боль для поддержания двух отдельных заданий и объединения результатов.

Ответ 1

Этот ответ является улучшением моего предыдущего ответа MultiJob.


Лучший способ, которым я нашел это, - использовать работу Матрицы Дженкинса (a.k.a. "Проект с несколькими конфигурациями" ). Это действительно удобно, потому что вы можете настроить все в одной задаче Дженкинса.

Теперь Spoon поддерживает опцию --e, которая позволяет передавать аргументы непосредственно игроку. Я обновил их файл README с помощью раздела Test Sharding.

Это README должно предоставить вам то, что вам нужно, но вот другие моменты из нашей конфигурации работы Jenkins, если это помогает.

User-defined Axis устанавливает количество ведомых узлов, которые мы хотим запустить. Мы должны установить метку android, чтобы наш облачный провайдер мог запустить соответствующее подчиненное устройство.

matrix_configuration

У нас есть run-build.sh script, который вызывает Spoon с правильными параметрами. Нам нужно передать итоговый счетчик node (в данном случае 6), и будет запущен индекс конкретного ведомого node (автоматически присутствует в переменной node_index).

matrix_build

Шаги после сборки не должны отличаться от существующих. В будущем нам, вероятно, потребуется добавить что-то, чтобы собрать результаты на мастер node (это было удивительно сложно понять). Пока вы все равно можете перейти к результатам на ведомых устройствах.

matrix_post_build

Ответ 2

Обновить: я добавил еще один ответ, который, как я думаю, дает более чистую и более сжатую конфигурацию Jenkins и основывается на Ложка.


Я только что открыл Jenkins MultiJob Plugin, который позволяет вам запускать несколько заданий параллельно в фазе.

Ниже мой рабочий, но слегка хрупкий подход к этому, используя плагин Fork. Я использую вручную настроенные регулярные выражения для разделения тестов (это была основная причина, по которой я пытался использовать Fork - он поддерживает использование regex).

MultiJob выглядит так: несколько шагов по следующему этапу:

multi_job_summary

Конфигурация основных заданий

Здесь описано мое "Android Multi Job":

multi_job_summary_1multi_job_summary_2

Конфигурация задания ниже по течению

Здесь, как настроены нисходящие "Android Phase N" задания (с разными android.test.classes регулярными выражениями для каждого):

downstream_config

Gotchas

  • В настоящее время вилка не запускается на Gradle v1.0.0, в соответствии с плагином fork issue # 6.
  • Если вы хотите, чтобы регулярное выражение Fork соответствовало нескольким различным пакетам, вам необходимо запятую разделить ваше регулярное выражение. Это не очень хорошо документировано в проекте Fork, но их источник TestClassFilter показывает вам, как они интерпретируют регулярное выражение.
  • Любые абстрактные классы тестов должны быть названы Abstract*, иначе Fork попытается запустить их как тесты, создавая раздражающие сбои. Их TestClassScanner контролирует это, и issue # 5 треки, изменяющие это.
  • IIRC, вы должны иметь Fingerprint Plugin, установленный для работы с параметрами "Агрегат ниже по течению". Если вы его не установили, вы увидите эту ошибку: "Фингерпринт не включен в эту сборку. Агрегация тестирования требует отпечатки пальцев".

Ограничения

  • Результаты тестов агрегируются, но только с использованием отчетов об испытаниях JUnit XML. Это означает, что вам нужно щелкнуть по каждой последующей работе, чтобы просмотреть хорошие результаты HTML.
  • Ручное разбиение ваших тестов на основе регулярных выражений может быть утомительным и подверженным ошибкам. Если вы используете этот подход, я рекомендую вам по-прежнему выполнять однодневную/еженедельную работу Jenkins для запуска полного набора тестов в одном месте, чтобы убедиться, что вы случайно не потеряли никаких тестов.
  • Этот подход MultiJob требует, чтобы вы вручную настраивали каждое последующее задание, по одному для каждого ведомого node, который вы хотите использовать. Мы прототипировали лучший подход, используя работу Matrix, где вам нужно только настроить все в одном задании Jenkins). Мы попытаемся записать это в ближайшие пару недель.

Фьючерс

Мы также прототипировали способ расширения Spoon (результат более симпатичный, чем Fork), чтобы автоматически разбить весь набор тестов на N рабочих мест вниз. Нам по-прежнему необходимо усилить его, чтобы агрегировать все эти результаты обратно на одну HTML-страницу в исходной работе, но, к сожалению, ошибка в Jenkins "Копировать в подчиненное" плагин блокирует это от работы на данный момент.

Ответ 3

Вы можете выполнить это в 3 этапа:

  • Создайте 2 узла, указывающих на одну целевую машину (которая удовлетворяет вашему условию для запуска тестов на одном компьютере).
  • В задании во время выполнения используйте переменную env Jenkins $NODE_NAME и назначьте различный набор тестов для каждого node (вам может понадобиться NodeLabel Parameter Plugin).
  • После выполнения у вас будет 2 файла отчета, к счастью, на том же компьютере. Вы можете либо объединить их в один, если они являются текстовыми файлами, либо создать xml-то похожее на формат плагина PerfPublisher, который дает подробный отчет.

Это означает, что вы можете фактически выполнить 2 набора тестов на одном компьютере (2 узла, указывающие на него), используя одно задание. Получение одного отчета было бы сложным, но если я узнаю формат, я могу помочь.

Надеюсь, это полезно

Ответ 4

Вы можете использовать, например, Jenkins MultiJob Plugin и Testdroid API для отправки APK на реальные устройства. Это, наверное, самый простой способ сделать это. Ссылка здесь.