Test Runtime
Wow separates tests by runtime dependency so local checks stay fast while container-backed scenarios remain explicit.
Test Layers
| Layer | Source set | Root task | Runtime dependency |
|---|---|---|---|
| Local | src/test | allLocalTest | Local-safe framework, extension, domain, and server tests. |
| Contract | src/contractTest | allContractTest | Local-safe TCK implementor tests. |
| Integration | src/integrationTest | allIntegrationTest | Testcontainers-backed middleware and end-to-end tests. |
check runs local-safe verification: standard test tasks plus contract tests where configured. It does not start Docker containers.
Use allLocalTest as the root task for standard src/test execution.
Local Fast Checks
./gradlew allLocalTest
./gradlew allContractTest
./gradlew checkUse these commands for normal development and pull-request feedback when Docker is not required.
Domain Behavior Tests
Domain behavior tests still use the inheritance-style AggregateSpec and SagaSpec APIs documented in Test Suite. They live in each owning domain module's standard src/test source set and are part of the local test layer.
./gradlew allLocalTest
./gradlew :example-domain:test
./gradlew :example-transfer-domain:test
./gradlew :wow-compensation-domain:testThe function-style DSL is planned as a later migration stage, so runtime test layering does not require changing existing domain specs.
Integration Tests
./gradlew allIntegrationTest
./gradlew :wow-mongo:integrationTest
./gradlew :wow-redis:integrationTest
./gradlew :wow-r2dbc:integrationTest
./gradlew :wow-kafka:integrationTest
./gradlew :wow-elasticsearch:integrationTest
./gradlew :wow-it:integrationTestIntegration tests use Testcontainers and require Docker. They are intentionally not wired into check.
Coverage
./gradlew codeCoverageReport
./gradlew :code-coverage-report:localCoverageReport
./gradlew :code-coverage-report:contractCoverageReport
./gradlew :code-coverage-report:integrationCoverageReportThe aggregate report includes local, contract, and integration execution data. The XML report is written to:
test/code-coverage-report/build/reports/jacoco/codeCoverageReport/codeCoverageReport.xmlLayer reports are written under the matching localCoverageReport, contractCoverageReport, and integrationCoverageReport directories. Pull-request workflows upload those XML reports to Codecov with the local, contract, and integration flags. The main-branch Codecov workflow uploads the aggregate report as the full baseline flag.
Domain modules also enforce their existing coverage threshold through jacocoTestCoverageVerification, using standard test execution data.
Benchmark Smoke
./gradlew :wow-benchmarks:benchmarkSmokeBenchmark smoke checks that selected JMH paths still compile and execute. It is a pull-request safety check, not a performance report.
Quick Benchmarks
./gradlew :wow-benchmarks:benchmarkQuickE2E
./gradlew :wow-benchmarks:benchmarkQuickComponent
./gradlew :wow-benchmarks:benchmarkQuickInfrastructureE2E
./gradlew :wow-benchmarks:generateQuickBenchmarkReportQuick benchmarks use the same catalog as full benchmarks with shorter JMH settings. They are useful for local regression feedback, but full E2E remains the source for performance conclusions. Infrastructure benchmarks require local Redis and MongoDB services.
Full Benchmarks
./gradlew :wow-benchmarks:benchmarkFullE2E
./gradlew :wow-benchmarks:benchmarkFullComponent
./gradlew :wow-benchmarks:benchmarkFullInfrastructureE2E
./gradlew :wow-benchmarks:generateGroupedBenchmarkReportFull E2E results are used for framework performance conclusions. Component results explain bottlenecks and should not be reported as standalone framework performance goals. Infrastructure E2E results expose storage-path bottlenecks when Redis and MongoDB are available.
CI Workflows
Pull requests run separate workflows for Local Test, Contract Test, Integration Test, Benchmark Smoke, and Static Analysis. The Local Test, Contract Test, and Integration Test workflows each publish a layer-specific Codecov flag. The main Codecov workflow builds codeCoverageReport for the full baseline on main or manual dispatch.