Testing, Qualität & Architektur-Checks

Unit, Integration, Contract, Mutation, Architecture Tests und Testdatenstrategie.

Enterprise JavaBeispieleArchitekturOffline HTML

Testpyramide für Enterprise Java

Enterprise-Tests sollen schnelles Feedback und reale Sicherheit kombinieren. Unit-Tests prüfen Domain-Regeln. Integrationstests prüfen DB, Broker und Framework-Konfiguration. Contract-Tests schützen Schnittstellen. End-to-End-Tests prüfen wenige kritische Gesamtabläufe.

TestartZielBeispiel
Unit TestFachregel isoliert prüfenOrder darf ohne Lines nicht platziert werden
Integration TestAdapter mit echter Infrastruktur prüfenRepository gegen PostgreSQL
Contract TestAPI-Vertrag stabil haltenConsumer erwartet Feld totalAmount
Architecture TestAbhängigkeitsrichtung erzwingenDomain darf Spring nicht importieren
E2E Testkritischen Geschäftsfluss prüfenOrder -> Invoice -> Payment
Integrationstest mit Testcontainers
@Testcontainers
class OrderRepositoryIT {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine");

    @Test
    void persistsOrderWithLines() {
        OrderRepository repository = repositoryFor(postgres.getJdbcUrl());
        Order order = Order.draftFor(new CustomerId(UUID.randomUUID()));
        order.addLine("SKU-1", 2, new BigDecimal("19.90"));
        order.place();

        repository.save(order);

        assertThat(repository.findById(order.id())).isPresent();
    }
}

Architekturtests

ArchUnit-Regeln für Moduldisziplin
@AnalyzeClasses(packages = "com.example.order")
class ArchitectureRulesTest {
    @ArchTest
    static final ArchRule domain_is_framework_free = noClasses()
        .that().resideInAPackage("..domain..")
        .should().dependOnClassesThat().resideInAnyPackage(
            "org.springframework..", "jakarta.persistence..", "jakarta.ws.rs.."
        );

    @ArchTest
    static final ArchRule adapters_do_not_call_each_other = noClasses()
        .that().resideInAPackage("..adapter..")
        .should().dependOnClassesThat().resideInAPackage("..adapter..");
}
⌂ Cockpit