Организация набора тестов
По мере роста проектов неизбежно добавляется всё больше и больше интеграционных тестов. Это увеличивает время сборки и замедляет продуктивность.
Чтобы предотвратить это, следует запускать тесты параллельно. WebdriverIO уже тестирует каждую спецификацию (или feature file в Cucumber) параллельно в рамках одной сессии. В общем, старайтесь тестировать только одну функцию на файл спецификации. Постарайтесь не иметь слишком много или слишком мало тестов в одном файле. (Однако, здесь нет золотого правила.)
После того, как у вас появится несколько файлов спецификаций, вы должны начать запускать тесты параллельно. Для этого настройте свойство maxInstances в конфигурационном файле. WebdriverIO позволяет запускать тесты с максимальной параллельностью — это означает, что независимо от того, сколько у вас файлов и тестов, они все могут выполняться параллельно. (Это по-прежнему подчиняется определенным ограничениям, таким как CPU вашего компьютера, ограничения параллельности и т.д.)
Допустим, у вас есть 3 разных возможности (Chrome, Firefox и Safari), и вы установили
maxInstancesв1. Тест-раннер WDIO создаст 3 процесса. Следовательно, есл и у вас 10 файлов спецификаций и вы установитеmaxInstancesв10, все файлы спецификаций будут тестироваться одновременно, и будет создано 30 процессов.
Вы можете определить свойство maxInstances глобально, чтобы установить атрибут для всех браузеров.
Если вы запускаете собственную сетку WebDriver, у вас может быть (например) больше мощности для одного браузера, чем для другого. В этом случае вы можете ограничить maxInstances в объекте capability:
// wdio.conf.js
export const config = {
// ...
// set maxInstance for all browser
maxInstances: 10,
// ...
capabilities: [{
browserName: 'firefox'
}, {
// maxInstances can get overwritten per capability. So if you have an in-house WebDriver
// grid with only 5 firefox instance available you can make sure that not more than
// 5 instance gets started at a time.
browserName: 'chrome'
}],
// ...
}
Наследование от основного конфигурационного файла
Если вы запускаете свой набор тестов в нескольких средах (например, dev и integration), может быть полезно использовать несколько конфигурационных файлов для удобства управления.
Аналогично концепции объекта страницы, первое, что вам нужно, — это основной файл конфигурации. Он содержит все конфигурации, которые вы используете во всех средах.
Затем создайте другой файл конфигурации для каждой среды и дополните основную конфигурацию специфичными для среды:
// wdio.dev.config.js
import { deepmerge } from 'deepmerge-ts'
import wdioConf from './wdio.conf.js'
// have main config file as default but overwrite environment specific information
export const config = deepmerge(wdioConf.config, {
capabilities: [
// more caps defined here
// ...
],
// run tests on sauce instead locally
user: process.env.SAUCE_USERNAME,
key: process.env.SAUCE_ACCESS_KEY,
services: ['sauce']
}, { clone: false })
// add an additional reporter
config.reporters.push('allure')
Группировка тестовых спецификаций в наборы
Вы можете группировать тестовые спецификации в наборы и запускать отдельные конкретные наборы вместо всех сразу.
Сначала определите свои наборы в конфигурации WDIO:
// wdio.conf.js
export const config = {
// define all tests
specs: ['./test/specs/**/*.spec.js'],
// ...
// define specific suites
suites: {
login: [
'./test/specs/login.success.spec.js',
'./test/specs/login.failure.spec.js'
],
otherFeature: [
// ...
]
},
// ...
}
Теперь, если вы хотите запустить только один набор, вы можете передать имя набора в качестве аргумента CLI:
wdio wdio.conf.js --suite login
Или запустите несколько наборов одновременно:
wdio wdio.conf.js --suite login --suite otherFeature
Группировка тестовых спецификаций для последовательного запуска
Как описано выше, есть преимущества в параллельном запуске тестов. Однако, есть случаи, когда было бы полезно сгруппировать тесты для последовательного запуска в одном экземпляре. Примерами этого в основном являются случаи, когда есть большие затраты на настройку, например, транспиляция кода или подготовка облачных экземпляров, но есть также продвинутые модели использования, которые выигрывают от этой возможности.
Чтобы сгруппировать тесты для запуска в одном экземпляре, определите их как массив в определении specs.
"specs": [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
],
"./test/specs/test_b*.js",
],
В приведенном выше примере тесты 'test_login.js', 'test_product_order.js' и 'test_checkout.js' будут запущены последовательно в одном экземпляре, а каждый из тестов "test_b*" будет запущен параллельно в отдельных экземплярах.
Также возможно группировать спецификации, определенные в наборах, так что теперь вы можете также определить наборы следующим образом:
"suites": {
end2end: [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
]
],
allb: ["./test/specs/test_b*.js"]
},
и в этом случае все тесты из набора "end2end" будут запущены в одном экземпляре.
При последовательном запуске тестов с использованием шаблона, файлы спецификаций будут запускаться в алфавитном порядке.
"suites": {
end2end: ["./test/specs/test_*.js"]
},
Это запустит файлы, соответствующие приведенному выше шаблону, в следующем порядке:
[
"./test/specs/test_checkout.js",
"./test/specs/test_login.js",
"./test/specs/test_product_order.js"
]
Запуск выбранных тестов
В некоторых случаях вы можете захотеть выполнить только один тест (или подмножество тестов) из ваших наборов.
С помощью параметра --spec вы можете указать, какой suite (Mocha, Jasmine) или feature (Cucumber) должен быть запущен. Путь разрешается относительно вашего текущего рабочего каталога.
Например, чтобы запустить только ваш логин-тест:
wdio wdio.conf.js --spec ./test/specs/e2e/login.js
Или запустите несколько спецификаций одновременно:
wdio wdio.conf.js --spec ./test/specs/signup.js --spec ./test/specs/forgot-password.js
Если значение --spec не указывает на конкретный файл спецификации, оно вместо этого используется для фильтрации имен файлов спецификаций, определенных в вашей конфигурации.
Чтобы запустить все спецификации со словом "dialog" в именах файлов спецификации, вы можете использовать:
wdio wdio.conf.js --spec dialog
Обратите внимание, что каждый тестовый файл запускается в отдельном процессе запуска теста. Поскольку мы не сканируем файлы заранее (см. следующий раздел для получения информации о передаче имен файлов в wdio), вы не можете использовать (например) describe.only в верхней части вашего файла спецификации, чтобы указать Mocha запускать только этот набор.
Эта функция поможет вам достичь той же цели.
Когда предоставляется опция --spec, она переопределит любые шаблоны, определенные параметром specs на уровне конфигурации или возможности.
Исключение выбранных тестов
При необходимости, если вам нужно исключить определенный файл спецификации (или файлы) из запуска, вы можете использовать параметр --exclude (Mocha, Jasmine) или feature (Cucumber).
Например, чтобы исключить ваш логин-тест из запуска теста:
wdio wdio.conf.js --exclude ./test/specs/e2e/login.js
Или исключите несколько файлов спецификаций:
wdio wdio.conf.js --exclude ./test/specs/signup.js --exclude ./test/specs/forgot-password.js
Или исключите файл спецификации при фильтрации с помощью набора:
wdio wdio.conf.js --suite login --exclude ./test/specs/e2e/login.js
Если значение --exclude не указывает на конкретный файл спецификации, оно вместо этого используется для фильтрации имен файлов спецификаций, определенных в вашей конфигурации.
Чтобы исключить все спецификации со словом "dialog" в именах файлов спецификаций, вы можете использовать:
wdio wdio.conf.js --exclude dialog
Исключение целого набора
Вы также можете исключить целый набор по имени. Если значение исключения соответствует имени набора, определенному в вашей конфигурации, и не выглядит как путь к файлу, весь набор будет пропущен:
wdio wdio.conf.js --suite login --suite checkout --exclude login
Это запустит только набор checkout, полностью пропустив набор login.
Смешанные исключения (наборы и шаблоны спецификаций) работают как ожидается:
wdio wdio.conf.js --suite login --exclude dialog --exclude signup
В этом примере, если signup - это определенное имя набора, этот набор будет исключен. Шаблон dialog отфильтрует любые файлы спецификаций, содержащие "dialog" в их имени файла.
Если вы указываете и --suite X, и --exclude X, исключение имеет приоритет, и набор X з апущен не будет.
Когда предоставляется опция --exclude, она переопределит любые шаблоны, определенные параметром exclude на уровне конфигурации или возможности.
Запуск наборов и тестовых спецификаций
Запустите весь набор вместе с отдельными спецификациями.
wdio wdio.conf.js --suite login --spec ./test/specs/signup.js