Экспорт и импорт тестовых данных

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


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

Тестовые данные обычно хранятся в отдельных файлах форматов .js, .json или .ts (для TypeScript-проектов). Разделение данных от логики теста обеспечивает:

  • Чистоту тестового кода.
  • Легкую замену и обновление данных.
  • Возможность многократного использования одних и тех же данных в разных сценариях.

Пример структуры проекта:

project/
│
├─ test/
│  ├─ specs/
│  │  └─ login.spec.js
│  └─ data/
│     ├─ users.js
│     └─ products.json

Экспорт данных из файлов JavaScript

В JavaScript для организации тестовых данных используются объекты и массивы. Для их предоставления другим модулям применяется export.

Пример users.js:

const users = [
    { username: 'admin', password: 'admin123' },
    { username: 'user', password: 'user123' },
];

export default users;
  • export default позволяет импортировать объект с любым именем.
  • Можно также использовать именованный экспорт, если данных несколько:
export const adminUser = { username: 'admin', password: 'admin123' };
export const regularUser = { username: 'user', password: 'user123' };

Импорт тестовых данных в спецификации

Для подключения данных в тестах используется import:

import users from '../data/users.js';

describe('Login tests', () => {
    it('should login with admin credentials', async () => {
        await browser.url('/login');
        await $('#username').setValue(users[0].username);
        await $('#password').setValue(users[0].password);
        await $('button[type="submit"]').click();
        await expect($('#welcome')).toHaveTextContaining('Welcome');
    });
});
  • Импортируемые данные могут быть массивами, объектами или даже функциями, возвращающими динамические значения.
  • Это позволяет тестам быть независимыми от конкретных значений, упрощая их поддержку.

Работа с JSON-файлами

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

Пример products.json:

[
    { "id": 1, "name": "Laptop", "price": 1200 },
    { "id": 2, "name": "Smartphone", "price": 800 }
]

Импорт JSON в WebdriverIO возможен напрямую через import (Node.js поддерживает JSON-импорт):

import products from '../data/products.json';

describe('Product tests', () => {
    it('should display product details', async () => {
        await browser.url('/products/1');
        const productName = await $('#product-name').getText();
        expect(productName).toBe(products[0].name);
    });
});
  • JSON удобно использовать для больших наборов данных, например, каталогов товаров или списков пользователей.
  • При необходимости JSON может быть динамически изменяем через скрипты перед тестированием.

Динамическое создание тестовых данных

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

export function generateRandomUser() {
    const id = Math.floor(Math.random() * 10000);
    return {
        username: `user${id}`,
        password: `pass${id}`
    };
}

Импорт и использование:

import { generateRandomUser } from '../data/users.js';

describe('Dynamic user login', () => {
    it('should register and login new user', async () => {
        const newUser = generateRandomUser();
        await browser.url('/register');
        await $('#username').setValue(newUser.username);
        await $('#password').setValue(newUser.password);
        await $('button[type="submit"]').click();
        await expect($('#welcome')).toHaveTextContaining('Welcome');
    });
});
  • Такой подход повышает гибкость тестов и предотвращает конфликты при параллельном выполнении.

Импорт нескольких наборов данных

Для крупных проектов часто используется объединение нескольких файлов с данными через центральный модуль-агрегатор:

// data/index.js
import users from './users.js';
import products from './products.json';

export { users, products };

Импорт в тесте:

import { users, products } from '../data';

describe('Combined tests', () => {
    it('should validate user and product', async () => {
        console.log(users[0].username, products[1].name);
    });
});
  • Централизованный импорт упрощает поддержку и предотвращает повторение путей к файлам данных.
  • Позволяет организовать данные по категориям и типам, сохраняя структуру проекта чистой.

Использование параметризации с тестовыми данными

WebdriverIO поддерживает параметризованные тесты через forEach или it.each (с дополнительными библиотеками, например mocha-each).

Пример:

import users from '../data/users.js';

users.forEach(user => {
    it(`should login as ${user.username}`, async () => {
        await browser.url('/login');
        await $('#username').setValue(user.username);
        await $('#password').setValue(user.password);
        await $('button[type="submit"]').click();
        await expect($('#welcome')).toHaveTextContaining('Welcome');
    });
});
  • Такой метод позволяет автоматически создавать тесты для каждого набора данных.
  • Исключает дублирование кода и делает отчёты тестирования более информативными.

Работа с конфигурационными данными

Для глобальных параметров, таких как URL, таймауты, учётные данные администратора, удобно использовать отдельный конфигурационный файл:

// config.js
export default {
    baseUrl: 'https://example.com',
    timeout: 5000,
    admin: { username: 'admin', password: 'admin123' }
};

Использование:

import config from '../config.js';

await browser.url(config.baseUrl);
await $('#username').setValue(config.admin.username);
await $('#password').setValue(config.admin.password);
  • Центральный конфигурационный модуль обеспечивает единое место для изменений параметров тестовой среды.
  • Снижает вероятность ошибок при обновлении данных в разных тестах.

Экспорт и импорт данных в WebdriverIO создают основу для масштабируемых и поддерживаемых автоматизированных тестов. Чёткая организация данных, разделение логики и динамическая генерация обеспечивают гибкость и ускоряют процесс тестирования в JavaScript-проектах.