Используйте create-testplane
, чтобы быстро и удобно настроить testplane как в новом, так и в уже существующем проекте.
npm init testplane my-app
Если не указать путь, проект будет развернут в текущей директории.
Если по указанному пути уже имеется проект, инструмент попробует определить используемый пакетный менеджер, и будет использовать его для установки пакетов.
По умолчанию, проект будет настроен без всяких вопросов.
Для запуска инструмента в режиме продвинутой установки, Вы можете добавить аргумент -v
или --verbose
. Это позволит выбрать пакетный менеджер или сразу установить дополнительные плагины.
npm init testplane my-app -- -v
В этом режиме у вас не будут спрашивать о желаемых плагинах и пакетном менеджере, будут использоваться настройки по умолчанию.
Пакетный менеджер по умолчанию, используемый без аргумента --verbose
: npm
Плагины по умолчанию, устанавливаемые без аргумента --verbose
:
По умолчанию create-testplane настраивает проект с поддержкой typescript тестов.
Вы можете отказаться от использования typescript, добавив аргумент --lang js
:
npm init testplane my-app -- --lang js
- Global Hook - Чтобы вынести общую логику из своих тестов в специальные обработчики для
beforeEach
иafterEach
хуков - Plugins Profiler - Для профилирования плагинов
- Retry Progressive - Чтобы дополнительно прогонять тесты, если ошибки, с которыми они упали, соответствуют заданному набору шаблонов
- Test Filter - Чтобы запускать только указанные в
.json
файле тесты в указанных браузерах - Retry Limiter - Чтобы ограничить количество попыток перезапуска и время выполнения тестов
- Headless Chrome - Чтобы добавить и установить браузер chrome в режиме
headless
- Profiler - Чтобы генерировать отчет о выполненных командах и их производительности
- Safari Commands - Чтобы поддержать работу для браузера
safari
на мобильных устройствах - Test Repeater - Чтобы повторять тесты указанное количество раз вне зависимости от результата
- Url Decorator - Чтобы добавить/заменить параметры запроса в
url
команде - Storybook - Чтобы писать тесты на
storybook
компонентах и ускорить время их выполнения - Html Reporter - Чтобы генерировать отчеты для отображения прошедших/упавших тестах, разницы между скриншотами, ошибкок, мета информации
- Oauth - Чтобы установить заголовок авторизации с OAuth токеном
- Retry Command - Чтобы повторить снятие скриншота, если сравнение изображений завершилось с ошибкой
- Tabs Closer - Чтобы закрывать открытые вкладки из прошлых тестов, чтобы браузер не деградировал
Вы можете создать свой node-js скрипт на основе create-testplane
для разворачивания конфигурации.
Это может понадобиться, к примеру, если у вас есть внутренние плагины для testplane, распространяемые для проектов внутри компании.
import createTestplane from "create-testplane";
createTestplane.run({
createOpts,
createBaseConfig,
generalPrompts,
generalPromptsHandler,
createPluginsConfig,
getExtraPackagesToInstall,
getTestExample,
registry
});
Примечание: в testplaneConfig
можно класть только сериализуемые данные.
Обязательный параметр.
Консольный интерфейс по умолчанию обрабатывает данный путь и аргумент --verbose
.
В этом коллбэке вам необходимо указать, как минимум, значения path
и extraQuestions
:
import type { DefaultOpts } from "create-testplane";
const argvOpts = {
path: ".",
extraQuestions: false
};
const createOpts = (defaultOpts: DefaultOpts) => {
const opts = Object.assign({}, argvOpts, defaultOpts);
return opts;
};
Вы также можете изменить defaultOpts
Сейчас этот объект имеет ключ pluginGroups
, по которому create-testplane
определяет, как плагины разбиваются на группы.
Инструмент создает базовый конфиг гермионы, который затем мутирует. Вы можете изменить этот базовый конфиг:
import type { testplaneConfig, CreateBaseConfigOpts } from "create-testplane";
const createBaseConfig = (baseConfig: TestplaneConfig, opts: CreateBaseConfigOpts) => {
baseConfig.takeScreenshotOnFails = {
testFail: true,
assertViewFail: false
};
return baseConfig;
}
Вы также можете убрать или добавить общие задаваемые вопросы, обработать пользовательские ответы для изменения testplaneConfig
import type { GeneralPrompt, HandleGeneralPromptsCallback, baseGeneralPrompts } from "create-testplane";
const promptRetries: GeneralPrompt = {
type: "number",
name: "retryCount",
message: "How many times do you want to retry a failed test?",
default: 0,
};
const promptIgnoreFiles: GeneralPrompt = {
type: "input",
name: "ignoreFiles",
message: "Enter a pattern to ignore files",
default: null,
};
const generalPrompts = [...baseGeneralPrompts, promptRetries, promptIgnoreFiles];
const generalPromptsHandler: HandleGeneralPromptsCallback = (testplaneConfig, answers) => {
answers.retry = answers.retryCount;
if (answers.ignoreFiles) {
const sets = Object.values(testplaneConfig.sets || {});
for (const testSet of sets) {
testSet.ignoreFiles = testSet.ignoreFiles || [];
testSet.ignoreFiles.push(answers.ignoreFiles);
}
}
return testplaneConfig;
};
Если у GeneralPrompt
не указать значение по умолчанию, вопрос будет задан даже при extraQuestions: false
Вы также можете изменить, как включение плагинов влияет на .testplane.conf.js
import type { CreatePluginsConfigCallback } from "create-testplane";
const createPluginsConfig: CreatePluginsConfigCallback = (pluginsConfig) => {
pluginsConfig["testplane-retry-progressive"] = (testplaneConfig) => {
testplaneConfig.plugins!["testplane-retry-progressive"] = {
enabled: true,
extraRetry: 7,
errorPatterns: [
"Parameter .* must be a string",
{
name: "Cannot read property of undefined",
pattern: "Cannot read property .* of undefined",
},
],
};
}
return pluginsConfig;
}
Вы также можете изменить реестр, который будет использован для установки пакетов
import createTestplane from "create-testplane";
createTestplane.run({
registry: "https://registry.npmjs.org", // Значение по умолчанию
});
Вы также можете указать дополнительные пакеты, которые будут установлены с testplane
без всяких условий
import type { GetExtraPackagesToInstallCallback } from "create-testplane";
const getExtraPackagesToInstall: GetExtraPackagesToInstallCallback = () => ({
names: ["chai"],
notes: []
});
Для начала вам необходимо включить свой плагин в существующую группу плагинов, или создать свою:
import type {
DefaultOpts,
GeneralPrompt,
PluginPrompt
} from "create-testplane";
const createOpts = (defaultOpts: DefaultOpts) => {
const customPluginPrompt: PluginPrompt = {
// Имя плагина. Инструмент попытается загрузить его выбранным пакетным менеджером
// Суффиксы "/plugin" и "/testplane" будут удалены при загрузке
plugin: "my-custom-plugin-name",
// Описание плагина
description: "Adds some custom feature",
// Должен ли плагин быть установлен в режиме «по умолчанию»
default: false,
// Если плагин требует дополнительной настройки. Опционально
configNote: "Specify something in testplane config"
};
defaultOpts.pluginGroups.push({
description: "Custom plugin group",
plugins: [customPluginPrompt]
});
return {
...defaultOpts,
path: ".",
extraQuestions: false
};
};
Затем вам необходимо определить, как включение плагина влияет на .testplane.conf.js
import type { CreatePluginsConfigCallback } from "create-testplane";
const createPluginsConfig: CreatePluginsConfigCallback = (pluginsConfig) => {
pluginsConfig["my-custom-plugin-name"] = (testplaneConfig) => {
// В большинстве случаев вам понадобится описать настройки по умолчанию вашего плагина
testplaneConfig.plugins!["my-custom-plugin-name"] = {
enabled: true,
};
// Но вы также можете сделать с конфигом гермионы что-нибудь еще
testplaneConfig.browsers["my-custom-browser"] = {
desiredCapabilities: {
browserName: "browserName"
}
}
}
return pluginsConfig;
}