← Назад к вопросам
Какие типы тестирования являются критически важными перед выходом в прод?
2.2 Middle🔥 201 комментариев
#SOLID и паттерны проектирования#Тестирование
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ
Типы тестирования перед production
Не все тесты одинаково важны. Есть критические типы, которые должны быть ОБЯЗАТЕЛЬНО перед продакшеном.
1. Unit тесты (фундамент)
// Тестируют отдельные методы и логику
@Test
public void testCalculateDiscount() {
// Arrange
PricingService service = new PricingService();
Order order = new Order(100.0);
// Act
double discountedPrice = service.calculateDiscount(order);
// Assert
assertEquals(90.0, discountedPrice, 0.01);
}
// Критическое правило: покрытие должно быть 80%+
// Особенно для бизнес-логики и расчётов денег
2. Integration тесты (взаимодействие компонентов)
// Тестируют как компоненты работают вместе
@SpringBootTest
@ActiveProfiles("test")
public class OrderServiceIntegrationTest {
@Autowired
private OrderService orderService;
@Autowired
private OrderRepository orderRepository;
@Test
@Transactional
public void testCreateOrderAndSave() {
Order order = new Order("Product", 99.99);
Order saved = orderService.createAndSave(order);
Order retrieved = orderRepository.findById(saved.getId()).orElse(null);
assertNotNull(retrieved);
}
}
// Тестируют: БД интеграцию, REST endpoint'ы, очереди, кэширование
3. E2E тесты (end-to-end)
// Полный сценарий от пользователя
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class OrderFlowE2ETest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testCompleteOrderFlow() {
// 1. Пользователь регистрируется
ResponseEntity<User> userResponse = restTemplate.postForEntity(
"http://localhost:" + port + "/api/users",
new User("john@example.com"),
User.class
);
User user = userResponse.getBody();
// 2. Создаёт заказ
ResponseEntity<Order> orderResponse = restTemplate.postForEntity(
"http://localhost:" + port + "/api/orders",
new Order(user.getId(), "Product", 99.99),
Order.class
);
assertEquals(HttpStatus.CREATED, orderResponse.getStatusCode());
// 3. Оплачивает заказ
ResponseEntity<PaymentResult> paymentResponse = restTemplate.postForEntity(
"http://localhost:" + port + "/api/payments",
new Payment(orderResponse.getBody().getId(), 99.99),
PaymentResult.class
);
assertEquals(HttpStatus.OK, paymentResponse.getStatusCode());
}
}
4. Performance тесты (нагрузочное тестирование)
// JMH (Java Microbenchmark Harness)
@Fork(1)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class OrderServicePerformanceTest {
@Benchmark
public void testOrderCreation() {
Order order = new Order("Product", 99.99);
orderService.save(order);
}
}
// Нагрузочное тестирование должно подтвердить:
// - API обрабатывает N запросов в секунду
// - Memory leaks отсутствуют
// - Response time < X ms при нормальной нагрузке
5. Security тесты (критическое)
// Тестируют защиту от известных уязвимостей
@SpringBootTest
public class SecurityTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testSQLInjectionProtection() throws Exception {
// Попытка SQL Injection
mockMvc.perform(get("/api/users?name=' OR '1'='1'"))
.andExpect(status().isBadRequest());
}
@Test
public void testXSSProtection() throws Exception {
// Попытка XSS
mockMvc.perform(post("/api/comments")
.content("{\"text\": \"<script>alert('XSS')</script>\"}"))
.andExpect(status().isBadRequest());
}
@Test
public void testUnauthorizedAccess() throws Exception {
// Без токена не должно быть доступа
mockMvc.perform(get("/api/admin"))
.andExpect(status().isUnauthorized());
}
}
// OWASP Top 10 уязвимости:
// - SQL Injection
// - XSS (Cross-Site Scripting)
// - CSRF (Cross-Site Request Forgery)
// - Broken Authentication
// - Sensitive Data Exposure
6. API контрактные тесты
// Spring Cloud Contract
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderServiceContractTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testOrderCreationContract() throws Exception {
mockMvc.perform(post("/api/orders")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"product\": \"Item\", \"price\": 99.99}"))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.id").exists())
.andExpect(jsonPath("$.status").value("PENDING"));
}
}
7. Data validation тесты
// Проверяют что data integrity соблюдается
@Test
public void testOrderValidation() {
Order order = new Order();
order.setPrice(-100); // Отрицательная цена!
Set<ConstraintViolation<Order>> violations = validator.validate(order);
assertFalse(violations.isEmpty());
assertTrue(violations.stream()
.anyMatch(v -> v.getMessage().contains("price must be positive")));
}
Пирамида тестирования (правильное соотношение)
E2E (5%)
/ \\
/ API \\
/ Contracts \\
/ (10%) \\
/ \\
/ Integration \\
/ Tests (20%) \\
/________________________\\
Unit Tests (65%)
Чеклист перед production
КРИТИЧНО ВАЖНО:
- Unit тесты: покрытие >= 80%
- Integration тесты для всех бизнес-процессов
- Security тесты на OWASP Top 10
- E2E тесты основных юзер-фло́у
- Performance тесты (нагрузочные)
- Database миграция откачена и накачена (работает!)
- All tests PASS
- No critical bugs в backlog
ВАЖНО:
- Code review пройден
- API контракты протестированы
- Error handling протестирован
- Graceful shutdown работает
- Логирование достаточно
Инструменты
- Unit: JUnit, Mockito, AssertJ
- Integration: TestContainers, @SpringBootTest
- E2E: Selenium, TestRestTemplate
- Security: OWASP ZAP, Snyk, SonarQube
- Performance: JMH, Apache JMeter, Gatling
- API Contracts: Pact, Spring Cloud Contract
Вывод
Критически важные перед production:
- Unit тесты (80%+ покрытие) — ловят логические ошибки
- Integration тесты — гарантируют что компоненты работают вместе
- E2E тесты — проверяют полный юзер сценарий
- Security тесты — защита от common уязвимостей
- Performance тесты — приложение не упадёт под нагрузкой
Всё остальное — nice to have, но эти пять типов ДОЛЖНЫ быть в production-ready коде.