deb-mock/docs/TESTING.md
robojerk c51819c836
Some checks failed
Build Deb-Mock Package / build (push) Failing after 1m9s
Lint Code / Lint All Code (push) Failing after 1s
Test Deb-Mock Build / test (push) Failing after 35s
Add comprehensive testing framework, performance monitoring, and plugin system
- Add complete pytest testing framework with conftest.py and test files
- Add performance monitoring and benchmarking capabilities
- Add plugin system with ccache plugin example
- Add comprehensive documentation (API, deployment, testing, etc.)
- Add Docker API wrapper for service deployment
- Add advanced configuration examples
- Remove old wget package file
- Update core modules with enhanced functionality
2025-08-19 20:49:32 -07:00

531 lines
14 KiB
Markdown

# Deb-Mock Testing Guide
## Overview
The `deb-mock` project includes a comprehensive test suite that covers all major functionality including core operations, performance monitoring, plugin system, and integration testing. This guide provides detailed information on running tests, understanding test coverage, and contributing to the test suite.
## Test Structure
### Test Organization
```
tests/
├── __init__.py # Test package initialization
├── conftest.py # Pytest configuration and fixtures
├── test_core.py # Core functionality tests
├── test_performance.py # Performance monitoring tests
├── test_plugin_system.py # Plugin system tests
└── requirements.txt # Test dependencies
```
### Test Categories
1. **Unit Tests** - Test individual components in isolation
2. **Integration Tests** - Test component interactions
3. **Performance Tests** - Test performance monitoring system
4. **Plugin Tests** - Test plugin system functionality
5. **System Tests** - Test end-to-end workflows
## Running Tests
### Prerequisites
1. **Python Virtual Environment**: Ensure you have activated the virtual environment
```bash
source venv/bin/activate
```
2. **Test Dependencies**: Install required testing packages
```bash
pip install -r tests/requirements.txt
```
### Basic Test Execution
#### Run All Tests
```bash
python -m pytest tests/
```
#### Run Specific Test File
```bash
python -m pytest tests/test_core.py
```
#### Run Specific Test Class
```bash
python -m pytest tests/test_performance.py::TestPerformanceMonitor
```
#### Run Specific Test Method
```bash
python -m pytest tests/test_performance.py::TestPerformanceMonitor::test_initialization
```
### Using the Test Runner Script
The project includes a comprehensive test runner script that provides additional functionality:
#### Run All Tests with Coverage
```bash
python run_tests.py --all --coverage-report
```
#### Run Specific Test Types
```bash
# Unit tests only
python run_tests.py --unit
# Integration tests only
python run_tests.py --integration
# Performance tests only
python run_tests.py --performance
# Plugin system tests only
python run_tests.py --plugin
```
#### Parallel Test Execution
```bash
python run_tests.py --all --parallel
```
#### Verbose Output
```bash
python run_tests.py --all --verbose
```
#### Additional Quality Checks
```bash
# Run linting
python run_tests.py --lint
# Run type checking
python run_tests.py --type-check
# Run security scanning
python run_tests.py --security
```
### Test Runner Options
| Option | Description |
|--------|-------------|
| `--unit` | Run unit tests only |
| `--integration` | Run integration tests only |
| `--performance` | Run performance tests only |
| `--plugin` | Run plugin system tests only |
| `--all` | Run all tests |
| `--parallel` | Run tests in parallel |
| `--no-coverage` | Disable coverage reporting |
| `--verbose`, `-v` | Verbose output |
| `--install-deps` | Install test dependencies |
| `--lint` | Run code linting |
| `--type-check` | Run type checking |
| `--security` | Run security scanning |
| `--coverage-report` | Generate coverage report |
## Test Configuration
### Pytest Configuration (`pytest.ini`)
```ini
[tool:pytest]
testpaths = tests
python_files = test_*.py
python_classes = Test*
python_functions = test_*
addopts =
-v
--tb=short
--strict-markers
--disable-warnings
--cov=deb_mock
--cov-report=term-missing
--cov-report=html:htmlcov
--cov-report=xml:coverage.xml
--cov-fail-under=80
markers =
slow: marks tests as slow
integration: marks tests as integration tests
unit: marks tests as unit tests
performance: marks tests as performance tests
plugin: marks tests as plugin system tests
```
### Coverage Configuration
- **Minimum Coverage**: 80%
- **Coverage Reports**: Terminal, HTML, XML
- **Coverage Output**: `htmlcov/` directory
## Test Fixtures
### Common Fixtures (`conftest.py`)
The test suite provides comprehensive fixtures for testing:
#### Configuration Fixtures
- `test_config` - Basic test configuration
- `performance_test_config` - Configuration with performance monitoring
- `plugin_test_config` - Configuration with plugin support
#### Mock Fixtures
- `mock_chroot_manager` - Mock chroot manager
- `mock_cache_manager` - Mock cache manager
- `mock_sbuild_wrapper` - Mock sbuild wrapper
- `mock_plugin_manager` - Mock plugin manager
- `mock_performance_monitor` - Mock performance monitor
#### Test Data Fixtures
- `sample_source_package` - Minimal Debian source package
- `test_package_data` - Package metadata for testing
- `test_build_result` - Build result data
- `test_performance_metrics` - Performance metrics data
#### Environment Fixtures
- `temp_dir` - Temporary directory for tests
- `test_environment` - Test environment variables
- `isolated_filesystem` - Isolated filesystem for testing
## Test Categories
### 1. Core Functionality Tests (`test_core.py`)
Tests the main `DebMock` class and its core operations:
- **Initialization** - Component initialization and configuration
- **Build Operations** - Package building with various scenarios
- **Chroot Management** - Chroot creation, restoration, and cleanup
- **Cache Operations** - Cache restoration and creation
- **Plugin Integration** - Hook execution and plugin lifecycle
- **Performance Monitoring** - Performance tracking integration
- **Error Handling** - Build failures and error scenarios
#### Example Test
```python
def test_build_with_existing_chroot(self, mock_deb_mock, sample_source_package,
mock_chroot_manager, mock_cache_manager,
mock_sbuild_wrapper, mock_plugin_manager,
mock_performance_monitor):
"""Test building with an existing chroot"""
# Mock the components
mock_deb_mock.chroot_manager = mock_chroot_manager
mock_deb_mock.cache_manager = mock_cache_manager
mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper
mock_deb_mock.plugin_manager = mock_plugin_manager
mock_deb_mock.performance_monitor = mock_performance_monitor
# Mock chroot exists
mock_chroot_manager.chroot_exists.return_value = True
# Run build
result = mock_deb_mock.build(sample_source_package)
# Verify result
assert result["success"] is True
```
### 2. Performance Monitoring Tests (`test_performance.py`)
Tests the performance monitoring and optimization system:
- **PerformanceMetrics** - Metrics data structure validation
- **BuildProfile** - Build performance profile management
- **PerformanceMonitor** - Real-time monitoring and metrics collection
- **PerformanceOptimizer** - AI-driven optimization suggestions
- **PerformanceReporter** - Report generation and data export
#### Example Test
```python
def test_monitor_operation_context_manager(self, test_config):
"""Test monitor_operation context manager"""
test_config.enable_performance_monitoring = True
monitor = PerformanceMonitor(test_config)
with monitor.monitor_operation("test_op") as op_id:
assert op_id.startswith("test_op_")
time.sleep(0.1) # Small delay
# Verify operation was tracked
assert len(monitor._operation_history) == 1
assert monitor._operation_history[0].operation == "test_op"
assert monitor._operation_history[0].duration > 0
```
### 3. Plugin System Tests (`test_plugin_system.py`)
Tests the extensible plugin system:
- **HookStages** - Hook stage definitions and values
- **BasePlugin** - Base plugin class functionality
- **PluginManager** - Plugin discovery, loading, and management
- **Plugin Lifecycle** - Initialization, execution, and cleanup
- **Hook System** - Hook registration and execution
- **Error Handling** - Plugin error scenarios
#### Example Test
```python
def test_plugin_lifecycle(self, test_config):
"""Test complete plugin lifecycle"""
manager = PluginManager(test_config)
# Create a test plugin
class TestPlugin(BasePlugin):
def __init__(self):
super().__init__(
name="TestPlugin",
version="1.0.0",
description="Test plugin for integration testing"
)
self.init_called = False
self.cleanup_called = False
def init(self, deb_mock):
self.init_called = True
return None
def cleanup(self):
self.cleanup_called = True
return None
# Test plugin lifecycle
plugin = TestPlugin()
manager.plugins["test_plugin"] = plugin
# Initialize
mock_deb_mock = Mock()
result = manager.init_plugins(mock_deb_mock)
assert result is True
assert plugin.init_called is True
# Cleanup
cleanup_result = manager.cleanup_plugins()
assert cleanup_result is True
assert plugin.cleanup_called is True
```
## Test Markers
### Available Markers
- **`@pytest.mark.slow`** - Marks tests as slow (can be deselected)
- **`@pytest.mark.integration`** - Marks tests as integration tests
- **`@pytest.mark.unit`** - Marks tests as unit tests
- **`@pytest.mark.performance`** - Marks tests as performance tests
- **`@pytest.mark.plugin`** - Marks tests as plugin system tests
### Using Markers
#### Run Only Fast Tests
```bash
python -m pytest -m "not slow"
```
#### Run Only Integration Tests
```bash
python -m pytest -m integration
```
#### Run Multiple Marker Types
```bash
python -m pytest -m "unit or performance"
```
## Coverage Reporting
### Coverage Types
1. **Terminal Coverage** - Inline coverage information
2. **HTML Coverage** - Detailed HTML report in `htmlcov/` directory
3. **XML Coverage** - Machine-readable coverage data
### Coverage Thresholds
- **Minimum Coverage**: 80%
- **Coverage Failure**: Tests fail if coverage drops below threshold
### Generating Coverage Reports
```bash
# Generate all coverage reports
python run_tests.py --coverage-report
# Generate specific coverage report
python -m coverage report
python -m coverage html
```
## Test Data Management
### Temporary Files
Tests use temporary directories that are automatically cleaned up:
```python
@pytest.fixture
def temp_dir():
"""Create a temporary directory for tests"""
temp_dir = tempfile.mkdtemp(prefix="deb_mock_test_")
yield temp_dir
shutil.rmtree(temp_dir, ignore_errors=True)
```
### Mock Data
Tests use realistic mock data for comprehensive testing:
```python
@pytest.fixture
def sample_source_package(temp_dir):
"""Create a minimal Debian source package for testing"""
package_dir = os.path.join(temp_dir, "test-package")
os.makedirs(package_dir)
# Create debian/control
debian_dir = os.path.join(package_dir, "debian")
os.makedirs(debian_dir)
# Add package files...
return package_dir
```
## Debugging Tests
### Verbose Output
```bash
python -m pytest -v -s tests/
```
### Debugging Specific Tests
```bash
# Run with debugger
python -m pytest --pdb tests/test_core.py::TestDebMock::test_build
# Run with trace
python -m pytest --trace tests/test_core.py::TestDebMock::test_build
```
### Test Isolation
```bash
# Run single test in isolation
python -m pytest -x tests/test_core.py::TestDebMock::test_build
# Stop on first failure
python -m pytest -x tests/
```
## Continuous Integration
### CI/CD Integration
The test suite is designed for CI/CD environments:
```yaml
# GitHub Actions example
- name: Run Tests
run: |
source venv/bin/activate
python run_tests.py --all --coverage-report --parallel
- name: Upload Coverage
uses: codecov/codecov-action@v3
with:
file: ./coverage.xml
```
### Test Parallelization
Tests can be run in parallel for faster execution:
```bash
# Auto-detect CPU cores
python -m pytest -n auto tests/
# Specific number of workers
python -m pytest -n 4 tests/
```
## Best Practices
### Writing Tests
1. **Test Naming** - Use descriptive test names that explain the scenario
2. **Test Isolation** - Each test should be independent and not affect others
3. **Mock External Dependencies** - Use mocks for system calls and external services
4. **Test Data** - Use realistic test data that represents real scenarios
5. **Error Scenarios** - Test both success and failure cases
### Test Organization
1. **Group Related Tests** - Use test classes to group related functionality
2. **Use Fixtures** - Leverage pytest fixtures for common setup
3. **Test Categories** - Use markers to categorize tests
4. **Coverage** - Aim for high test coverage (80% minimum)
### Performance Testing
1. **Realistic Scenarios** - Test with realistic data sizes and complexity
2. **Benchmarking** - Use the performance monitoring system for benchmarks
3. **Resource Monitoring** - Monitor CPU, memory, and I/O during tests
4. **Regression Detection** - Detect performance regressions
## Troubleshooting
### Common Issues
#### Import Errors
```bash
# Ensure virtual environment is activated
source venv/bin/activate
# Install test dependencies
pip install -r tests/requirements.txt
```
#### Coverage Issues
```bash
# Clear coverage data
python -m coverage erase
# Run tests with coverage
python -m pytest --cov=deb_mock tests/
```
#### Test Failures
```bash
# Run with verbose output
python -m pytest -v -s tests/
# Run specific failing test
python -m pytest tests/test_core.py::TestDebMock::test_build -v -s
```
### Getting Help
1. **Check Test Output** - Review test output for error details
2. **Review Fixtures** - Ensure test fixtures are properly configured
3. **Check Dependencies** - Verify all test dependencies are installed
4. **Review Configuration** - Check pytest.ini and test configuration
## Contributing to Tests
### Adding New Tests
1. **Follow Naming Convention** - Use `test_*.py` for test files
2. **Use Existing Fixtures** - Leverage existing fixtures when possible
3. **Add Markers** - Use appropriate test markers
4. **Maintain Coverage** - Ensure new code is covered by tests
### Test Review Process
1. **Test Coverage** - Ensure new functionality has adequate test coverage
2. **Test Quality** - Tests should be clear, maintainable, and reliable
3. **Performance Impact** - Tests should not significantly impact build times
4. **Documentation** - Document complex test scenarios and edge cases
This comprehensive testing guide ensures that the `deb-mock` project maintains high quality and reliability through extensive testing coverage.