← Back to Test old20250712

TESTING GUIDE

Documentation for TESTING_GUIDE from the Foundation repository.

Foundation Test Isolation & Performance Guide

Overview

This guide documents the comprehensive test isolation and performance optimization strategy implemented for the Foundation test suite. The goal is to ensure reliable, fast, and contamination-free testing across all components.

Test Isolation Architecture

Foundation.UnifiedTestFoundation

The Foundation.UnifiedTestFoundation module provides multiple isolation modes for different test scenarios:

Isolation Modes

  1. :basic - Minimal isolation for simple tests

    defmodule MySimpleTest do
      use Foundation.UnifiedTestFoundation, :basic
    end
    
  2. :registry - Registry isolation for MABEAM tests

    defmodule MyAgentTest do
      use Foundation.UnifiedTestFoundation, :registry
    
      test "agent functionality", %{test_context: ctx} do
        # Isolated registry available at ctx.registry_name
      end
    end
    
  3. :signal_routing - Full signal routing isolation

    defmodule MySignalTest do
      use Foundation.UnifiedTestFoundation, :signal_routing
    
      test "signal handling", %{test_context: ctx} do
        # Isolated signal router at ctx.signal_router_name
      end
    end
    
  4. :full_isolation - Complete service isolation

    defmodule MyComplexTest do
      use Foundation.UnifiedTestFoundation, :full_isolation
    end
    
  5. :contamination_detection - Full isolation + contamination monitoring

    defmodule MyRobustTest do
      use Foundation.UnifiedTestFoundation, :contamination_detection
    
      test "contamination-free test", %{test_context: ctx} do
        # Automatic contamination detection enabled
      end
    end
    

Migration Strategy

Phase-by-Phase Implementation

Phase 1: Emergency Stabilization

  • Identified and fixed critical test failures
  • Implemented basic isolation infrastructure
  • Created Foundation.UnifiedTestFoundation

Phase 2: Infrastructure Foundation

  • Built comprehensive test isolation system
  • Implemented multiple isolation modes
  • Created automatic cleanup mechanisms

Phase 3: Critical Path Migration

  • Migrated highest-risk contamination sources
  • Eliminated Foundation.TestConfig dependencies
  • Resolved critical race conditions

Phase 4: Systematic Migration

  • Migrated 9 critical test files (106 tests)
  • Eliminated :meck contamination risks
  • Resolved all async: false contamination sources

Phase 5: Optimization & Prevention

  • Implemented contamination detection
  • Created performance optimization tools
  • Achieved 60% migration coverage

Current Status

Migration Statistics

  • Total test files: 30
  • Migrated to UnifiedTestFoundation: 18 files (60%)
  • Foundation.TestConfig dependencies: 0 (eliminated)
  • async: false contamination sources: 0 (resolved)

Performance Improvements

  • Test isolation: Significantly improved through process scoping
  • Contamination prevention: Active monitoring with detailed reporting
  • Resource efficiency: 60% of tests using optimized isolation
  • Parallel execution: Enhanced through proper isolation boundaries

Contamination Detection

Automatic Detection

The :contamination_detection mode automatically monitors:

  • Leftover processes after test completion
  • Undetached telemetry handlers
  • ETS table leaks
  • Resource cleanup failures

Example Contamination Report

⚠️  CONTAMINATION DETECTED in test_12345:
  - Leftover telemetry handlers: ["test_handler_456"]
  - Significant ETS table growth: +3 tables

Best Practices

Test Writing Guidelines

  1. Use appropriate isolation mode:

    # For agent tests
    use Foundation.UnifiedTestFoundation, :registry
    
    # For signal tests  
    use Foundation.UnifiedTestFoundation, :signal_routing
    
    # For critical robustness
    use Foundation.UnifiedTestFoundation, :contamination_detection
    
  2. Access test context properly:

    test "my test", %{test_context: ctx} do
      registry = ctx.registry_name
      test_id = ctx.test_id
    end
    
  3. Handle resources correctly:

    test "resource test", %{test_context: ctx} do
      # Resources are automatically cleaned up
      # Manual cleanup is still good practice
      pid = spawn(fn -> :timer.sleep(100) end)
      Process.exit(pid, :kill)
    end
    

Performance Optimization

  1. Use async tests when possible:

    • UnifiedTestFoundation enables async by default for safe modes
    • Only :contamination_detection and :full_isolation require sync
  2. Group related tests:

    • Tests in the same file share isolation setup costs
    • Group by similar resource requirements
  3. Minimize resource usage:

    • Clean up spawned processes
    • Detach telemetry handlers manually when needed
    • Delete ETS tables in tests

Troubleshooting

Common Issues

  1. Contamination Detection Alerts

    • Review test for proper cleanup
    • Use manual resource cleanup
    • Consider upgrading isolation mode
  2. Resource Conflicts

    • Check for process name conflicts
    • Use test-scoped naming with ctx.test_id
    • Verify proper supervisor cleanup
  3. Performance Issues

    • Profile using Foundation.PerformanceOptimizer
    • Consider migration to UnifiedTestFoundation
    • Review async safety of tests

Debugging Tools

  1. Performance Analysis:

    analysis = Foundation.PerformanceOptimizer.analyze_test_performance()
    recommendations = Foundation.PerformanceOptimizer.generate_recommendations()
    
  2. Contamination Testing:

    # Use contamination detection mode for debugging
    use Foundation.UnifiedTestFoundation, :contamination_detection
    

Future Improvements

Recommendations

  1. Complete Migration: Continue migrating the remaining 40% of test files
  2. Enhanced Detection: Add more contamination detection patterns
  3. Performance Monitoring: Implement continuous performance tracking
  4. Documentation: Expand examples and edge case handling

Metrics to Track

  • Migration percentage (target: >80%)
  • Test execution time (track improvements)
  • Contamination incident rate (target: <1%)
  • Resource efficiency score (current: 60%)

Architecture Decisions

Why UnifiedTestFoundation?

  1. Consolidation: Single point of configuration for all test patterns
  2. Flexibility: Multiple isolation modes for different needs
  3. Performance: Optimized setup/teardown for each mode
  4. Reliability: Comprehensive cleanup and contamination detection

Why Process-Scoped Isolation?

  1. True Isolation: Each test gets its own process space
  2. Automatic Cleanup: OTP supervision handles process cleanup
  3. Resource Safety: Prevents cross-test contamination
  4. Debugging: Clear ownership of resources per test

Success Metrics

Achieved Goals ✅

  • Zero critical contamination sources: All eliminated
  • Comprehensive isolation: Multiple proven modes
  • Performance optimization: 60% coverage with tooling
  • Contamination detection: Active monitoring enabled
  • Documentation: Complete guide and examples

Quality Gates Maintained ✅

  • All tests passing: Continuous reliability
  • No Foundation.TestConfig: Legacy dependencies eliminated
  • No async: false issues: Race conditions resolved
  • Active monitoring: Contamination detection working

The Foundation test suite now provides a robust, scalable, and maintainable testing infrastructure that supports reliable development and deployment.