Spec-Zone.ru › Playwright

Параметризация тестов

Введение​

Вы можете параметризовать тесты на уровне теста или на уровне проекта.

Параметризованные тесты​

[
  { name: 'Alice', expected: 'Hello, Alice!' },
  { name: 'Bob', expected: 'Hello, Bob!' },
  { name: 'Charlie', expected: 'Hello, Charlie!' },
].forEach(({ name, expected }) => {
  // You can also do it with test.describe() or with multiple tests as long the test name is unique.
  test(`testing with ${name}`, async ({ page }) => {
    await page.goto(`https://example.com/greet?name=${name}`);
    await expect(page.getByRole('heading')).toHaveText(expected);
  });
});

Перед и после хуков​

Большую часть времени вы должны поместить beforeEach, beforeAll, afterEach и afterAll хуки вне forEach, чтобы хуки выполнялись только один раз:

test.beforeEach(async ({ page }) => {
  // ...
});

test.afterEach(async ({ page }) => {
  // ...
});

[
  { name: 'Alice', expected: 'Hello, Alice!' },
  { name: 'Bob', expected: 'Hello, Bob!' },
  { name: 'Charlie', expected: 'Hello, Charlie!' },
].forEach(({ name, expected }) => {
  test(`testing with ${name}`, async ({ page }) => {
    await page.goto(`https://example.com/greet?name=${name}`);
    await expect(page.getByRole('heading')).toHaveText(expected);
  });
});

Если вы хотите иметь хуки для каждого теста, вы можете поместить их внутрь describe() - так они выполняются для каждой итерации/каждого отдельного теста:

[
  { name: 'Alice', expected: 'Hello, Alice!' },
  { name: 'Bob', expected: 'Hello, Bob!' },
  { name: 'Charlie', expected: 'Hello, Charlie!' },
].forEach(({ name, expected }) => {
  test.describe(() => {
    test.beforeEach(async ({ page }) => {
      await page.goto(`https://example.com/greet?name=${name}`);
    });
    test(`testing with ${expected}`, async ({ page }) => {
      await expect(page.getByRole('heading')).toHaveText(expected);
    });
  });
});

Параметризованные проекты​

Playwright Test поддерживает одновременное выполнение нескольких тестовых проектов. В следующем примере мы запустим два проекта с разными параметрами.

Мы объявляем параметр person и устанавливаем значение в конфигурации. Первый проект выполняется со значением Alice, а второй со значением Bob.

  • TypeScript
  • JavaScript
import { test as base } from '@playwright/test';

export type TestOptions = {
  person: string;
};

export const test = base.extend<TestOptions>({
  // Define an option and provide a default value.
  // We can later override it in the config.
  person: ['John', { option: true }],
});
const base = require('@playwright/test');

exports.test = base.test.extend({
  // Define an option and provide a default value.
  // We can later override it in the config.
  person: ['John', { option: true }],
});

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

import { test } from './my-test';

test('test 1', async ({ page, person }) => {
  await page.goto(`/index.html`);
  await expect(page.locator('#node')).toContainText(person);
  // ...
});

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

  • TypeScript
  • JavaScript
import { defineConfig } from '@playwright/test';
import type { TestOptions } from './my-test';

export default defineConfig<TestOptions>({
  projects: [
    {
      name: 'alice',
      use: { person: 'Alice' },
    },
    {
      name: 'bob',
      use: { person: 'Bob' },
    },
  ]
});
// @ts-check

module.exports = defineConfig({
  projects: [
    {
      name: 'alice',
      use: { person: 'Alice' },
    },
    {
      name: 'bob',
      use: { person: 'Bob' },
    },
  ]
});

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

  • TypeScript
  • JavaScript
import { test as base } from '@playwright/test';

export type TestOptions = {
  person: string;
};

export const test = base.extend<TestOptions>({
  // Define an option and provide a default value.
  // We can later override it in the config.
  person: ['John', { option: true }],

  // Override default "page" fixture.
  page: async ({ page, person }, use) => {
    await page.goto('/chat');
    // We use "person" parameter as a "name" for the chat room.
    await page.getByLabel('User Name').fill(person);
    await page.getByText('Enter chat room').click();
    // Each test will get a "page" that already has the person name.
    await use(page);
  },
});
const base = require('@playwright/test');

exports.test = base.test.extend({
  // Define an option and provide a default value.
  // We can later override it in the config.
  person: ['John', { option: true }],

  // Override default "page" fixture.
  page: async ({ page, person }, use) => {
    await page.goto('/chat');
    // We use "person" parameter as a "name" for the chat room.
    await page.getByLabel('User Name').fill(person);
    await page.getByText('Enter chat room').click();
    // Each test will get a "page" that already has the person name.
    await use(page);
  },
});
примечание

Поведение параметризованных проектов изменилось в версии 1.18. Узнать больше.

Передача переменных окружения​

Вы можете использовать переменные окружения для настройки тестов из командной строки.

Например, рассмотрим следующий тестовый файл, которому необходимы имя пользователя и пароль. Обычно не стоит хранить секреты в исходном коде, поэтому нам нужен способ передачи секретов извне.

test(`example test`, async ({ page }) => {
  // ...
  await page.getByLabel('User Name').fill(process.env.USER_NAME);
  await page.getByLabel('Password').fill(process.env.PASSWORD);
});

Вы можете запустить этот тест, установив секретное имя пользователя и пароль в командной строке.

  • Bash
  • PowerShell
  • Batch
USER_NAME=me PASSWORD=secret npx playwright test
$env:USER_NAME=me
$env:PASSWORD=secret
npx playwright test
set USER_NAME=me
set PASSWORD=secret
npx playwright test

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

import { defineConfig } from '@playwright/test';

export default defineConfig({
  use: {
    baseURL: process.env.STAGING === '1' ? 'http://staging.example.test/' : 'http://example.test/',
  }
});

Теперь вы можете запускать тесты в среде staging или production:

  • Bash
  • PowerShell
  • Batch
STAGING=1 npx playwright test
$env:STAGING=1
npx playwright test
set STAGING=1
npx playwright test

.env файлы​

Чтобы упростить управление переменными окружения, рассмотрите что-то вроде файлов .env. Вот пример, который использует пакет dotenv для прямого чтения переменных окружения в файле конфигурации.

import { defineConfig } from '@playwright/test';
import dotenv from 'dotenv';
import path from 'path';

// Read from ".env" file.
dotenv.config({ path: path.resolve(__dirname, '.env') });

// Alternatively, read from "../my.env" file.
dotenv.config({ path: path.resolve(__dirname, '..', 'my.env') });

export default defineConfig({
  use: {
    baseURL: process.env.STAGING === '1' ? 'http://staging.example.test/' : 'http://example.test/',
  }
});

Теперь вы можете просто изменить файл .env, чтобы установить любые нужные переменные.

# .env file
STAGING=0
USER_NAME=me
PASSWORD=secret

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

npx playwright test

Создание тестов с помощью CSV-файла​

Запускаемый Playwright test-runner работает в Node.js, это означает, что вы можете напрямую читать файлы из файловой системы и парсить их с помощью вашей любимой библиотеки для CSV.

Смотрите, например, этот CSV-файл, в нашем примере input.csv:

"test_case","some_value","some_other_value"
"value 1","value 11","foobar1"
"value 2","value 22","foobar21"
"value 3","value 33","foobar321"
"value 4","value 44","foobar4321"

На основе этого мы сгенерируем некоторые тесты, используя библиотеку csv-parse из NPM:

import fs from 'fs';
import path from 'path';
import { test } from '@playwright/test';
import { parse } from 'csv-parse/sync';

const records = parse(fs.readFileSync(path.join(__dirname, 'input.csv')), {
  columns: true,
  skip_empty_lines: true
});

for (const record of records) {
  test(`foo: ${record.test_case}`, async ({ page }) => {
    console.log(record.test_case, record.some_value, record.some_other_value);
  });
}

© 2024 Microsoft
Licensed under the Apache License, Version 2.0.
https://playwright.dev/docs/test-parameterize

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API