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

Можешь рассказать основные принципы и стандарты для написания тестов?

Компании, где спрашивали
Элисофт

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

sobes.tech AI

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

Тесты должны быть понятными, стабильными и быстро выполняться. Важно уметь отделять unit-тесты от интеграционных и понимать, что тест должен проверять одно поведение. Ещё ожидают знание принципов AAA, изоляции зависимостей и поддерживаемости тестового кода.

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

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

Для C# обычно опираются на такие практики:

  • тестировать одно поведение за один тест;
  • минимизировать зависимость от базы данных, сети и времени;
  • использовать Arrange-Act-Assert;
  • давать тестам понятные имена;
  • проверять поведение, а не внутреннюю реализацию.

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

Например, есть сервис расчёта скидки. Юнит-тест проверяет, что при сумме заказа больше 1000 рублей скидка применяется, а при меньшей сумме — нет.

using Xunit;

public class DiscountServiceTests
{
    [Fact]
    public void CalculateDiscount_WhenAmountIsGreaterThan1000_Returns10Percent()
    {
        // Arrange
        var service = new DiscountService();

        // Act
        var discount = service.CalculateDiscount(1500);

        // Assert
        Assert.Equal(150, discount);
    }
}

public class DiscountService
{
    public decimal CalculateDiscount(decimal amount)
    {
        return amount > 1000 ? amount * 0.1m : 0m;
    }
}

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

Код показывает стандартный паттерн AAA.

  • Arrange — создаётся объект DiscountService.
  • Act — вызывается метод CalculateDiscount(1500).
  • Assert — проверяется, что результат равен 150.

Имя теста описывает сценарий и ожидаемый результат: CalculateDiscount_WhenAmountIsGreaterThan1000_Returns10Percent. Такой подход делает тест читаемым без просмотра тела метода.

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

  • Тест должен проверять один сценарий и одно ожидаемое поведение.
  • Хороший тест не зависит от порядка запуска и внешних ресурсов.
  • Структура AAA помогает делать тесты понятными и поддерживаемыми.
  • Названия тестов должны отражать входные условия и ожидаемый результат.
  • Для unit-тестов важно изолировать зависимости через mock/stub/fake.
  • Не стоит тестировать детали реализации, лучше проверять результат и поведение.