Ответ
Работал с широким спектром фреймворков для разных уровней тестирования:
Модульное и интеграционное тестирование (Unit/Integration):
- xUnit / NUnit / MSTest: Классические фреймворки для модульных тестов в .NET. Предпочитаю xUnit за чистоту API и отсутствие атрибутов
[SetUp]/[TearDown].[Fact] public void Calculate_Sum_ReturnsCorrectResult() { // Arrange var calculator = new Calculator(); // Act var result = calculator.Add(5, 3); // Assert Assert.Equal(8, result); } - Moq / NSubstitute: Библиотеки для изоляции зависимостей через мокирование (mocking).
var mockService = new Mock<IDataService>(); mockService.Setup(s => s.GetUserName(It.IsAny<int>())).Returns("TestUser");
Тестирование API (API Testing):
- HttpClient (встроенный) + xUnit: Для прямых HTTP-запросов.
- RestSharp: Удобная библиотека-обёртка для работы с REST API.
var client = new RestClient("https://api.example.com"); var request = new RestRequest("users/{id}", Method.Get); request.AddUrlSegment("id", 1); var response = await client.ExecuteAsync<User>(request); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
UI-тестирование веб-приложений (UI Testing):
- Selenium WebDriver: Стандарт для автоматизации браузеров. Использовал с паттерном Page Object Model (POM).
[Test] public void Login_WithValidCredentials_Success() { var driver = new ChromeDriver(); var loginPage = new LoginPage(driver); loginPage.Navigate().Login("user", "pass"); Assert.IsTrue(new HomePage(driver).IsUserLoggedIn()); } - Playwright (более современная альтернатива): Предлагает лучшую производительность и встроенные ожидания (auto-wait).
BDD / Acceptance тестирование (BDD Testing):
- SpecFlow: Позволяет писать тесты на языке Gherkin (Given-When-Then) и интегрировать их в .NET.
Feature: Calculator Scenario: Add two numbers Given I have entered 50 into the calculator And I have entered 70 into the calculator When I press add Then the result should be 120
Другие инструменты:
- FluentAssertions: Для более читаемых утверждений (assertions).
- Bogus / AutoFixture: Для генерации тестовых данных.
- WireMock.NET: Для мокирования внешних HTTP-сервисов в интеграционных тестах.
Ответ 18+ 🔞
Да ты посмотри, какой у меня арсенал был, блядь! Как будто я не тестировщик, а какой-то оружейный барон подпольный. На разных уровнях воевал, со всякой хуйнёй.
Модульники да интеграционы (Unit/Integration):
Тут, понятное дело, классика жанра. xUnit / NUnit / MSTest – это как три пидораса, из которых один всегда норм. Я за xUnit, потому что там API чистый, без этих ваших [SetUp]/[TearDown], которые только мозг выебать могут. Просто пишешь тест и всё.
[Fact]
public void Calculate_Sum_ReturnsCorrectResult()
{
// Arrange
var calculator = new Calculator();
// Act
var result = calculator.Add(5, 3);
// Assert
Assert.Equal(8, result);
}
А чтобы зависимости не мешались, брал Moq или NSubstitute. Подменяешь сервис на заглушку, и он тебе возвращает что скажешь, как послушная сука.
var mockService = new Mock<IDataService>();
mockService.Setup(s => s.GetUserName(It.IsAny<int>())).Returns("TestUser");
Тестирование API: Тут два пути: либо на чистом HttpClient с родным xUnit, либо обёрточка RestSharp, чтобы меньше писанины было. Второй, конечно, удобнее, не надо каждый раз велосипед из костылей собирать.
var client = new RestClient("https://api.example.com");
var request = new RestRequest("users/{id}", Method.Get);
request.AddUrlSegment("id", 1);
var response = await client.ExecuteAsync<User>(request);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
UI-тесты для веба: О, это отдельная песня, блядь. Selenium WebDriver – это как старый, пиздатый, но вечно глючный Запорожец. Работает, но иногда так взбесит, что хочется монитор об стенку. Паттерн Page Object Model (POM) – святое, без него вообще пиздец, а не поддержка.
[Test]
public void Login_WithValidCredentials_Success()
{
var driver = new ChromeDriver();
var loginPage = new LoginPage(driver);
loginPage.Navigate().Login("user", "pass");
Assert.IsTrue(new HomePage(driver).IsUserLoggedIn());
}
Потом появился Playwright – вот это уже машина, блядь. Быстрее, умнее, с автоожиданиями, не надо вручную Thread.Sleep впихивать, как идиоту.
BDD / Acceptance тесты: Когда нужно, чтобы даже менеджер-олень что-то понял. SpecFlow – пишешь сценарии на этом ихнем Gherkin (Given-When-Then), а потом бэкенд на C# прикручиваешь. Выглядит как сказка для бизнеса.
Feature: Calculator
Scenario: Add two numbers
Given I have entered 50 into the calculator
And I have entered 70 into the calculator
When I press add
Then the result should be 120
Разная другая хуйня в помощь:
- FluentAssertions: Чтобы ассерты читались как предложения, а не как шифровка из психушек.
result.Should().Be(8);– красота. - Bogus / AutoFixture: Генераторы тестовых данных. Чтобы не придумывать сто раз "Вася Пупкин", а он сам сгенерил тебе и имя, и почту, и хуй знает что ещё.
- WireMock.NET: Для мокирования внешних сервисов в интеграционных тестах. Поднимаешь себе локально заглушку HTTP-сервиса и говоришь ей, что и как отвечать. Удобно, когда реальный сервис лежит или с ним просто не хочется связываться.
Вот такой вот зоопарк, блядь. Каждый инструмент для своего дела, но если брать не туда – сам себе злобный Буратино.