Фаззинг

Фаззинг в контексте тестирования веб-приложений с использованием Protractor — это методика автоматизированного введения некорректных, неожиданных или случайных данных в поля ввода и формы для выявления скрытых ошибок, сбоев или уязвимостей. Основная цель фаззинга — проверить, как приложение ведёт себя при экстремальных или нестандартных сценариях взаимодействия с пользователем.


Основы фаззинга в Protractor

Protractor как фреймворк для e2e-тестирования Angular-приложений предоставляет инструменты для автоматизации действий пользователя: ввод текста, нажатия кнопок, выбор элементов и проверка состояний страницы. Фаззинг опирается на эти возможности, но добавляет динамическую генерацию и подстановку данных.

Ключевые моменты фаззинга:

  • Генерация данных: использование случайных, длинных или нестандартных строк, чисел и символов.
  • Автоматизация пользовательских сценариев: заполнение форм, клики по кнопкам, навигация между страницами с непредсказуемыми параметрами.
  • Отслеживание откликов приложения: проверка ошибок, падений, некорректного отображения или поведения.

Генерация данных для фаззинга

В Protractor фаззинг начинается с создания набора тестовых данных. Обычно используют следующие подходы:

  1. Случайные строки и числа
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);
}
  1. Некорректные форматы

Генерация строк, нарушающих ожидаемый формат, например, для email-полей:

const invalidEmails = [
    'plainaddress',
    '@missingusername.com',
    'username@.com',
    'username@site..com'
];
  1. Большие объёмы данных

Для проверки границ полей и устойчивости приложения создаются очень длинные строки, иногда превышающие тысячи символов.


Применение фаззинга в сценариях Protractor

Заполнение форм с фаззингом

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();
});

Стратегии эффективного фаззинга

  1. Целевые поля: начать с наиболее критичных компонентов, таких как формы регистрации, авторизации, поля поиска.
  2. Комбинированные данные: смешивание чисел, символов и строк разных кодировок.
  3. Автоматическое повторение: запуск циклов фаззинга с множеством итераций для выявления редких ошибок.
  4. Асинхронные сценарии: фаззинг не только ввода, но и событий клика, переключения вкладок, AJAX-запросов.

Интеграция с существующими тестами

Фаззинг легко комбинируется с традиционными e2e-тестами Protractor. Например, после успешной проверки стандартного сценария можно добавить фаззинговый блок для проверки устойчивости приложения:

describe('Login form', () => {
    it('Проверка стандартного сценария', async () => {
        // обычный тест
    });

    it('Фаззинг полей ввода', async () => {
        // фаззинг
    });
});

Такой подход обеспечивает двойной эффект: проверку корректного поведения и стресс-тестирование с некорректными данными.


Особенности фаззинга для Angular-приложений

Protractor учитывает специфику Angular, что позволяет:

  • ожидать завершения асинхронных операций с помощью browser.waitForAngular();
  • работать с элементами, которые динамически создаются в DOM;
  • интегрировать фаззинг с ng-model, ng-repeat, ng-if, обеспечивая корректное взаимодействие с Angular-компонентами.

Фаззинг с использованием Protractor становится мощным инструментом для выявления скрытых дефектов, тестирования устойчивости интерфейса и проверки безопасности приложения. Систематическое внедрение фаззинга позволяет обнаружить ошибки, которые не видны при обычном ручном или стандартном автоматизированном тестировании.