Какие библиотеки для тестирования вы использовали?

Ответ

В стеке .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 всех потребностей, если, конечно, ты не пишешь какую-нибудь космическую хуйню.