Можешь ли ты перечислить основные типы юнит-тестов, используемых для проверки кода?
Ответ от нейросети
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] — обычный тест для одного конкретного поведения, здесь проверяется, что на некорректный ввод метод выбрасывает исключение.
Если разложить по шагам:
- Создается объект
DiscountService. - Вызывается метод
CalculateDiscount. - Сравнивается результат с ожидаемым значением через
Assert.Equal. - Для негативного сценария проверяется, что вызывается
ArgumentOutOfRangeException.
Ключевые моменты:
- Юнит-тесты проверяют маленький фрагмент логики в изоляции.
- Основные проверки: позитивные, негативные, граничные и исключительные сценарии.
- Параметризованные тесты помогают покрывать много входов без копипаста.
- Для изоляции зависимостей часто используют mock/stub/fake.
- Юнит-тесты должны быть быстрыми, стабильными и не зависеть от внешней среды.
- Не стоит путать юнит-тесты с интеграционными и end-to-end тестами.