Protractor — это инструмент для end-to-end тестирования Angular и не только. Одним из ключевых аспектов гибкой и поддерживаемой автоматизации является использование переменных окружения и параметризация тестов. Эти механизмы позволяют запускать одни и те же тесты в разных средах, с различными конфигурациями и данными, без необходимости менять код тестов.
Переменные окружения — это значения, которые задаются на уровне операционной системы или процесса Node.js и доступны во время выполнения теста. Они позволяют конфигурировать тесты динамически.
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['spec.js'],
baseUrl: process.env.TEST_BASE_URL || 'http://localhost:4200'
};
В этом примере process.env.TEST_BASE_URL позволяет
указать адрес тестируемого приложения извне. Если переменная окружения
не установлена, используется значение по умолчанию.
TEST_BASE_URL=http://staging.example.com protractor conf.js
В тестах доступ к этим переменным можно получить через объект
browser.params:
browser.get(browser.params.baseUrl || 'http://localhost:4200');
Protractor имеет встроенный механизм параметров в конфигурационном
файле conf.js:
exports.config = {
params: {
login: {
username: 'user1',
password: 'secret'
},
env: 'staging'
},
specs: ['spec.js']
};
В тестах параметры доступны через browser.params:
it('должен авторизоваться', async () => {
await element(by.id('username')).sendKeys(browser.params.login.username);
await element(by.id('password')).sendKeys(browser.params.login.password);
await element(by.id('loginBtn')).click();
});
Преимущества использования browser.params:
protractor conf.js --params.login.username=admin --params.env=production
Для тестирования на разных окружениях удобно создавать отдельные конфигурационные файлы или использовать условную логику:
let env = process.env.TEST_ENV || 'dev';
let config = {
dev: {
baseUrl: 'http://localhost:4200',
login: { username: 'dev', password: 'dev123' }
},
staging: {
baseUrl: 'http://staging.example.com',
login: { username: 'staging', password: 'stage123' }
},
prod: {
baseUrl: 'https://example.com',
login: { username: 'admin', password: 'admin123' }
}
};
exports.config = {
baseUrl: config[env].baseUrl,
params: {
login: config[env].login
},
specs: ['spec.js']
};
Запуск тестов в нужной среде:
TEST_ENV=staging protractor conf.js
Такой подход полностью отделяет тестовые данные и конфигурации от логики тестов, повышает гибкость и облегчает поддержку.
Параметризация позволяет запускать один тест с разными данными.
Protractor не имеет встроенного механизма data-driven тестирования, но
его легко реализовать с использованием массивов и
forEach:
const users = [
{ username: 'user1', password: 'pass1' },
{ username: 'user2', password: 'pass2' },
{ username: 'user3', password: 'pass3' }
];
users.forEach(user => {
it(`должен авторизоваться пользователем ${user.username}`, async () => {
await browser.get(browser.params.baseUrl);
await element(by.id('username')).sendKeys(user.username);
await element(by.id('password')).sendKeys(user.password);
await element(by.id('loginBtn')).click();
expect(await element(by.id('welcome')).getText()).toContain(user.username);
});
});
Параметризация в сочетании с переменными окружения позволяет легко тестировать разные сценарии на разных средах.
Для больших проектов удобно хранить тестовые данные в JSON или JS-файлах и загружать их динамически:
const testData = require(`./data/${process.env.TEST_ENV || 'dev'}.json`);
it('тест с внешними данными', async () => {
await browser.get(testData.baseUrl);
await element(by.id('username')).sendKeys(testData.login.username);
await element(by.id('password')).sendKeys(testData.login.password);
await element(by.id('loginBtn')).click();
expect(await element(by.id('welcome')).getText()).toContain(testData.login.username);
});
Такой подход обеспечивает максимальную масштабируемость и отделение данных от логики тестов.
В реальных проектах часто используют комбинацию:
TEST_ENV).browser.params для передачи конфигураций и учетных
данных.Это позволяет поддерживать гибкую, расширяемую и легко модифицируемую систему тестирования.
Использование переменных окружения и параметризации является фундаментом для написания профессиональных Protractor-тестов. Такой подход снижает количество дублирующего кода, упрощает поддержку тестов и делает процесс тестирования максимально адаптируемым к различным средам и сценариям.