Skip to content

Подключение и настройка Gradle плагина Emcee

Сейчас мы распространяем Gradle плагин как jar файл. Скачать можно на странице с релизами или здесь.

Создайте директорию libs в корне проекта и положите туда jar файл.

Для подключения плагина добавьте в root build.gradle.kts:

buildscript {
    dependencies {
        classpath(files("libs/emcee-gradle-plugin-20.1.0-all.jar"))
    }
}

И укажите id плагина в build.gradle.kts модуля Application:

plugins {
    id("com.android.application")
    id("com.avito.android.emcee")
}

Настройка плагина#

Плагин настраивается через свойства расширения плагина.

Свойство Описание
queueBaseUrl Адрес очереди Emcee.
testTimeout Максимальная длительность каждого теста в секундах.
executionTimeout (Доступно с версии Emcee 20.1.0) Параметр опциональный, значение по-умолчанию 60 минут. Максимальная длительность всего прогона в минутах.
artifactory Настройки для Artifactory.
Имеет вложенные свойства: user, password, baseUrl, repository, connectionTimeout, readTimeout, writeTimeout.
user имя пользователя Artifactory. Если авторизация выключена, то поле можно оставить пустым.
password пароль пользователя Artifactory. Если авторизация выключена, то поле можно оставить пустым.
baseUrl url адрес Artifactory, куда будут отправляться файлы. Например, http://<your hostname or ip>:8081/artifactory/.
repository репозиторий внутри Artifactory.
connectionTimeout, readTimeout, writeTimeout настройки HTTP клиента для Artifactory.
job Логическая единица работы для обработки очередью. Обычно один прогон тестов равняется одной job.
Имеет вложенные свойства: id, groupId, priority, groupPriority.
id id для job. Укажите пустое значение для автоматического создания или укажите свое значение вручную.
groupId id для объединения jobs в группы.
priority приоритет для job. Чем выше значение, тем выше приоритет выполняемой работы. Допустимые значения 0..999.
groupPriority аналогично priority, только применяется для group.
retries Количество попыток перезапустить неуспешный тест.
loggerConfiguration Конфигурация логгера для плагина.
Имеет вложенные свойства:
logLevel уровень логгирования. Доступны несколько вариантов: verbose, debug, info, warning, critical.
printStackTrace определяет печатать ли stackTrace, варианты true или false.
screenRecordConfiguration (Доступно с версии Emcee 20.0.0) Конфигурация записи экрана при запусках тестов. Доступна настройка записи видео через вложенное свойство videoRecordStrategy и стратегии записи экрана ScreenRecordStrategy.RECORD_ALL, RECORD_NONE, RECORD_ON_FAIL.
devices Список с описанием устройств, на которых будут запускаться тесты. Требуется указать минимум один девайс.
Доступные версии api: 24, 27, 29, 31. Все версии api имеют разрешение экрана 320x480 и 120dpi.
testsSplitter Стратегия разбивки на бакеты. Возможные варианты:
- type: individual. По одному тесту на бакет, количество бакетов равно количеству тестов. Максимальная изоляция тестов, но бОльшие инфраструктурные издержки.
- type: equallyDivided. Равное количество тестов в каждом бакете, количество бакетов будет равно количеству тестов.
- type: timeWeighted. Ожинаковое время выполнения каждого бакета. Должен быть включен сервис истории тестов в очереди. Дополнитеьный параметр minBucketTime: 60 определяет минимальное время выполнения бакета в секундах (без учета инфрастукртурных издержек).
- type: unsplit. Все тесты попадут в один бакет.

Пример конфигурации плагина Emcee на Kotlin DSL:

import com.avito.emcee.client.ScreenRecordStrategy
import java.time.Duration

plugins {
    id("com.android.application")
    id("com.avito.android.emcee")
}

android {
    //...
}

emcee {
    queueBaseUrl.set("http://<your hostname or ip>:41000/")
    testTimeout.set(Duration.ofMinutes(1))
    artifactory {
        user.set("Set to empty or set username if auth is enabled in Artifactory")
        password.set("Set to empty or set password if auth is enabled in Artifactory")
        baseUrl.set("http://<your hostname or ip>:8081/artifactory/")
        repository.set("emcee-transport")
        connectionTimeout.set(Duration.ofMinutes(1))
        readTimeout.set(Duration.ofMinutes(1))
        writeTimeout.set(Duration.ofMinutes(1))
    }
    job {
        groupId.set("Emcee Android Sample")
        groupPriority.set(1)
        id.set("Set me to empty for auto generation or set your id")
        priority.set(1)
    }
    retries.set(1)
    loggerConfiguration {
        logLevel.set("info")
        printStackTrace.set(false)
    }
    screenRecordConfiguration {
        videoRecordStrategy.set(ScreenRecordStrategy.RECORD_ON_FAIL)
    }
    devices {
        addDevice(24, "default")
    }
}

Фильтрация тестов#

Для отправки в очередь только определенных тестов можно применить фильтрацию.

Для этого нужно зарегистрировать группу фильтров, дать группе имя и указать нужные фильтры. Например:

import com.avito.emcee.client.internal.test_filter.TestFilter.AnnotationFilter
import com.avito.emcee.client.internal.test_filter.TestFilter.ClassNameFilter

emcee {
    // ...
    testsFilters {
        registerFilterGroup(
            name = "group1",
            filters = listOf(
                AnnotationFilter("FlakyTest"),
                AnnotationFilter("LargeTest"),
            )
        )
        registerFilterGroup(
            name = "group2",
            filters = listOf(
                ClassNameFilter("TestClassName")
            )
        )
    }
}

Можно зарегистрировать сразу несколько групп фильтров, в которых можно комбинировать фильтры разного типа.

Для применения фильтрации к команде отправки тестов в очередь добавляется аргумент с указанием имени группы:

./gradlew emceeTestDebug --filterGroupName group1

Доступные виды фильтров:

Фильтр Описание
AnnotationFilter Фильтр по имени аннотации тестов. Например, Flaky или LargeTest.
PackageNameFilter Фильтр по имени пакета. Например, com.example.specialtest.
ClassNameFilter Фильтр по имени класса с тестами. Например, ExampleInstrumentedTest.