Sobes.tech
Назад к вопросам
Junior — Middle
59

Можешь ли ты перечислить основные типы юнит-тестов, используемых для проверки кода?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что юнит-тесты проверяют маленькие части кода изолированно от внешних зависимостей. Обычно ожидают упоминание базовых видов проверок: позитивные и негативные сценарии, граничные значения, проверки исключений и параметризованные тесты. Хорошо, если дополнительно будет понимание разницы между unit, integration и e2e, чтобы не смешивать уровни тестирования.

Определение:

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

Основные типы проверок, которые обычно относят к юнит-тестам:

  • позитивные сценарии;
  • негативные сценарии;
  • граничные значения;
  • проверки исключений;
  • параметризованные тесты;
  • тесты на состояние и на взаимодействие с зависимостями.

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

Например, для метода расчета скидки можно проверить, что:

  • при обычной сумме возвращается корректная скидка;
  • при нулевой или отрицательной сумме метод ведет себя ожидаемо;
  • при минимальном пороге скидка начинается именно с нужного значения;
  • при неверном входе выбрасывается исключение.
using Xunit;

public class DiscountServiceTests
{
    [Theory]
    [InlineData(1000, 0.05)]
    [InlineData(5000, 0.10)]
    public void CalculateDiscount_ReturnsExpectedRate(decimal amount, decimal expectedRate)
    {
        var service = new DiscountService();

        var rate = service.CalculateDiscount(amount);

        Assert.Equal(expectedRate, rate);
    }

    [Fact]
    public void CalculateDiscount_ThrowsForNegativeAmount()
    {
        var service = new DiscountService();

        Assert.Throws<ArgumentOutOfRangeException>(() => service.CalculateDiscount(-1));
    }
}

Пояснение кода:

В примере показаны два типовых вида юнит-тестов.
[Theory] с InlineData — это параметризованный тест: один и тот же сценарий проверяется на нескольких наборах входных данных. Это удобно для таблицы значений и граничных случаев.
[Fact] — обычный тест для одного конкретного поведения, здесь проверяется, что на некорректный ввод метод выбрасывает исключение.

Если разложить по шагам:

  1. Создается объект DiscountService.
  2. Вызывается метод CalculateDiscount.
  3. Сравнивается результат с ожидаемым значением через Assert.Equal.
  4. Для негативного сценария проверяется, что вызывается ArgumentOutOfRangeException.

Ключевые моменты:

  • Юнит-тесты проверяют маленький фрагмент логики в изоляции.
  • Основные проверки: позитивные, негативные, граничные и исключительные сценарии.
  • Параметризованные тесты помогают покрывать много входов без копипаста.
  • Для изоляции зависимостей часто используют mock/stub/fake.
  • Юнит-тесты должны быть быстрыми, стабильными и не зависеть от внешней среды.
  • Не стоит путать юнит-тесты с интеграционными и end-to-end тестами.