Given-When-Then стиль

Given-When-Then стиль в тестировании с Jasmine

Что такое стиль Given-When-Then?

Given-When-Then (GWT) — это подход, широко используемый в поведении ориентированном тестировании (Behavior Driven Development, BDD). Он помогает сделать тесты более читаемыми и понятными. Основное преимущество GWT заключается в чёткости и структурированности, что позволяет всем членам команды, включая разработчиков, тестировщиков и бизнес-аналистов, легко понять, что именно тестируется и какие результаты ожидаются.

В контексте тестирования с использованием Jasmine, стиль Given-When-Then помогает организовать тесты таким образом, чтобы каждый тест отражал сценарий, который можно понять как описание поведения системы.

Структура GWT

  1. Given (Дано): описание начального состояния системы. Это то, что должно быть подготовлено до того, как начнётся выполнение действия. Здесь обычно указывается, с каким состоянием системы или контекста начинается тест.
  2. When (Когда): описание события или действия, которое выполняется в ходе теста. Это основной шаг, при котором происходит изменение состояния системы.
  3. Then (Тогда): описание ожидаемого результата после выполнения действия. Это условие, которое должно быть выполнено, чтобы тест прошёл.

Пример синтаксиса GWT:

  • Given: начальные условия.
  • When: действие, которое инициирует изменение состояния.
  • Then: результат, который должен быть получен после выполнения действия.

Пример использования в Jasmine

Jasmine поддерживает поведенческое тестирование, и стиль Given-When-Then помогает сделать тесты более структурированными и понятными.

Пример 1: Проверка функции сложения

Предположим, у нас есть функция add(a, b), которая возвращает сумму двух чисел. Мы можем написать тест в стиле GWT следующим образом:

describe('Функция add', function() {
  it('должна правильно складывать два числа', function() {
    // Given
    var a = 5;
    var b = 3;

    // When
    var result = add(a, b);

    // Then
    expect(result).toBe(8);
  });
});

Здесь:

  • Given: мы начинаем с двух переменных a и b, которым присваиваем значения 5 и 3.
  • When: вызываем функцию add(a, b), которая выполняет действие сложения.
  • Then: проверяем, что результат сложения равен 8 с помощью expect(result).toBe(8).

Пример 2: Тестирование функции для отрицательных чисел

describe('Функция add', function() {
  it('должна правильно складывать отрицательные числа', function() {
    // Given
    var a = -5;
    var b = -3;

    // When
    var result = add(a, b);

    // Then
    expect(result).toBe(-8);
  });
});

В этом примере тестируется сложение отрицательных чисел. Структура теста остаётся той же: сначала задаём начальные условия, затем выполняем действие и, наконец, проверяем результат.

Преимущества стиля Given-When-Then

  1. Читаемость: тесты в стиле GWT напоминают естественный язык, что делает их более понятными для всех участников проекта.
  2. Поддержка бизнес-логики: GWT позволяет точно моделировать поведение системы, что важно для сотрудничества между техническими и нетехническими участниками.
  3. Организация тестов: этот стиль помогает структурировать тесты таким образом, чтобы каждый тест был самодостаточным и содержал четкое описание ситуации.

Реальные примеры с использованием GWT

Пример 3: Тестирование функции, которая проверяет, является ли число чётным

describe('Функция isEven', function() {
  it('должна возвращать true для чётных чисел', function() {
    // Given
    var number = 4;

    // When
    var result = isEven(number);

    // Then
    expect(result).toBe(true);
  });

  it('должна возвращать false для нечётных чисел', function() {
    // Given
    var number = 5;

    // When
    var result = isEven(number);

    // Then
    expect(result).toBe(false);
  });
});

Здесь используется тот же стиль GWT: мы даём начальные условия, выполняем действие и проверяем результат. В данном случае мы тестируем функцию на чётные и нечётные числа.

Пример 4: Тестирование метода, который обновляет пользовательские данные

describe('Метод updateUserData', function() {
  it('должен обновлять данные пользователя', function() {
    // Given
    var user = { id: 1, name: 'Alex', age: 25 };
    var newUserData = { name: 'Alexander', age: 26 };

    // When
    updateUserData(user, newUserData);

    // Then
    expect(user.name).toBe('Alexander');
    expect(user.age).toBe(26);
  });
});

Здесь в качестве примера тестируется обновление данных пользователя. Вначале задаются начальные условия с объектом user, затем мы вызываем метод updateUserData, который изменяет его свойства. Ожидается, что имя и возраст пользователя будут обновлены.

Рекомендации по использованию GWT в Jasmine

  • Используйте GWT стиль для ясного и последовательного написания тестов.
  • Разбивайте тесты на отдельные шаги: Given, When, Then. Это улучшает читаемость и упрощает поддержку тестов.
  • Пишите тесты в контексте бизнес-логики, а не только с технической точки зрения. Это делает тесты более полезными для всех участников разработки.
  • Применяйте GWT для сложных сценариев с несколькими действиями и проверками. Это позволяет структурировать тесты и следить за последовательностью операций.

Вывод

Стиль Given-When-Then помогает организовать тесты в Jasmine таким образом, чтобы они были легко воспринимаемы как для разработчиков, так и для других участников проекта. Являясь частью подхода BDD, он направлен на улучшение качества тестов, их структуры и читаемости, что способствует лучшему пониманию тестируемых функций и их поведений.