Перейти к основному содержимому

Организация тестовых наборов

С ростом проектов количество интеграционных тестов неизбежно увеличивается. Это увеличивает время сборки и замедляет продуктивность.

Чтобы предотвратить это, вы должны запускать тесты параллельно. WebdriverIO уже тестирует каждую спецификацию (или feature file в Cucumber) параллельно в рамках одной сессии. В общем, старайтесь тестировать только одну функцию в каждом файле спецификации. Не делайте слишком много или слишком мало тестов в одном файле. (Однако здесь нет золотого правила.)

Как только у вас появится несколько файлов спецификаций, вы должны начать запускать тесты параллельно. Для этого настройте свойство maxInstances в вашем конфигурационном файле. WebdriverIO позволяет запускать тесты с максимальным параллелизмом — это означает, что независимо от количества файлов и тестов, все они могут выполняться параллельно. (Это все еще подчиняется определенным ограничениям, таким как CPU вашего компьютера, ограничения параллелизма и т.д.)

Допустим, у вас есть 3 разных capabilities (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 вы можете указать, какой набор (Mocha, Jasmine) или функционал (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 на уровне конфигурации или capability.

Исключение выбранных тестов

При необходимости, если вам нужно исключить определенные файлы спецификаций из запуска, вы можете использовать параметр --exclude (Mocha, Jasmine) или функционал (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

Когда предоставляется опция --exclude, она переопределит любые шаблоны, определенные параметром exclude на уровне конфигурации или capability.

Запуск наборов и спецификаций тестов

Запустите весь набор вместе с отдельными спецификациями.

wdio wdio.conf.js --suite login --spec ./test/specs/signup.js

Запуск нескольких конкретных спецификаций тестов

Иногда необходимо—в контексте непрерывной интеграции и в других случаях—указать несколько наборов спецификаций для запуска. Утилита командной строки wdio от WebdriverIO принимает переданные через пайп имена файлов (от find, grep или других).

Имена файлов, переданные через пайп, переопределяют список глобов или имен файлов, указанных в списке spec конфигурации.

grep -r -l --include "*.js" "myText" | wdio wdio.conf.js

Примечание: Это не переопределит флаг --spec для запуска одной спецификации.

Запуск конкретных тестов с MochaOpts

Вы также можете фильтровать конкретные suite|describe и/или it|test, которые вы хотите запустить, передав специфический для mocha аргумент: --mochaOpts.grep в CLI wdio.

wdio wdio.conf.js --mochaOpts.grep myText
wdio wdio.conf.js --mochaOpts.grep "Text with spaces"

Примечание: Mocha будет фильтровать тесты после того, как тестовый запускатель WDIO создаст экземпляры, поэтому вы можете увидеть несколько создаваемых экземпляров, которые фактически не выполняются.

Исключение конкретных тестов с MochaOpts

Вы также можете фильтровать конкретные suite|describe и/или it|test, которые вы хотите исключить, передав специфический для mocha аргумент: --mochaOpts.invert в CLI wdio. --mochaOpts.invert выполняет противоположное тому, что делает --mochaOpts.grep

wdio wdio.conf.js --mochaOpts.grep "string|regex" --mochaOpts.invert
wdio wdio.conf.js --spec ./test/specs/e2e/login.js --mochaOpts.grep "string|regex" --mochaOpts.invert

Примечание: Mocha будет фильтровать тесты после того, как тестовый запускатель WDIO создаст экземпляры, поэтому вы можете увидеть несколько создаваемых экземпляров, которые фактически не выполняются.

Остановка тестирования после сбоя

С помощью опции bail вы можете сказать WebdriverIO остановить тестирование после любого неудавшегося теста.

Это полезно при больших наборах тестов, когда вы уже знаете, что ваша сборка не пройдет, но хотите избежать длительного ожидания полного тестового запуска.

Опция bail ожидает число, которое указывает, сколько сбоев тестов может произойти, прежде чем WebDriver остановит весь тестовый запуск. По умолчанию значение 0, что означает, что он всегда запускает все спецификации тестов, которые может найти.

Пожалуйста, смотрите Страницу опций для получения дополнительной информации о конфигурации bail.

Иерархия опций запуска

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

Аргумент CLI --spec > шаблон specs capability > шаблон specs конфигурации Аргумент CLI --exclude > шаблон exclude конфигурации > шаблон exclude capability

Если задан только параметр конфигурации, он будет использоваться для всех capabilities. Однако, если определить шаблон на уровне capability, он будет использоваться вместо шаблона конфигурации. Наконец, любой шаблон спецификации, определенный в командной строке, переопределит все другие заданные шаблоны.

Использование шаблонов спецификаций, определенных в capability

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

Например, допустим, у вас есть два каталога, один для тестов Android, а другой для тестов iOS.

Ваш конфигурационный файл может определять шаблон следующим образом для неспецифичных тестов устройств:

{
specs: ['tests/general/**/*.js']
}

но затем у вас будут разные capabilities для ваших устройств Android и iOS, где шаблоны могут выглядеть так:

{
"platformName": "Android",
"specs": [
"tests/android/**/*.js"
]
}
{
"platformName": "iOS",
"specs": [
"tests/ios/**/*.js"
]
}

Если вы включите оба эти capabilities в ваш конфигурационный файл, то устройство Android будет запускать только тесты в пространстве имен "android", а тесты iOS будут запускать только тесты в пространстве имен "ios"!

//wdio.conf.js
export const config = {
"specs": [
"tests/general/**/*.js"
],
"capabilities": [
{
platformName: "Android",
specs: ["tests/android/**/*.js"],
//...
},
{
platformName: "iOS",
specs: ["tests/ios/**/*.js"],
//...
},
{
platformName: "Chrome",
//config level specs will be used
}
]
}

Welcome! How can I help?

WebdriverIO AI Copilot