Testing Setup and Commands

This guide covers the essential setup and commands for SDK testing.

## Development Environment Setup

### Initial Setup

Required one-time setup for all SDK developers:

# Set up development environment (required first step)
./scripts/setup-dev.sh

This script installs: - Pre-commit hooks for code quality - Development dependencies (tox, pytest, etc.) - Code formatting tools (black, isort) - Static analysis tools (pylint, mypy)

### Verification

Verify your setup with basic tests:

# 1. Run unit tests to verify setup
tox -e unit

# 2. Run integration tests
tox -e integration

# 3. Check code coverage (minimum 80% required)
tox -e unit -- --cov=honeyhive --cov-report=html --cov-fail-under=80

## Testing Commands Reference

### Core Test Commands

Run specific test types:

# Unit tests only (fast, isolated tests)
tox -e unit

# Integration tests only (end-to-end functionality)
tox -e integration

# All tests (unit + integration)
tox -e unit -e integration

### Specialized Testing

# CLI tests specifically
pytest tests/unit/test_cli_main.py -v

# CLI tests with coverage
pytest tests/unit/test_cli_main.py --cov=src/honeyhive/cli/main --cov-report=term-missing

# Lambda compatibility tests
cd tests/lambda && make test-lambda

# Performance tests
cd tests/lambda && make test-performance

# Integration tests (requires real API credentials)
tox -e integration

### Coverage and Quality

# Coverage report (HTML format)
pytest --cov=honeyhive --cov-report=html

# Coverage report (terminal)
pytest --cov=honeyhive --cov-report=term-missing

# Specific test file with coverage
pytest tests/test_tracer.py --cov=honeyhive --cov-report=term-missing

### Quality Gates

Required before every commit:

# Format verification (black, isort)
tox -e format

# Lint verification (pylint, mypy)
tox -e lint

# Documentation build
tox -e docs

# Combined quality check
tox -e format && tox -e lint

### Python Version Testing

# Test specific Python versions
tox -e py311    # Python 3.11
tox -e py312    # Python 3.12
tox -e py313    # Python 3.13

# Test all supported versions
tox -e py311 -e py312 -e py313

## Test Environment Configuration

### Basic Test Configuration

# Test configuration
test_tracer = HoneyHiveTracer.init(
    api_key="test-api-key",  # Or set HH_API_KEY environment variable
    project="test-project",  # Or set HH_PROJECT environment variable
    source="development",    # Or set HH_SOURCE environment variable
    test_mode=True,          # Enable test mode (or set HH_TEST_MODE=true)
    disable_http_tracing=True  # Optimize for testing
)

### Environment Variables for Testing

# Set test environment variables
export HH_API_KEY="test-key"
export HH_SOURCE="test"
export HH_TEST_MODE="true"

### Multi-Environment Testing

def create_test_tracer(environment="test"):
    config = {
        "test": {
            "api_key": "test-key",
            "project": "test-project",
            "test_mode": True
        },
        "integration": {
            "api_key": os.getenv("HH_INTEGRATION_KEY"),
            "project": "integration-project",
            "test_mode": False
        }
    }

    return HoneyHiveTracer.init(**config[environment])

## Quick Testing Examples

### Basic Integration Test

from honeyhive import HoneyHiveTracer

def test_basic_integration():
    tracer = HoneyHiveTracer.init(
        api_key="test-key",      # Or set HH_API_KEY environment variable
        project="test-project",  # Or set HH_PROJECT environment variable
        test_mode=True           # Important: enables test mode (or set HH_TEST_MODE=true)
    )

    with tracer.trace("test-operation") as span:
        span.set_attribute("test.type", "integration")
        assert span is not None

### Mock HoneyHive for Testing

from unittest.mock import Mock, patch

def test_with_mock_tracer():
    with patch('honeyhive.HoneyHiveTracer') as mock_tracer:
        mock_tracer.init.return_value = Mock()

        # Your application code here
        result = your_function_that_uses_honeyhive()

        # Verify tracer was used
        mock_tracer.init.assert_called_once()

### Test Multi-Instance Tracers

def test_multiple_tracers():
    tracer1 = HoneyHiveTracer.init(
        api_key="key1",          # Unique API key for project1
        project="project1",      # Unique project identifier
        test_mode=True           # Or set HH_TEST_MODE=true
    )
    tracer2 = HoneyHiveTracer.init(
        api_key="key2",          # Unique API key for project2
        project="project2",      # Unique project identifier
        test_mode=True           # Or set HH_TEST_MODE=true
    )

    # Verify independence
    assert tracer1.session_id != tracer2.session_id
    assert tracer1.project != tracer2.project

### CLI Testing

from click.testing import CliRunner
from unittest.mock import Mock, patch
from honeyhive.cli.main import cli

def test_cli_command():
    """Test CLI commands using Click's CliRunner."""
    runner = CliRunner()

    # Test basic command
    result = runner.invoke(cli, ["--help"])
    assert result.exit_code == 0
    assert "HoneyHive CLI" in result.output

@patch('honeyhive.cli.main.HoneyHive')
def test_cli_with_mocking(mock_client):
    """Test CLI commands with proper mocking."""
    mock_client.return_value = Mock()

    runner = CliRunner()
    result = runner.invoke(cli, ["api", "request", "--method", "GET", "--url", "/test"])

    assert result.exit_code == 0
    mock_client.assert_called_once()

## Troubleshooting Setup Issues

### Common Setup Problems

Problem: tox command not found Solution: Install tox in your virtual environment:

pip install tox

Problem: Tests fail with import errors Solution: Install SDK in development mode:

pip install -e .

Problem: Pre-commit hooks not running Solution: Reinstall pre-commit hooks:

pre-commit install

### Performance Issues

Problem: Tests are slow Solution: Run unit tests only for faster feedback:

# Fast unit tests only
tox -e unit

# Skip integration tests during development
pytest tests/unit/ -v

Problem: Coverage calculation is slow Solution: Use faster coverage options:

# Skip HTML report for faster results
pytest --cov=honeyhive --cov-report=term

## See Also