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

На каких фреймворках писал автотесты?

2.2 Middle🔥 151 комментариев
#Тестирование

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

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

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

Я писал автотесты на нескольких ключевых фреймворках, которые составляют современный стек автоматизации тестирования для C#/.NET бэкенд-приложений. Мой опыт охватывает как модульное (unit), так и интеграционное (integration), и end-to-end (E2E) тестирование.

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

Для модульного тестирования я активно использую xUnit, NUnit и MSTest. Выбор часто зависит от требований проекта и соглашений команды.

xUnit

Это мой предпочтительный фреймворк для новых проектов благодаря его чистой архитектуре и современным подходам.

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

NUnit

Использую в legacy-проектах и когда нужны расширенные функции вроде параметризации через TestCaseSource.

[TestFixture]
public class UserServiceTests
{
    [Test]
    public void GetUser_WithValidId_ReturnsUser()
    {
        // Тестовая логика
    }
}

Mocking-фреймворки

Для изоляции зависимостей применяю Moq и NSubstitute. Moq — наиболее распространённый выбор в .NET-экосистеме.

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 и другими системами:

ASP.NET Core Integration Testing

Использую WebApplicationFactory для тестирования API контроллеров.

public class ApiIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> _factory;
    
    [Fact]
    public async Task GetUsers_ReturnsSuccess()
    {
        var client = _factory.CreateClient();
        var response = await client.GetAsync("/api/users");
        response.EnsureSuccessStatusCode();
    }
}

Entity Framework Core Testing

Для тестирования работы с базой данных использую InMemory базу или SQLite в режиме памяти.

public class UserRepositoryTests
{
    [Fact]
    public async Task AddUser_SavesToDatabase()
    {
        var options = new DbContextOptionsBuilder<AppDbContext>()
            .UseInMemoryDatabase("TestDb")
            .Options;
            
        using (var context = new AppDbContext(options))
        {
            var repository = new UserRepository(context);
            await repository.AddAsync(new User { Name = "Test" });
            
            Assert.Single(context.Users);
        }
    }
}

Фреймворки для E2E тестирования

Для сквозного тестирования веб-приложений:

Selenium WebDriver

Для автоматизации браузера в тестировании веб-интерфейсов.

public class LoginPageTests : IDisposable
{
    private IWebDriver _driver;
    
    public LoginPageTests()
    {
        _driver = new ChromeDriver();
    }
    
    [Fact]
    public void Login_ValidCredentials_Success()
    {
        _driver.Navigate().GoToUrl("https://example.com/login");
        _driver.FindElement(By.Id("username")).SendKeys("testuser");
        _driver.FindElement(By.Id("password")).SendKeys("password123");
        _driver.FindElement(By.Id("login-btn")).Click();
        
        Assert.Contains("Dashboard", _driver.PageSource);
    }
}

Playwright

Современная альтернатива Selenium с лучшей производительностью и встроенной поддержкой автоматического ожидания элементов.

[Test]
public async Task Login_ValidCredentials_Success()
{
    using var playwright = await Playwright.CreateAsync();
    await using var browser = await playwright.Chromium.LaunchAsync();
    var page = await browser.NewPageAsync();
    
    await page.GotoAsync("https://example.com/login");
    await page.FillAsync("#username", "testuser");
    await page.FillAsync("#password", "password123");
    await page.ClickAsync("#login-btn");
    
    await Expect(page.Locator("text=Dashboard")).ToBeVisibleAsync();
}

Специализированные фреймворки

SpecFlow для BDD

Использую для Behavior-Driven Development, когда требуется тесное сотрудничество с бизнес-аналитиками.

Feature: User Registration
  Scenario: Successful registration
    Given I am on the registration page
    When I fill valid registration data
    Then I should see success message

Postman/Newman для API тестирования

Для тестирования REST API, особенно в контексте Continuous Integration.

Инфраструктура и инструменты

Помимо фреймворков, в моей практике используются:

  • FluentAssertions для читаемых assertions
  • AutoFixture для автоматического создания тестовых данных
  • WireMock.NET для мокирования внешних HTTP-сервисов
  • Docker для изолированного тестирования с реальными зависимостями
  • ReportPortal или Allure для визуализации результатов тестов

Критерии выбора фреймворков

При выборе фреймворков я руководствуюсь:

  1. Типом тестирования (unit, integration, E2E)
  2. Интеграцией с CI/CD (например, xUnit хорошо интегрируется с Azure DevOps)
  3. Производительностью выполнения тестов
  4. Поддержкой сообщества и частотой обновлений
  5. Читаемостью тестового кода и простотой поддержки

Этот стек позволяет покрывать все уровни тестирования — от изолированных unit-тестов до сложных сквозных сценариев, обеспечивая высокое качество кода и надёжность бэкенд-приложений.