Ответ
В стеке .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 покрывает большинство потребностей.
Ответ 18+ 🔞
А, ну вот, классика жанра, блядь! Смотри, я тебе сейчас так разложу по полочкам этот наш тестовый зоопарк в .NET, что ты офигеешь, как всё просто и одновременно пиздецки мощно.
1. Фреймворки для юнитов, эти самые, модульные тесты:
-
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: А это для тех, кому Moq кажется слишком многословным. Синтаксис у него лаконичный, почти как речь нормального человека. Вместо цепочки
.Setup(...).Returns(...)просто пишешь.Returns(...)и всё, пиздец.
3. Интеграционное и end-to-end тестирование, где всё летает и стреляет:
- Microsoft.AspNetCore.Mvc.Testing + WebApplicationFactory: Это, блядь, стандарт де-факто для ASP.NET Core. Поднимаешь in-memory копию своего приложения, и туда можно слать настоящие HTTP-запросы, как будто оно живое. Удобно до безумия.
- Playwright/Selenium: Ну это когда надо браузером поуправлять, для UI-тестов. Сейчас все на Playwright переходят, потому что он быстрее и умнее с ожиданиями. Селениум — это уже классика, но иногда тормозит, как чёрт знает что.
4. Разная полезная хуйня, без которой можно, но с которой лучше:
- FluentAssertions: Это чтобы твои проверки (assertions) читались не как китайская грамота, а как красивая проза. Вместо
Assert.Equal(5, result)пишешьresult.Should().Be(5).And.BeGreaterThan(0). Сразу видно, что ты не просто так код пишешь, а с претензией, блядь. - Bogus/AutoFixture: Генераторы тестовых данных. Чтобы не выдумывать каждый раз имена, почты и прочую хуйню.
- Coverlet: Ну это чтобы померить, сколько кода твои тесты реально покрывают. Иногда цифры бывают очень грустные, я тебе скажу.
В общем, выбор, конечно, от проекта зависит, но если брать самую жирную и распространённую связку, то это будет xUnit + Moq/NSubstitute + WebApplicationFactory. Этим можно закрыть процентов 90 всех потребностей, если, конечно, ты не пишешь какую-нибудь космическую хуйню.