\\\"}\"))\n .andExpect(status().isBadRequest());\n }\n \n @Test\n public void testUnauthorizedAccess() throws Exception {\n // Без токена не должно быть доступа\n mockMvc.perform(get(\"/api/admin\"))\n .andExpect(status().isUnauthorized());\n }\n}\n\n// OWASP Top 10 уязвимости:\n// - SQL Injection\n// - XSS (Cross-Site Scripting)\n// - CSRF (Cross-Site Request Forgery)\n// - Broken Authentication\n// - Sensitive Data Exposure\n```\n\n### 6. API контрактные тесты\n\n```java\n// Spring Cloud Contract\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class OrderServiceContractTest {\n @Autowired\n private MockMvc mockMvc;\n \n @Test\n public void testOrderCreationContract() throws Exception {\n mockMvc.perform(post(\"/api/orders\")\n .contentType(MediaType.APPLICATION_JSON)\n .content(\"{\\\"product\\\": \\\"Item\\\", \\\"price\\\": 99.99}\"))\n .andExpect(status().isCreated())\n .andExpect(jsonPath(\"$.id\").exists())\n .andExpect(jsonPath(\"$.status\").value(\"PENDING\"));\n }\n}\n```\n\n### 7. Data validation тесты\n\n```java\n// Проверяют что data integrity соблюдается\n@Test\npublic void testOrderValidation() {\n Order order = new Order();\n order.setPrice(-100); // Отрицательная цена!\n \n Set> violations = validator.validate(order);\n \n assertFalse(violations.isEmpty());\n assertTrue(violations.stream()\n .anyMatch(v -> v.getMessage().contains(\"price must be positive\")));\n}\n```\n\n### Пирамида тестирования (правильное соотношение)\n\n```\n E2E (5%)\n / \\\\\n / API \\\\\n / Contracts \\\\\n / (10%) \\\\\n / \\\\\n / Integration \\\\\n / Tests (20%) \\\\\n/________________________\\\\\n Unit Tests (65%)\n```\n\n### Чеклист перед production\n\n**КРИТИЧНО ВАЖНО:**\n- Unit тесты: покрытие >= 80%\n- Integration тесты для всех бизнес-процессов\n- Security тесты на OWASP Top 10\n- E2E тесты основных юзер-фло́у\n- Performance тесты (нагрузочные)\n- Database миграция откачена и накачена (работает!)\n- All tests PASS\n- No critical bugs в backlog\n\n**ВАЖНО:**\n- Code review пройден\n- API контракты протестированы\n- Error handling протестирован\n- Graceful shutdown работает\n- Логирование достаточно\n\n### Инструменты\n\n- **Unit**: JUnit, Mockito, AssertJ\n- **Integration**: TestContainers, @SpringBootTest\n- **E2E**: Selenium, TestRestTemplate\n- **Security**: OWASP ZAP, Snyk, SonarQube\n- **Performance**: JMH, Apache JMeter, Gatling\n- **API Contracts**: Pact, Spring Cloud Contract\n\n### Вывод\n\n**Критически важные перед production:**\n1. **Unit тесты** (80%+ покрытие) — ловят логические ошибки\n2. **Integration тесты** — гарантируют что компоненты работают вместе\n3. **E2E тесты** — проверяют полный юзер сценарий\n4. **Security тесты** — защита от common уязвимостей\n5. **Performance тесты** — приложение не упадёт под нагрузкой\n\nВсё остальное — nice to have, но эти пять типов ДОЛЖНЫ быть в production-ready коде.","dateCreated":"2026-03-22T20:54:25.471609","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Какие типы тестирования являются критически важными перед выходом в прод?

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:

  1. Unit тесты (80%+ покрытие) — ловят логические ошибки
  2. Integration тесты — гарантируют что компоненты работают вместе
  3. E2E тесты — проверяют полный юзер сценарий
  4. Security тесты — защита от common уязвимостей
  5. Performance тесты — приложение не упадёт под нагрузкой

Всё остальное — nice to have, но эти пять типов ДОЛЖНЫ быть в production-ready коде.