Data-driven тестирование является одной из ключевых стратегий автоматизации тестирования, позволяющей запускать одни и те же сценарии с различными наборами данных. В Protractor, инструменте для тестирования Angular-приложений на JavaScript, эта методология реализуется с помощью интеграции с внешними источниками данных и возможностью динамической генерации тестов.
Data-driven тестирование позволяет:
Для реализации используется комбинация:
Наиболее распространённый подход — использование JSON-файлов для хранения данных. Пример структуры:
[
{
"username": "user1",
"password": "pass1",
"expectedResult": true
},
{
"username": "user2",
"password": "wrongpass",
"expectedResult": false
}
]
Каждый объект в массиве соответствует одному набору входных данных и ожидаемому результату.
Для работы с JSON в Protractor достаточно стандартного
require:
const testData = require('./data/loginData.json');
describe('Login functionality', () => {
testData.forEach(data => {
it(`should login with username: ${data.username}`, async () => {
await browser.get('https://example.com/login');
await element(by.id('username')).sendKeys(data.username);
await element(by.id('password')).sendKeys(data.password);
await element(by.id('loginButton')).click();
const isLoggedIn = await element(by.id('logoutButton')).isPresent();
expect(isLoggedIn).toBe(data.expectedResult);
});
});
});
Ключевые моменты:
forEach для генерации отдельных
it блоков под каждый набор данных.async/await,
что упрощает синтаксис и повышает читаемость.expect) динамически зависит от
данных.Для интеграции с CSV или Excel требуется сторонняя библиотека. Примеры:
papaparse для CSV.xlsx для Excel.Чтение данных CSV:
const fs = require('fs');
const Papa = require('papaparse');
const csvData = fs.readFileSync('./data/loginData.csv', 'utf8');
const testData = Papa.parse(csvData, { header: true }).data;
Далее testData используется так же, как JSON-массив.
Jasmine поддерживает Array.forEach или
it.each (с внешними библиотеками) для генерации
параметризованных тестов. В Protractor это позволяет:
Иногда данные формируются в процессе выполнения тестов или берутся из внешнего API. Пример:
const axios = require('axios');
describe('API-driven login tests', () => {
let apiData;
beforeAll(async () => {
const response = await axios.get('https://api.example.com/testUsers');
apiData = response.data;
});
apiData.forEach(user => {
it(`should login user ${user.username}`, async () => {
await browser.get('https://example.com/login');
await element(by.id('username')).sendKeys(user.username);
await element(by.id('password')).sendKeys(user.password);
await element(by.id('loginButton')).click();
const isLoggedIn = await element(by.id('logoutButton')).isPresent();
expect(isLoggedIn).toBe(user.expectedResult);
});
});
});
При большом количестве наборов данных необходимо:
fit или fdescribe только для
отладки отдельных случаев.data для
JSON/CSV/Excel, папка specs для тестов.Data-driven тестирование в Protractor обеспечивает масштабируемость и удобство поддержки тестов, позволяя проверять функциональность на множестве сценариев без дублирования кода. Правильная организация данных и логики тестов повышает надежность и ускоряет процесс автоматизации.