Параллельный запуск тестов
Параллельность в Testplane
Параллельность в Testplane — это возможность одновременно выполнять несколько тестовых сценариев в разных браузерных сессиях, чтобы сокра тить общее время прогона тестов.
sessionsPerBrowser
В конфигурационном файле объявляются типы браузеров в поле browsers. Для каждого типа браузера независимо настраивается, сколько экземпляров может работать одновременно:
// .testplane.config.ts
export default {
browsers: {
chrome: {
sessionsPerBrowser: 5, // до 5 параллельных сессий Chrome
},
firefox: {
sessionsPerBrowser: 2, // до 2 параллельных сессий Firefox
},
},
};
Параметр sessionsPerBrowser является ключевым в рамках управления параллельностью. Он определяет, сколько браузеров одного типа Testplane запустит одновременно. По умолчанию значение: 1.
Воркеры
Параметр workers определяет, сколько дочерних процессов-воркеров будет запущено. Архитектурно это выглядит так:
Master-процесс — координирует запуск, формирует очереди тестов и раздает задания воркерамWorker-процессы — непосредственно исполняют тесты
Каждый воркер — это отдельный поток, но внутри одного воркера тесты выполняются конкурентно: когда тест ждет ответа от браузера (await), воркер не простаивает, а переключается на следующий тест. Поэтому даже один воркер способен обслуживать множество параллельных браузерных сессий.
workers и sessionsPerBrowser — независимые ограничения. Увеличение числа воркеров не увеличивает реальную параллельность, если sessionsPerBrowser остается прежним.
testsPerSession
Параметр testsPerSession отвечает за то, сколько тестов можно запускать последовательно в одной сессии браузера. Параметр ограничивает переиспользование сессии, чтобы не допустить падения тестов из-за деградации браузера, и не имеет отношения к параллельному запуску тестов.
Пример
В рамках примера исполнять тесты будет один воркер:
system: {
workers: 1,
},
Параметру sessionsPerBrowser присвоены значения 5:
chrome: {
headless: true,
desiredCapabilities: {
browserName: "chrome"
},
sessionsPerBrowser: 5, // 5 параллельных сессий Chrome
testsPerSession: 3,
waitTimeout: 10000,
}
и 2:
firefox: {
headless: true,
desiredCapabilities: {
browserName: "firefox"
},
sessionsPerBrowser: 2, // 2 параллельные сессии Firefox
testsPerSession: 3,
waitTimeout: 10000,
}
Далее тесты:
describe("test examples", () => {
it("Поиск элемента по data-testid", async ({ browser }) => {
// Открываем страницу и ждем ее загрузки
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по атрибуту data-testid
const element = await browser.$('[data-testid="main-content"]');
// Проверяем существование элемента в DOM
const isExisting = await element.isExisting();
console.log("Элемент с data-testid существует:", isExisting);
});
it("Поиск элемента на главной странице", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по классу "navbar"
const navbar = await browser.$(".navbar");
// Проверяем, отображается ли элемент на странице
const isDisplayed = await navbar.isDisplayed();
console.log("Навбар отображается:", isDisplayed);
});
it("Поиск элемента по id на главной странице", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по id "__docusaurus"
const main = await browser.$("#__docusaurus");
// Проверяем, отображается ли элемент на странице
const isDisplayed = await main.isDisplayed();
console.log("Элемент отображается:", isDisplayed);
});
it("Поиск элемента по типу атрибута", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем кнопку по атрибуту type="button"
// Формат селектора: element[type="value"]
const button = await browser.$('button[type="button"]');
// Проверяем существование элемента в DOM
const isExisting = await button.isExisting();
console.log("Кнопка существует:", isExisting);
});
it("Поиск элемента по тексту", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по тексту внутри него
const link = await browser.$('//a[text()="Docs"]');
// Проверяем существование элемента в DOM
const isExisting = await link.isExisting();
console.log("Элемент с текстом существует:", isExisting);
});
it("Поиск элемента по атрибуту", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по атрибуту type
const button = await browser.$('//button[@type="button"]');
// Проверяем существование элемента в DOM
const isExisting = await button.isExisting();
console.log("Элемент с атрибутом существует:", isExisting);
});
it("Поиск кнопки с помощью метода getByRole", async ({ browser }) => {
await browser.url("https://testplane.io/");
const button = await browser.getByRole("button", { name: "Get started" });
await button.click();
});
});