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

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

Чтение JSON файлов

В WebdriverIO для чтения JSON-файлов используется встроенный модуль Node.js fs или require.

Пример с require:

const testData = require('./data/testData.json');

console.log(testData.username); // выводит значение поля username

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

Пример с fs для асинхронного чтения:

const fs = require('fs').promises;

async function readJsonFile(filePath) {
    const data = await fs.readFile(filePath, 'utf-8');
    return JSON.parse(data);
}

(async () => {
    const testData = await readJsonFile('./data/testData.json');
    console.log(testData.password);
})();

Использование fs.promises позволяет асинхронно читать файлы и обрабатывать большие JSON-файлы без блокировки основного потока.

Запись данных в JSON

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

Пример записи с fs:

const fs = require('fs').promises;

async function writeJsonFile(filePath, data) {
    const jsonString = JSON.stringify(data, null, 4); // красивое форматирование
    await fs.writeFile(filePath, jsonString, 'utf-8');
}

(async () => {
    const result = { test: 'login', status: 'passed', timestamp: new Date() };
    await writeJsonFile('./results/testResult.json', result);
})();

Параметр null, 4 в JSON.stringify отвечает за форматирование с отступом 4 пробела, что облегчает чтение файлов вручную.

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

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

Пример параметризации:

const testData = require('./data/users.json');

describe('Login Tests', () => {
    testData.forEach(user => {
        it(`should login with user ${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-message')).toHaveTextContaining(`Welcome, ${user.username}`);
        });
    });
});

Такой подход уменьшает дублирование кода и делает тесты более поддерживаемыми.

Работа с вложенными JSON структурами

Часто JSON-файлы содержат сложные структуры: массивы объектов, вложенные объекты, массивы внутри объектов.

Пример доступа к вложенным данным:

const config = require('./config/appConfig.json');

console.log(config.database.host); // доступ к полю host
console.log(config.users[0].permissions[2]); // доступ к третьему разрешению первого пользователя

Важно использовать проверку существования полей при работе с динамическими или непредсказуемыми JSON-файлами, чтобы избежать ошибок типа Cannot read property of undefined.

Изменение данных в JSON

Чтобы изменить данные в JSON-файле, необходимо:

  1. Прочитать файл.
  2. Изменить объект в памяти.
  3. Записать обратно в файл.

Пример обновления поля:

const fs = require('fs').promises;

async function updateJsonField(filePath, key, value) {
    const data = JSON.parse(await fs.readFile(filePath, 'utf-8'));
    data[key] = value;
    await fs.writeFile(filePath, JSON.stringify(data, null, 4), 'utf-8');
}

updateJsonField('./data/testData.json', 'username', 'newUser');

Этот подход сохраняет структуру и форматирование JSON-файла, избегая потери данных.

Рекомендации при работе с JSON в тестах WebdriverIO

  • Хранить все тестовые данные в отдельных JSON-файлах, а не в коде тестов.
  • Использовать понятные имена ключей и вложенные структуры для логической организации данных.
  • Для больших файлов применять асинхронное чтение с fs.promises, чтобы не блокировать выполнение тестов.
  • Проверять наличие полей перед доступом к ним, чтобы избежать ошибок во время выполнения тестов.
  • Форматировать JSON для удобного ручного чтения при отладке.

Эффективная работа с JSON-файлами в WebdriverIO позволяет сделать автоматизированное тестирование более структурированным, гибким и масштабируемым.