Ответ
В стеке .NET/C# я работал со следующим набором инструментов для разных уровней тестирования:
1. Фреймворки для модульного (Unit) тестирования:
-
xUnit.net: Мой текущий фаворит для новых проектов. Нет атрибутов
[SetUp]/[TearDown]— вместо этого используются конструктор тестового класса иIDisposable, что делает зависимости более явными.public class CalculatorTests : IDisposable { private readonly Calculator _sut; // System Under Test public CalculatorTests() => _sut = new Calculator(); public void Dispose() { /* cleanup */ } [Fact] public void Add_TwoNumbers_ReturnsSum() { // Act var result = _sut.Add(2, 3); // Assert Assert.Equal(5, result); } } - NUnit: Классический и мощный фреймворк с богатым набором атрибутов (
[TestCase],[Range]).
2. Библиотеки для изоляции (Mocking):
- Moq: Наиболее популярная. Позволяет легко настраивать моки и проверять вызовы.
var mockRepo = new Mock<IRepository>(); mockRepo.Setup(r => r.GetById(It.IsAny<int>())).Returns(new Product()); var service = new ProductService(mockRepo.Object); - NSubstitute: Имеет более лаконичный и читаемый синтаксис (
.Returns()вместо.Setup(...).Returns()).
3. Интеграционное и end-to-end тестирование:
- Microsoft.AspNetCore.Mvc.Testing + WebApplicationFactory: Стандартный способ тестирования ASP.NET Core приложений. Позволяет поднимать in-memory версию приложения для выполнения HTTP-запросов.
- Playwright/Selenium: Для автоматизации браузера в UI/E2E-тестах. Playwright сейчас предпочтительнее из-за скорости и встроенных wait-механизмов.
4. Дополнительные утилиты:
- FluentAssertions: Делает assertions гораздо более выразительными (
result.Should().Be(5).And.BeGreaterThan(0)). - Bogus/AutoFixture: Для генерации тестовых данных.
- Coverlet для сбора покрытия кода.
Выбор конкретного стека зависит от проекта, но типичная связка: xUnit + Moq/NSubstitute + WebApplicationFactory покрывает большинство потребностей.