Enhance CMake configuration and CI/CD workflows for improved testing

- Updated CMakeLists.txt to introduce options for enabling experimental tests and minimal CI builds.
- Modified CMakePresets.json to refine test presets, including stable and experimental test configurations.
- Enhanced CI workflows in ci.yml to streamline testing processes, ensuring stable tests are prioritized and experimental tests are run separately.
- Added new documentation files outlining the CI/CD testing strategy and testing categories for better clarity on testing practices.
- Improved test discovery in CMakeLists.txt to simplify labeling and enhance CI efficiency.
This commit is contained in:
scawful
2025-09-25 09:39:33 -04:00
parent a1429a8199
commit e930789f4b
9 changed files with 486 additions and 56 deletions

190
docs/ci-testing-guide.md Normal file
View File

@@ -0,0 +1,190 @@
# CI/CD Testing Strategy - Efficient Workflows
## Overview
Yaze v0.3.0 implements a sophisticated testing strategy designed for efficient CI/CD pipelines while maintaining comprehensive quality assurance.
## Test Categories & Execution Strategy
### 🟢 STABLE Tests (CI Required)
**These tests MUST pass for releases**
- **AsarWrapperTest** (11/12 tests passing): Core Asar functionality
- **SnesTileTest**: SNES graphics format handling
- **CompressionTest**: Data compression utilities
- **SnesPaletteTest**: SNES palette operations
- **Basic ROM operations**: Core file handling
**Execution Time**: < 30 seconds total
**CI Strategy**: Run on every commit, block merge if failing
### 🟡 EXPERIMENTAL Tests (CI Informational)
**These tests can fail without blocking releases**
- **CpuTest** (400+ tests): 65816 CPU emulation - complex timing issues
- **Spc700Test**: SPC700 audio processor - emulation accuracy
- **Complex Integration Tests**: Multi-component scenarios
- **MessageTest**: Text parsing - may have encoding issues
- **DungeonIntegrationTest**: Complex editor workflows
**Execution Time**: 5-10 minutes
**CI Strategy**: Run separately with `continue-on-error: true`
### 🔴 ROM_DEPENDENT Tests (Development Only)
**These tests require actual ROM files**
- **AsarRomIntegrationTest**: Real ROM patching tests
- **ROM-based validation**: Tests with actual game data
**Execution**: Only in development environment
**CI Strategy**: Automatically skipped in CI (`--label-exclude ROM_DEPENDENT`)
## Dependency Management
### NFD (Native File Dialog) - Optional
```cmake
# Conditional inclusion for CI efficiency
option(YAZE_MINIMAL_BUILD "Minimal build for CI" OFF)
if(NOT YAZE_MINIMAL_BUILD)
add_subdirectory(lib/nativefiledialog-extended) # Requires GTK on Linux
else()
# Skip NFD to avoid GTK dependency in CI
endif()
```
### Linux Dependencies for Full Build
```bash
# Required for NFD on Linux
sudo apt-get install libgtk-3-dev libdbus-1-dev
# Core dependencies (always required)
sudo apt-get install libglew-dev libxext-dev libwavpack-dev libpng-dev
```
## CI Configuration Examples
### Fast CI Pipeline (< 5 minutes)
```yaml
- name: Configure (Minimal)
run: cmake -B build -DYAZE_MINIMAL_BUILD=ON -DYAZE_ENABLE_EXPERIMENTAL_TESTS=OFF
- name: Build
run: cmake --build build --parallel
- name: Test (Stable Only)
run: ctest --test-dir build --label-regex "STABLE" --parallel
```
### Development Pipeline (Complete)
```yaml
- name: Configure (Full)
run: cmake -B build -DYAZE_ENABLE_ROM_TESTS=ON -DYAZE_ENABLE_EXPERIMENTAL_TESTS=ON
- name: Build
run: cmake --build build --parallel
- name: Test (All)
run: ctest --test-dir build --output-on-failure
```
## Local Development Workflows
### Quick Development Testing
```bash
# Test only Asar functionality (< 30 seconds)
ctest --test-dir build -R "*AsarWrapper*" --parallel
# Test stable features only
ctest --test-dir build --label-regex "STABLE" --parallel
# Full development testing
cmake --preset dev
cmake --build --preset dev
ctest --preset dev
```
### Release Validation
```bash
# Release candidate testing (stable tests only)
cmake --preset release
cmake --build --preset release
ctest --test-dir build --label-regex "STABLE" --stop-on-failure
# Performance validation
ctest --test-dir build --label-regex "STABLE" --repeat until-pass:3
```
## Test Maintenance Strategy
### Weekly Review Process
1. **Check experimental test results** - identify tests ready for promotion
2. **Update test categorization** - move stable experimental tests to STABLE
3. **Performance monitoring** - track test execution times
4. **Failure analysis** - investigate patterns in experimental test failures
### Promotion Criteria (Experimental → Stable)
- **Consistent passing** for 2+ weeks
- **Fast execution** (< 10 seconds per test)
- **No external dependencies** (ROM files, GUI, complex setup)
- **Deterministic results** across platforms
### Test Categories by Stability
#### Currently Stable (22/24 tests passing)
- AsarWrapperTest.InitializationAndShutdown ✅
- AsarWrapperTest.ValidPatchApplication ✅
- AsarWrapperTest.SymbolExtraction ✅
- AsarWrapperTest.PatchFromString ✅
- AsarWrapperTest.ResetFunctionality ✅
#### Needs Attention (2/24 tests failing)
- AsarWrapperTest.AssemblyValidation ⚠️ (Error message format mismatch)
#### Experimental (Many failing but expected)
- CpuTest.* (400+ tests) - Complex 65816 emulation
- MessageTest.* - Text parsing edge cases
- Complex integration tests - Multi-component scenarios
## Efficiency Metrics
### Target CI Times
- **Stable Test Suite**: < 30 seconds
- **Full Build**: < 5 minutes
- **Total CI Pipeline**: < 10 minutes per platform
### Resource Optimization
- **Parallel Testing**: Use all available CPU cores
- **Selective Dependencies**: Skip optional dependencies in CI
- **Test Categorization**: Run only relevant tests for changes
- **Artifact Caching**: Cache build dependencies between runs
## Error Handling Strategy
### Build Failures
- **NFD/GTK Issues**: Use YAZE_MINIMAL_BUILD=ON to skip
- **Dependency Problems**: Clear dependency installation in CI
- **Platform-Specific**: Use matrix builds with proper toolchains
### Test Failures
- **Stable Tests**: Must be fixed before merge
- **Experimental Tests**: Log for review, don't block pipeline
- **ROM Tests**: Skip gracefully when ROM unavailable
- **GUI Tests**: May need headless display configuration
## Monitoring & Metrics
### Success Metrics
- **Stable Test Pass Rate**: 95%+ required
- **CI Pipeline Duration**: < 10 minutes target
- **Build Success Rate**: 98%+ across all platforms
- **Release Cadence**: Monthly releases with high confidence
### Quality Gates
1. All stable tests pass
2. Build succeeds on all platforms
3. No critical security issues
4. Performance regression check
5. Documentation updated
This strategy ensures efficient CI/CD while maintaining high quality standards for the yaze project.

202
docs/testing-strategy.md Normal file
View File

@@ -0,0 +1,202 @@
# Testing Strategy for Yaze v0.3.0
## Test Categories
Yaze uses a comprehensive testing strategy with different categories of tests to ensure quality while maintaining efficient CI/CD pipelines.
### Stable Tests (STABLE)
**Always run in CI/CD - Required for releases**
- **AsarWrapperTest**: Core Asar functionality tests
- **SnesTileTest**: SNES tile format handling
- **CompressionTest**: Data compression/decompression
- **SnesPaletteTest**: SNES palette operations
- **HexTest**: Hexadecimal utilities
- **AsarIntegrationTest**: Asar integration without ROM dependencies
**Characteristics:**
- Fast execution (< 30 seconds total)
- No external dependencies (ROMs, complex setup)
- High reliability and deterministic results
- Core functionality testing
### ROM-Dependent Tests (ROM_DEPENDENT)
**Only run in development with available ROM files**
- **AsarRomIntegrationTest**: Real ROM patching and symbol extraction
- **ROM-based integration tests**: Tests requiring actual game ROM files
**Characteristics:**
- Require specific ROM files to be present
- Test real-world functionality
- May be slower due to large file operations
- Automatically skipped in CI if ROM files unavailable
### Experimental Tests (EXPERIMENTAL)
**Run separately, allowed to fail**
- **CpuTest**: 65816 CPU emulation tests (complex, may have timing issues)
- **Spc700Test**: SPC700 audio processor tests
- **ApuTest**: Audio Processing Unit tests
- **PpuTest**: Picture Processing Unit tests
- **Complex Integration Tests**: Multi-component integration tests
**Characteristics:**
- May be unstable due to emulation complexity
- Test advanced/experimental features
- Allowed to fail without blocking releases
- Run in separate CI job with `continue-on-error: true`
### GUI Tests (GUI_TEST)
**Tests requiring graphical components**
- **DungeonEditorIntegrationTest**: GUI-based dungeon editing
- **Editor Integration Tests**: Tests requiring ImGui components
**Characteristics:**
- Require display/graphics context
- May not work in headless CI environments
- Focus on user interface functionality
## CI/CD Strategy
### Main CI Pipeline
```yaml
# Always run - required for merge
- Run Stable Tests: --label-regex "STABLE"
# Optional - allowed to fail
- Run Experimental Tests: --label-regex "EXPERIMENTAL" (continue-on-error: true)
```
### Development Testing
```bash
# Quick development testing
ctest --preset stable
# Full development testing with ROM
ctest --preset dev
# Test specific functionality
ctest --preset asar-only
```
### Release Testing
```bash
# Release candidate testing
ctest --preset stable --parallel
ctest --preset ci
```
## Test Execution Examples
### Command Line Usage
```bash
# Run only stable tests (release-ready)
ctest --test-dir build --label-regex "STABLE"
# Run experimental tests (allowed to fail)
ctest --test-dir build --label-regex "EXPERIMENTAL"
# Run Asar-specific tests
ctest --test-dir build -R "*Asar*"
# Run tests excluding ROM-dependent ones
ctest --test-dir build --label-exclude "ROM_DEPENDENT"
# Run with specific preset
ctest --preset stable
ctest --preset experimental
```
### CMake Preset Usage
```bash
# Development workflow
cmake --preset dev
cmake --build --preset dev
ctest --preset dev
# CI workflow
cmake --preset ci
cmake --build --preset ci
ctest --preset ci
# Release workflow
cmake --preset release
cmake --build --preset release
ctest --preset stable
```
## Test Development Guidelines
### Writing Stable Tests
- **Fast execution**: Aim for < 1 second per test
- **No external dependencies**: Self-contained test data
- **Deterministic**: Same results every run
- **Core functionality**: Test essential features only
### Writing Experimental Tests
- **Complex scenarios**: Multi-component integration
- **Advanced features**: Emulation, complex algorithms
- **Performance tests**: May vary by system
- **GUI components**: May require display context
### Writing ROM-Dependent Tests
- **Use TestRomManager**: Proper ROM file handling
- **Graceful skipping**: Skip if ROM not available
- **Real-world scenarios**: Test with actual game data
- **Label appropriately**: Always include ROM_DEPENDENT label
## CI/CD Efficiency
### Fast Feedback Loop
1. **Stable tests run first** - Quick feedback for developers
2. **Experimental tests run in parallel** - Don't block on unstable tests
3. **ROM tests skipped** - No dependency on external files
4. **Selective test execution** - Only run relevant tests for changes
### Release Quality Gates
1. **All stable tests must pass** - No exceptions
2. **Experimental tests informational only** - Don't block releases
3. **ROM tests run manually** - When ROM files available
4. **Performance benchmarks** - Track regression trends
## Maintenance Strategy
### Regular Review
- **Monthly review** of experimental test failures
- **Promote stable experimental tests** to stable category
- **Deprecate obsolete tests** that no longer provide value
- **Update test categorization** as features mature
### Performance Monitoring
- **Track test execution times** for CI efficiency
- **Identify slow tests** for optimization or recategorization
- **Monitor CI resource usage** and adjust parallelism
- **Benchmark critical path tests** for performance regression
## Test Categories by Feature
### Asar Integration
- **Stable**: AsarWrapperTest, AsarIntegrationTest
- **ROM-Dependent**: AsarRomIntegrationTest
- **Focus**: Core assembly patching and symbol extraction
### Graphics System
- **Stable**: SnesTileTest, SnesPaletteTest, CompressionTest
- **Experimental**: Complex rendering tests
- **Focus**: SNES graphics format handling
### Emulation
- **Experimental**: CpuTest, Spc700Test, ApuTest, PpuTest
- **Focus**: Hardware emulation accuracy
- **Note**: Complex timing-sensitive tests
### Editor Components
- **GUI**: DungeonEditorIntegrationTest, Editor integration tests
- **Experimental**: Complex editor workflow tests
- **Focus**: User interface functionality
This strategy ensures efficient CI/CD while maintaining comprehensive test coverage for quality assurance.