Фаззинг в контексте тестирования веб-приложений с использованием Protractor — это методика автоматизированного введения некорректных, неожиданных или случайных данных в поля ввода и формы для выявления скрытых ошибок, сбоев или уязвимостей. Основная цель фаззинга — проверить, как приложение ведёт себя при экстремальных или нестандартных сценариях взаимодействия с пользователем.
Protractor как фреймворк для e2e-тестирования Angular-приложений предоставляет инструменты для автоматизации действий пользователя: ввод текста, нажатия кнопок, выбор элементов и проверка состояний страницы. Фаззинг опирается на эти возможности, но добавляет динамическую генерацию и подстановку данных.
Ключевые моменты фаззинга:
В Protractor фаззинг начинается с создания набора тестовых данных. Обычно используют следующие подходы:
function randomString(length) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+[]{}';
let result = '';
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}
function randomNumber(max) {
return Math.floor(Math.random() * max);
}
Генерация строк, нарушающих ожидаемый формат, например, для email-полей:
const invalidEmails = [
'plainaddress',
'@missingusername.com',
'username@.com',
'username@site..com'
];
Для проверки границ полей и устойчивости приложения создаются очень длинные строки, иногда превышающие тысячи символов.
Заполнение форм с фаззингом
it('Фаззинг поля username', async () => {
await browser.get('https://example.com/login');
const usernameField = element(by.name('username'));
const passwordField = element(by.name('password'));
await usernameField.sendKeys(randomString(256)); // длинная строка
await passwordField.sendKeys(randomString(50));
const submitButton = element(by.css('button[type="submit"]'));
await submitButton.click();
const errorMessage = element(by.css('.error-message'));
expect(await errorMessage.isDisplayed()).toBe(true);
});
Навигация с некорректными параметрами URL
Фаззинг может включать проверку страниц с неожиданными query-параметрами:
await browser.get('https://example.com/profile?user=' + randomString(20));
Цель — обнаружить возможные исключения или некорректное поведение.
Фаззинг требует тщательного отслеживания того, как приложение реагирует на некорректные данные. В Protractor для этого используются:
console.log для вывода данных и состояний
элементов;ExpectedConditions) для проверки появления
сообщений об ошибках;browser.takeScreenshot().then(function(png) {
const fs = require('fs');
const stream = fs.createWriteStream('screenshot.png');
stream.write(Buffer.from(png, 'base64'));
stream.end();
});
Фаззинг легко комбинируется с традиционными e2e-тестами Protractor. Например, после успешной проверки стандартного сценария можно добавить фаззинговый блок для проверки устойчивости приложения:
describe('Login form', () => {
it('Проверка стандартного сценария', async () => {
// обычный тест
});
it('Фаззинг полей ввода', async () => {
// фаззинг
});
});
Такой подход обеспечивает двойной эффект: проверку корректного поведения и стресс-тестирование с некорректными данными.
Protractor учитывает специфику Angular, что позволяет:
browser.waitForAngular();ng-model,
ng-repeat, ng-if, обеспечивая корректное
взаимодействие с Angular-компонентами.Фаззинг с использованием Protractor становится мощным инструментом для выявления скрытых дефектов, тестирования устойчивости интерфейса и проверки безопасности приложения. Систематическое внедрение фаззинга позволяет обнаружить ошибки, которые не видны при обычном ручном или стандартном автоматизированном тестировании.