Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Я писал автотесты на нескольких ключевых фреймворках, которые составляют современный стек автоматизации тестирования для 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 для визуализации результатов тестов
Критерии выбора фреймворков
При выборе фреймворков я руководствуюсь:
- Типом тестирования (unit, integration, E2E)
- Интеграцией с CI/CD (например, xUnit хорошо интегрируется с Azure DevOps)
- Производительностью выполнения тестов
- Поддержкой сообщества и частотой обновлений
- Читаемостью тестового кода и простотой поддержки
Этот стек позволяет покрывать все уровни тестирования — от изолированных unit-тестов до сложных сквозных сценариев, обеспечивая высокое качество кода и надёжность бэкенд-приложений.