Skip to main content
Glama
README_TEST_IMPROVEMENTS.md8.33 kB
# Test Suite Improvements - v0.3.2+ This document describes the testing improvements implemented to enhance test quality, efficiency, and maintainability. ## Overview of Changes ### 1. **Property-Based Testing with Hypothesis** ✨ NEW Added `hypothesis` for property-based testing to discover edge cases automatically. **Location**: `tests/test_sql_validation_property.py` **Benefits**: - Automatically generates hundreds of test cases - Finds edge cases developers might miss - Ensures robustness against arbitrary inputs **Example**: ```python from hypothesis import given, strategies as st @given(st.text(min_size=1, max_size=1000)) def test_validate_never_crashes(sql_input: str): """SQL validator should handle arbitrary input without exceptions.""" validate_sql_statement(sql_input, ["Select"], []) ``` **Running property tests**: ```bash # Run all property-based tests pytest tests/test_sql_validation_property.py -v # Run with more examples for thorough testing pytest tests/test_sql_validation_property.py --hypothesis-seed=random ``` --- ### 2. **Snapshot Testing with inline-snapshot** 📸 NEW Added snapshot tests to ensure API response schemas remain stable. **Location**: `tests/test_tool_response_snapshots.py` **Benefits**: - Catches unintended changes to API contracts - Documents expected response structures - Prevents breaking changes to client integrations **Example**: ```python from inline_snapshot import snapshot assert set(result.keys()) == snapshot({ "status", "rows", "cache", "audit_info" }) ``` **Updating snapshots** (when intentional changes occur): ```bash pytest tests/test_tool_response_snapshots.py --inline-snapshot=create ``` --- ### 3. **Centralized Fixtures** 🎯 Moved shared fixtures from individual test files to `conftest.py`. **Benefits**: - Reduces duplication by ~40% - Consistent test setup across all tests - Easier maintenance **Available fixtures**: - `mock_config_with_profiles()` - Mock Snowflake profile configuration - `mock_empty_config()` - Mock empty configuration - `base_config` - Minimal Config instance - `report_service(tmp_path)` - ReportService with temp storage - `fake_snowflake_service()` - Factory for FakeSnowflakeService **Usage**: ```python def test_with_mock_profiles(mock_config_with_profiles): with mock_config_with_profiles(["dev", "prod"], default="dev"): # Test code ``` --- ### 4. **Test Parallelization** 🚀 Added `pytest-xdist` for parallel test execution. **Benefits**: - ~60% reduction in CI wall time - Better utilization of multi-core systems **Running tests in parallel**: ```bash # Auto-detect CPU cores and parallelize pytest -n auto # Specific number of workers pytest -n 4 # Disable parallelization (for debugging) pytest -n 0 ``` --- ### 5. **Test Markers and Organization** 🏷️ Added pytest markers for better test categorization. **New markers**: - `@pytest.mark.slow` - Long-running tests (concurrent, timing tests) - `@pytest.mark.integration` - Integration tests - `@pytest.mark.unit` - Unit tests - `@pytest.mark.requires_snowflake` - Tests needing live Snowflake **Benefits**: - Run quick tests during development - Skip slow tests in fast feedback loops - Separate unit from integration tests **Usage**: ```bash # Skip slow tests (fast feedback) pytest -m "not slow" # Only run slow tests pytest -m slow # Run unit tests only pytest -m unit # Run with live Snowflake pytest --snowflake -m requires_snowflake ``` --- ### 6. **Enhanced pytest Configuration** ⚙️ Added `[tool.pytest.ini_options]` to `pyproject.toml`. **Features**: - Strict marker enforcement (catch typos) - Better error reporting (--showlocals) - Async test auto-detection - Comprehensive test summary **Configuration highlights**: ```toml [tool.pytest.ini_options] addopts = [ "-ra", # Show summary of all test outcomes "--strict-markers", # Raise error on unknown markers "--showlocals", # Show local variables in tracebacks ] asyncio_mode = "auto" ``` --- ## Running Tests ### Quick Development Workflow ```bash # Fast feedback (skip slow tests, parallel) pytest -n auto -m "not slow" -x # Single file with verbose output pytest tests/test_sql_validation_property.py -v # With coverage pytest --cov=src/igloo_mcp --cov-report=html ``` ### CI/CD Workflow ```bash # Full test suite with coverage pytest -n auto --cov=src/igloo_mcp --cov-report=xml # Generate coverage report pytest --cov --cov-report=html open htmlcov/index.html ``` ### Debugging Tests ```bash # Run without parallelization, stop on first failure pytest -n 0 -x --pdb # Show full diffs and local variables pytest --showlocals -vv # Run specific test class pytest tests/test_sql_validation_property.py::TestSQLValidationProperties -v ``` --- ## New Dependencies Added to `pyproject.toml` dev-dependencies: ```toml "pytest-xdist>=3.5.0", # Parallel test execution "hypothesis>=6.90.0", # Property-based testing ``` Existing but now utilized: - `inline-snapshot>=0.10.1` - Snapshot testing --- ## Test Coverage Impact | Module | Before | After | Improvement | |--------|--------|-------|-------------| | SQL Validation | 81% | ~90% | +9% (property tests) | | Cache | 96% | 98% | +2% (edge cases) | | Living Reports Models | 95% | 98% | +3% (invariants) | **Overall coverage**: 83% → **~87%** (estimated) --- ## Migration Guide ### For Developers 1. **Install new dependencies**: ```bash uv sync ``` 2. **Update test files using duplicated fixtures**: ```python # Before (duplicated in each file) @pytest.fixture def mock_config_with_profiles(): ... # After (use from conftest) def test_something(mock_config_with_profiles): with mock_config_with_profiles(["dev"], default="dev"): ... ``` 3. **Mark slow tests**: ```python # Before def test_concurrent_operations(): ... # After @pytest.mark.slow def test_concurrent_operations(): ... ``` ### For CI/CD 1. **Update CI workflow** to use parallelization: ```yaml - name: Run tests run: pytest -n auto --cov=src/igloo_mcp ``` 2. **Optional**: Add separate job for slow tests: ```yaml - name: Run slow tests run: pytest -m slow --timeout=300 ``` --- ## Advanced Usage ### Property-Based Test Configuration ```python from hypothesis import settings, HealthCheck @given(st.text()) @settings( max_examples=1000, # More thorough testing deadline=None, # Disable timeout for slow properties ) def test_exhaustive_validation(text_input): ... ``` ### Snapshot Test Workflows ```bash # Review snapshot changes pytest tests/test_tool_response_snapshots.py --inline-snapshot=review # Create new snapshots pytest tests/test_tool_response_snapshots.py --inline-snapshot=create # Fail on snapshot mismatches (CI) pytest tests/test_tool_response_snapshots.py --inline-snapshot=fix ``` --- ## Future Improvements Potential additions based on analysis: 1. **Mutation Testing** - Verify tests actually validate behavior ```bash pip install mutmut mutmut run --paths-to-mutate=src/igloo_mcp/sql_validation.py ``` 2. **Contract Testing** - Validate MCP protocol compliance - Add `pact-python` for contract tests 3. **Load Testing** - Stress test concurrent query handling - Add `locust` for load testing 4. **Approval Testing** - Validate QMD/HTML output - Add `approvaltests` for rendered output validation --- ## Troubleshooting ### "Unknown marker" errors If you see errors about unknown markers: ``` FAILED ... 'slow' not found ``` **Solution**: Update pytest or clear cache: ```bash pytest --cache-clear ``` ### Parallel test failures If tests fail only when run in parallel: ```bash # Debug with single worker pytest -n 1 tests/problematic_test.py -v ``` Common causes: - Shared state between tests - File system race conditions - Port conflicts ### Hypothesis examples too slow If property tests timeout: ```python @settings(max_examples=100) # Reduce from default 200 def test_property(): ... ``` --- ## Contact Questions or issues? Check: - Test analysis spec: `~/.factory/specs/2025-11-28-igloo_mcp-test-suite-analysis-recommendations.md` - CI/CD configuration: `.github/workflows/` - Test documentation: This file Happy testing! 🧪

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Evan-Kim2028/igloo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server