Можешь рассказать основные принципы и стандарты для написания тестов?
Ответ от нейросети
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.
- Не стоит тестировать детали реализации, лучше проверять результат и поведение.