В тестировании веб-приложений с использованием Protractor данные часто играют ключевую роль. Особенно важны внешние источники данных, которые позволяют создавать гибкие, масштабируемые и легко поддерживаемые тесты. Одним из самых удобных форматов для хранения и передачи тестовых данных является JSON (JavaScript Object Notation).
JSON представляет собой легковесный формат обмена данными, основанный на парах «ключ–значение». Его основными преимуществами являются:
Пример простого JSON-файла для тестирования:
{
"users": [
{
"username": "testuser1",
"password": "Password123"
},
{
"username": "testuser2",
"password": "SecurePass456"
}
],
"urls": {
"loginPage": "https://example.com/login",
"dashboard": "https://example.com/dashboard"
}
}
В Protractor JSON-файлы подключаются через
стандартный модуль require. Это позволяет использовать
данные напрямую в тестах.
Пример использования:
const testData = require('./data/testData.json');
describe('Login tests', function() {
testData.users.forEach(user => {
it(`should login with user ${user.username}`, async function() {
await browser.get(testData.urls.loginPage);
await element(by.id('username')).sendKeys(user.username);
await element(by.id('password')).sendKeys(user.password);
await element(by.id('loginButton')).click();
expect(await browser.getCurrentUrl()).toBe(testData.urls.dashboard);
});
});
});
JSON позволяет создавать параметризованные тесты, когда один и тот же сценарий выполняется с различными наборами данных. Это особенно полезно для проверки:
Пример с проверкой нескольких сценариев:
{
"loginScenarios": [
{
"user": "admin",
"password": "admin123",
"expectedPage": "dashboard"
},
{
"user": "guest",
"password": "guest123",
"expectedPage": "welcome"
}
]
}
const scenarios = require('./data/loginScenarios.json');
describe('Login scenarios', function() {
scenarios.loginScenarios.forEach(scenario => {
it(`should login as ${scenario.user}`, async function() {
await browser.get('https://example.com/login');
await element(by.id('username')).sendKeys(scenario.user);
await element(by.id('password')).sendKeys(scenario.password);
await element(by.id('loginButton')).click();
const currentUrl = await browser.getCurrentUrl();
expect(currentUrl).toContain(scenario.expectedPage);
});
});
});
При масштабировании тестовой базы данных рекомендуется структурировать JSON-файлы по функциональным блокам:
Такое разделение упрощает поддержку тестов и делает их более читаемыми.
В Page Object JSON-файлы позволяют отделить данные от логики взаимодействия с элементами страницы:
// pageObjects/loginPage.js
class LoginPage {
constructor() {
this.usernameField = element(by.id('username'));
this.passwordField = element(by.id('password'));
this.loginButton = element(by.id('loginButton'));
}
async login(username, password) {
await this.usernameField.sendKeys(username);
await this.passwordField.sendKeys(password);
await this.loginButton.click();
}
}
module.exports = new LoginPage();
Использование JSON вместе с Page Object:
const loginPage = require('../pageObjects/loginPage');
const testData = require('./data/users.json');
describe('Login tests with Page Object', function() {
testData.users.forEach(user => {
it(`login as ${user.username}`, async function() {
await browser.get(testData.urls.loginPage);
await loginPage.login(user.username, user.password);
expect(await browser.getCurrentUrl()).toBe(testData.urls.dashboard);
});
});
});
Если JSON-файл находится на сервере или требуется загрузка
динамических данных, можно использовать HTTP-запросы
через axios или встроенный fetch (Node.js
>=18):
const axios = require('axios');
describe('Dynamic data tests', function() {
let testData;
beforeAll(async function() {
const response = await axios.get('https://example.com/testData.json');
testData = response.data;
});
it('should login with dynamic data', async function() {
await browser.get(testData.urls.loginPage);
await element(by.id('username')).sendKeys(testData.users[0].username);
await element(by.id('password')).sendKeys(testData.users[0].password);
await element(by.id('loginButton')).click();
expect(await browser.getCurrentUrl()).toBe(testData.urls.dashboard);
});
});
JSON-файлы в Protractor обеспечивают гибкость, масштабируемость и удобство управления тестовыми данными, что делает их незаменимым инструментом в современном автоматизированном тестировании.