JSON (JavaScript Object Notation) является стандартным форматом для хранения и обмена данными в веб-приложениях. В контексте автоматизированного тестирования с использованием WebdriverIO 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 необходима для логирования результатов тестов, сохранения динамических данных или генерации отчетов.
Пример записи с 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 пробела, что облегчает чтение файлов
вручную.
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-файлы содержат сложные структуры: массивы объектов, вложенные объекты, массивы внутри объектов.
Пример доступа к вложенным данным:
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-файле, необходимо:
Пример обновления поля:
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-файла, избегая потери данных.
fs.promises, чтобы не блокировать выполнение тестов.Эффективная работа с JSON-файлами в WebdriverIO позволяет сделать автоматизированное тестирование более структурированным, гибким и масштабируемым.