Характеристика | Unit-тесты | Интеграционные тесты |
---|---|---|
Объект тестирования | Отдельный класс/метод | Группа взаимодействующих компонентов |
Изоляция | Полная (моки/стабы) | Частичная или отсутствует |
Скорость выполнения | Очень быстрые (мс) | Медленные (секунды-минуты) |
Зависимости | Замоканы все | Используются реальные |
Цель тестирования | Проверка логики | Проверка взаимодействия |
Частота запуска | При каждом коммите | Перед релизом/ночью |
Покрытие | 70-80% кода | Критические пути |
Характеристики:
Пример теста для сервиса калькулятора:
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void Add_TwoNumbers_ReturnsSum()
{
// Arrange
var calculator = new Calculator();
// Act
var result = calculator.Add(3, 5);
// Assert
Assert.AreEqual(8, result);
}
}
Когда использовать:
Характеристики:
Пример теста API с базой данных:
[TestClass]
public class OrdersIntegrationTests
{
private TestServer _server;
private HttpClient _client;
[TestInitialize]
public void Setup()
{
_server = new TestServer(WebHost.CreateDefaultBuilder()
.UseStartup<TestStartup>());
_client = _server.CreateClient();
}
[TestMethod]
public async Task CreateOrder_ValidRequest_ReturnsCreatedOrder()
{
// Arrange
var request = new { ProductId = 1, Quantity = 2 };
// Act
var response = await _client.PostAsJsonAsync("/api/orders", request);
// Assert
response.EnsureSuccessStatusCode();
var order = await response.Content.ReadAsAsync<Order>();
Assert.IsTrue(order.Id > 0);
}
[TestCleanup]
public void Cleanup()
{
_client.Dispose();
_server.Dispose();
}
}
Когда использовать:
var mockRepository = new Mock<IUserRepository>();
mockRepository.Setup(x => x.GetById(1)).Returns(new User { Id = 1 });
var container = new TestcontainersBuilder<PostgreSqlTestcontainer>()
.WithDatabase(new PostgreSqlTestcontainerConfiguration())
.Build();
await container.StartAsync();
Пирамида тестирования:
Паттерны:
Инструменты:
Unit-тесты:
Интеграционные тесты:
Правильный баланс между этими типами тестов - залог: