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

«Какие библиотеки для тестирования вы использовали?» — вопрос из категории Тестирование, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В стеке .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 покрывает большинство потребностей.