← Назад к вопросам

Какой фреймворк использовал для тестирования?

1.2 Junior🔥 202 комментариев
#Тестирование

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мой опыт в тестировании C# Backend приложений

Я активно использовал несколько фреймворков и подходов в зависимости от требований проекта и типа тестирования.

Основные фреймворки для модульного тестирования

1. XUnit - мой основной выбор для новых проектов:

public class CalculatorTests
{
    [Fact]
    public void Add_TwoNumbers_ReturnsSum()
    {
        // Arrange
        var calculator = new Calculator();
        
        // Act
        var result = calculator.Add(2, 3);
        
        // Assert
        Assert.Equal(5, result);
    }
    
    [Theory]
    [InlineData(1, 2, 3)]
    [InlineData(-1, 1, 0)]
    public void Add_VariousInputs_ReturnsCorrectSum(int a, int b, int expected)
    {
        var calculator = new Calculator();
        var result = calculator.Add(a, b);
        Assert.Equal(expected, result);
    }
}

2. NUnit - для legacy проектов и когда нужны более гибкие возможности:

[TestFixture]
public class UserServiceTests
{
    [SetUp]
    public void Setup()
    {
        // Инициализация перед каждым тестом
    }
    
    [Test]
    public void CreateUser_ValidData_ReturnsUserWithId()
    {
        // Тестовая логика
    }
}

3. MSTest - использую в основном в корпоративных средах, интегрированных с Visual Studio и Azure DevOps.

Для интеграционного тестирования

Moq и NSubstitute для изоляции зависимостей:

public class OrderServiceTests
{
    [Fact]
    public void ProcessOrder_ValidOrder_CallsRepository()
    {
        // Arrange
        var mockRepository = new Mock<IOrderRepository>();
        var service = new OrderService(mockRepository.Object);
        var order = new Order { Id = 1, Total = 100 };
        
        // Act
        service.ProcessOrder(order);
        
        // Assert
        mockRepository.Verify(r => r.Save(order), Times.Once);
    }
}

Тестирование API

1. FluentAssertions для читаемых утверждений:

response.StatusCode.Should().Be(HttpStatusCode.OK);
response.Content.Should().NotBeNull();
result.UserName.Should().Be("john.doe");

2. Microsoft.AspNetCore.Mvc.Testing для end-to-end тестирования:

public class IntegrationTests : IClassFixture<WebApplicationFactory<Startup>>
{
    private readonly HttpClient _client;
    
    public IntegrationTests(WebApplicationFactory<Startup> factory)
    {
        _client = factory.CreateClient();
    }
    
    [Fact]
    public async Task GetUsers_ReturnsSuccessStatusCode()
    {
        var response = await _client.GetAsync("/api/users");
        response.EnsureSuccessStatusCode();
    }
}

Специализированные инструменты

1. Bogus для генерации тестовых данных:

var testUsers = new Faker<User>()
    .RuleFor(u => u.Id, f => f.Random.Int(1, 1000))
    .RuleFor(u => u.Email, f => f.Internet.Email())
    .Generate(100);

2. TestContainers для тестирования с реальными базами данных:

public class DatabaseTests
{
    [Fact]
    public async Task TestWithRealPostgres()
    {
        await using var container = new TestcontainersBuilder<PostgreSqlTestcontainer>()
            .WithDatabase(new PostgreSqlTestcontainerConfiguration()
            {
                Database = "test",
                Username = "postgres",
                Password = "postgres"
            })
            .Build();
        
        await container.StartAsync();
        // Тестирование с реальной БД
    }
}

Практики и подходы

  1. TDD (Test-Driven Development) применяю для критически важного бизнес-логического кода
  2. Пирамида тестирования: 70% unit, 20% integration, 10% e2e
  3. Именование тестов по шаблону: MethodName_Scenario_ExpectedResult
  4. Изоляция тестов: каждый тест независим, не полагается на состояние других тестов
  5. Использование фикстур и фабрик для подготовки тестовых данных

CI/CD интеграция

В конвейерах сборки настраиваю:

  • Запуск всех тестов при каждом коммите
  • Отчеты о покрытии кода с помощью Coverlet и ReportGenerator
  • Ворота качества: сборка падает при падении тестов или низком покрытии
  • Параллельный запуск тестов для ускорения выполнения

Выбор конкретного фреймворка зависит от контекста проекта, но XUnit + Moq + FluentAssertions составляют мою основную тройку для большинства современных C# проектов. Важно не столько то, какие инструменты используются, сколько соблюдение принципов написания поддерживаемых, быстрых и надежных тестов.