hackathon/docs/testing/test-strategy.md
Christoph Wagner a7516834ad feat: Complete HSP architecture design with full requirement traceability
Add comprehensive architecture documentation for HTTP Sender Plugin (HSP):

  Architecture Design:
  - Hexagonal (ports & adapters) architecture validated as highly suitable
  - 7 port interfaces (3 primary, 4 secondary) with clean boundaries
  - 32 production classes mapped to 57 requirements
  - Virtual threads for 1000 concurrent HTTP endpoints
  - Producer-Consumer pattern with circular buffer
  - gRPC bidirectional streaming with 4MB batching

  Documentation Deliverables (20 files, ~150 pages):
  - Requirements catalog: All 57 requirements analyzed
  - Architecture docs: System design, component mapping, Java packages
  - Diagrams: 6 Mermaid diagrams (C4 model, sequence, data flow)
  - Traceability: Complete Req→Arch→Code→Test matrix (100% coverage)
  - Test strategy: 35+ test classes, 98% requirement coverage
  - Validation: Architecture approved, 0 critical gaps, LOW risk

  Key Metrics:
  - Requirements coverage: 100% (57/57)
  - Architecture mapping: 100%
  - Test coverage (planned): 94.6%
  - Critical gaps: 0
  - Overall risk: LOW

  Critical Issues Identified:
  - Buffer size conflict: Req-FR-25 (300) vs config spec (300,000)
  - Duplicate requirement IDs: Req-FR-25, Req-NFR-7/8, Req-US-1

  Technology Stack:
  - Java 25 (OpenJDK 25), Maven 3.9+, fat JAR packaging
  - gRPC Java 1.60+, Protocol Buffers 3.25+
  - JUnit 5, Mockito, WireMock for testing
  - Compliance: ISO-9001, EN 50716

  Status: Ready for implementation approval
2025-11-19 08:58:42 +01:00

412 lines
12 KiB
Markdown

# Test Strategy - Log Data Collector
## Overview
This document defines the comprehensive testing strategy for the Log Data Collector system, ensuring full validation of functional, non-functional, architectural, and normative requirements.
## Test Framework Stack
### Core Testing Tools
- **JUnit 5** (Jupiter) - Unit and integration testing framework (Req-NFR-9)
- **Mockito 5.x** - Mocking framework for dependencies (Req-NFR-9)
- **Maven Surefire** - Unit test execution (Req-NFR-10)
- **Maven Failsafe** - Integration test execution (Req-NFR-10)
### Mock Servers
- **WireMock** - Mock HTTP server for endpoint simulation (Req-NFR-7)
- **gRPC Testing** - In-process gRPC server for transmission testing (Req-NFR-8)
### Additional Tools
- **AssertJ** - Fluent assertions for better readability
- **Awaitility** - Asynchronous test support
- **JMH** - Java Microbenchmark Harness for performance testing
## Test Pyramid Structure
```
/\
/E2E\ 5% - End-to-End (Full system)
/------\
/Integr. \ 20% - Integration (Component interaction)
/----------\
/ Unit \ 75% - Unit (Individual components)
/--------------\
```
## Test Categories
### 1. Unit Tests (75% of test suite)
**Scope**: Individual components in isolation with mocked dependencies
**Coverage Target**: 90% line coverage, 85% branch coverage
**Test Classes**:
- `ConfigurationLoaderTest` - Configuration parsing and validation
- `DataSerializerTest` - JSON/Protocol Buffer serialization
- `CircularBufferTest` - Buffer operations and thread safety
- `RetryMechanismTest` - Retry logic and backoff strategies
- `HealthCheckEndpointTest` - Health check HTTP/gRPC responses
- `HttpCollectorTest` - HTTP endpoint collection logic
- `GrpcTransmitterTest` - gRPC transmission logic
- `StartupSequenceTest` - Application startup orchestration
**Characteristics**:
- Fast execution (< 100ms per test)
- No external dependencies
- Deterministic results
- Isolated failures
### 2. Integration Tests (20% of test suite)
**Scope**: Component interactions with real infrastructure (mocked external systems)
**Coverage Target**: Key integration paths and data flows
**Test Classes**:
- `HttpCollectionIntegrationTest` - HTTP collection with WireMock server
- `GrpcTransmissionIntegrationTest` - gRPC transmission with test server
- `EndToEndDataFlowTest` - Complete IF1 IF2 data pipeline
- `ConfigurationFileIntegrationTest` - Real YAML file loading
- `CircularBufferIntegrationTest` - Multi-threaded buffer operations
**Characteristics**:
- Moderate execution time (< 5s per test)
- Real component interaction
- Mock external systems only
- Controlled test environment
### 3. End-to-End Tests (5% of test suite)
**Scope**: Full system validation with all components running
**Coverage Target**: Critical user scenarios and requirement validation
**Test Scenarios**:
- `E2EStartupAndCollectionTest` - Complete startup and first collection
- `E2EFailureRecoveryTest` - System resilience under failures
- `E2EPerformanceTest` - Load testing with 1000 endpoints
- `E2EConfigurationReloadTest` - Runtime configuration updates
**Characteristics**:
- Longer execution (< 30s per test)
- Real system deployment
- End-user perspective
- High-level validation
### 4. Performance Tests
**Scope**: Non-functional requirement validation
**Test Classes**:
- `PerformanceConcurrentEndpointsTest` - 1000 concurrent endpoints (Req-NFR-1)
- `PerformanceMemoryUsageTest` - Memory consumption < 4096MB (Req-NFR-2)
- `PerformanceVirtualThreadTest` - Virtual thread efficiency (Req-Arch-6)
- `PerformanceStartupTimeTest` - Startup time measurements
**Execution**: Separate Maven profile (`performance`) for CI/CD integration
### 5. Reliability Tests
**Scope**: Failure scenarios and recovery mechanisms
**Test Classes**:
- `ReliabilityStartupSequenceTest` - Startup component ordering (Req-FR-1 to Req-FR-8)
- `ReliabilityGrpcRetryTest` - gRPC connection failures (Req-FR-6, Req-FR-29)
- `ReliabilityHttpFailureTest` - HTTP endpoint failures (Req-FR-20)
- `ReliabilityBufferOverflowTest` - Buffer overflow handling (Req-FR-26)
- `ReliabilityPartialFailureTest` - Subset endpoint failures
**Execution**: Part of regular test suite with failure injection
### 6. Compliance Tests
**Scope**: Normative requirement validation
**Test Classes**:
- `ComplianceErrorDetectionTest` - Error detection mechanisms (Req-Norm-3)
- `ComplianceIso9001Test` - ISO-9001 quality measures (Req-Norm-1)
- `ComplianceEn50716Test` - EN 50716 software measures (Req-Norm-2)
- `ComplianceAuditLoggingTest` - Audit trail verification
**Execution**: Automated compliance report generation
## Test Data Management
### Test Configuration Files
- `src/test/resources/test-config.yaml` - Valid test configuration
- `src/test/resources/test-config-invalid.yaml` - Invalid format testing
- `src/test/resources/test-config-minimal.yaml` - Minimal valid config
- `src/test/resources/test-config-maximal.yaml` - Maximum complexity config
### Test Data Generators
- `TestDataFactory` - Create test log entries
- `TestConfigurationBuilder` - Fluent configuration creation
- `TestEndpointBuilder` - HTTP/gRPC endpoint creation
### Mock Server Definitions
- `HttpMockServerSetup` - WireMock server configuration
- `GrpcMockServerSetup` - gRPC test server configuration
## Test Execution Strategy
### Local Development
```bash
# Run all unit tests
mvn test
# Run integration tests
mvn verify -P integration-tests
# Run performance tests
mvn verify -P performance-tests
# Run all tests with coverage
mvn verify -P all-tests jacoco:report
```
### CI/CD Pipeline
1. **Commit Stage**: Unit tests (fast feedback)
2. **Integration Stage**: Integration tests + unit tests
3. **Performance Stage**: Performance tests (nightly)
4. **Compliance Stage**: Compliance validation + audit report
### Test Execution Order
1. Unit tests (parallel execution)
2. Integration tests (sequential by category)
3. E2E tests (sequential)
4. Performance tests (isolated environment)
## Assertion Strategy
### Unit Tests
```java
// Use AssertJ for fluent assertions
assertThat(config.getEndpoints())
.isNotEmpty()
.hasSize(3)
.allMatch(e -> e.getUrl() != null);
// Verify mock interactions
verify(grpcClient, times(1)).sendLogData(any());
verifyNoMoreInteractions(grpcClient);
```
### Integration Tests
```java
// Await asynchronous results
await().atMost(5, SECONDS)
.untilAsserted(() ->
assertThat(buffer.size()).isGreaterThan(0));
// Verify WireMock interactions
wireMock.verify(exactly(1),
getRequestedFor(urlEqualTo("/health")));
```
### Performance Tests
```java
// JMH benchmark assertions
assertThat(result.getScore())
.isLessThan(1000); // ops/ms threshold
// Memory assertions
assertThat(memoryUsed)
.isLessThan(4096 * 1024 * 1024L); // 4096 MB
```
## Coverage Requirements
### Minimum Coverage Thresholds
- **Line Coverage**: 85% overall, 90% for critical components
- **Branch Coverage**: 80% overall, 85% for decision logic
- **Method Coverage**: 90% overall
### Excluded from Coverage
- Generated code (Protocol Buffers, builders)
- Main entry points (`public static void main`)
- Exception constructors
- Trivial getters/setters
### Coverage Tools
- **JaCoCo** - Code coverage measurement
- **SonarQube** - Coverage analysis and technical debt tracking
## Test Naming Convention
### Unit Tests
```
should{ExpectedBehavior}_when{Condition}_given{State}
Examples:
- shouldReturnConfiguration_whenFileExists_givenValidYaml()
- shouldThrowException_whenFileNotFound_givenInvalidPath()
```
### Integration Tests
```
should{IntegrateComponents}_when{Scenario}_given{Setup}
Examples:
- shouldCollectData_whenHttpEndpointResponds_givenMockServer()
- shouldRetryTransmission_whenGrpcFails_givenRetryPolicy()
```
### Performance Tests
```
should{MeetRequirement}_when{LoadCondition}_given{SystemState}
Examples:
- shouldHandleConcurrentEndpoints_whenLoading1000Endpoints_givenVirtualThreads()
- shouldStayWithinMemoryLimit_whenBufferFull_givenMaxCapacity()
```
## Mock Strategy
### What to Mock
- External HTTP endpoints (WireMock)
- gRPC server connections (in-process test server)
- File system operations (optional, prefer test files)
- Time-dependent operations (Clock abstraction)
### What NOT to Mock
- Domain objects (value objects, entities)
- In-memory data structures (test real implementation)
- Simple utilities (no behavior to mock)
- Configuration objects (use test builders)
### Mockito Patterns
```java
// Stub return values
when(configLoader.load(anyString()))
.thenReturn(testConfiguration);
// Verify interactions
verify(transmitter).send(argThat(data ->
data.getTimestamp().isAfter(testStart)));
// Spy on real objects
ConfigurationLoader spy = spy(realConfigLoader);
doReturn(testConfig).when(spy).loadFromFile(any());
```
## Test Environment Setup
### Test Resources
```
src/test/
├── java/
│ └── com/logcollector/
│ ├── unit/ # Unit tests
│ ├── integration/ # Integration tests
│ ├── e2e/ # End-to-end tests
│ ├── performance/ # Performance tests
│ └── util/ # Test utilities
└── resources/
├── test-config.yaml
├── logback-test.xml # Test logging config
└── mockito-extensions/
```
### Test Fixtures
- `@BeforeEach` - Test-specific setup
- `@BeforeAll` - Class-level setup (expensive resources)
- `@AfterEach` - Test cleanup
- `@AfterAll` - Class-level cleanup
### Test Isolation
- Each test creates its own data
- No shared mutable state between tests
- Independent test execution order
- Parallel test execution where possible
## Continuous Testing
### Pre-Commit Hooks
- Run unit tests locally
- Verify code style (Checkstyle)
- Static analysis (SpotBugs)
### CI/CD Integration
- Automated test execution on every commit
- Coverage trend tracking
- Performance regression detection
- Test failure notifications
### Test Reporting
- JUnit XML reports for CI tools
- HTML coverage reports (JaCoCo)
- Test execution time tracking
- Flaky test detection
## Requirement Traceability
Every test class includes Javadoc with requirement mapping:
```java
/**
* Tests for ConfigurationLoader component.
*
* @validates Req-FR-11 - Configuration file detection
* @validates Req-FR-12 - Configuration parsing
* @validates Req-FR-13 - Configuration validation
* @validates Req-Norm-3 - Error detection
*/
@DisplayName("Configuration Loader Tests")
class ConfigurationLoaderTest {
// Test methods...
}
```
See `test-requirement-mapping.md` for complete test-to-requirement matrix.
## Test Maintenance
### Test Review Criteria
- Clear test naming
- Single assertion focus
- Requirement traceability
- Fast execution (< 100ms for unit)
- Deterministic results
- Meaningful failure messages
### Test Refactoring
- Extract common setup to test utilities
- Use test builders for complex objects
- Parameterize similar test scenarios
- Remove duplicate assertions
### Test Debt Management
- Track flaky tests
- Identify slow tests
- Monitor coverage trends
- Refactor brittle tests
## Success Metrics
### Test Quality Metrics
- **Test Coverage**: > 85% line coverage
- **Test Execution Time**: < 5 minutes for full suite
- **Test Stability**: < 1% flaky test rate
- **Bug Escape Rate**: < 5% defects found in production
### Test Effectiveness Metrics
- **Defect Detection Rate**: Tests catch 95%+ of bugs before production
- **Requirement Coverage**: 100% of requirements validated by tests
- **Regression Prevention**: Zero regression bugs in covered areas
## References
- JUnit 5 User Guide: https://junit.org/junit5/docs/current/user-guide/
- Mockito Documentation: https://javadoc.io/doc/org.mockito/mockito-core
- WireMock Documentation: https://wiremock.org/docs/
- gRPC Testing Guide: https://grpc.io/docs/languages/java/basics/#testing
- JaCoCo Documentation: https://www.jacoco.org/jacoco/trunk/doc/
---
**Version**: 1.0
**Last Updated**: 2025-11-19
**Author**: Test Strategist Agent
**Approval**: Pending Architecture Review