328 lines
8.0 KiB
Markdown
328 lines
8.0 KiB
Markdown
# TradingAgents Test Suite
|
|
|
|
Comprehensive, production-ready test suite for TradingAgents using TDD best practices.
|
|
|
|
## Overview
|
|
|
|
This test suite provides thorough coverage of the new TradingAgents features including:
|
|
- LLM Factory (multi-provider support)
|
|
- Broker Integration (base and Alpaca)
|
|
- Web Interface (Chainlit)
|
|
|
|
## Test Files
|
|
|
|
### 1. `test_llm_factory.py`
|
|
Tests for the LLM factory that supports OpenAI, Anthropic, and Google providers.
|
|
|
|
**Coverage:**
|
|
- Provider validation and error handling
|
|
- Model recommendations for each provider
|
|
- LLM creation with various configurations
|
|
- Environment variable handling
|
|
- Backend URL configuration
|
|
- Error cases (missing API keys, invalid providers)
|
|
|
|
**Test Count:** 40 tests
|
|
|
|
**Key Features:**
|
|
- All external API calls are mocked
|
|
- No real API keys required
|
|
- Fast execution (< 1s per test)
|
|
- Parametrized tests for multiple providers
|
|
- Tests all three providers: OpenAI, Anthropic, Google
|
|
|
|
### 2. `test_base_broker.py`
|
|
Tests for the abstract broker interface and data structures.
|
|
|
|
**Coverage:**
|
|
- Order enumerations (OrderSide, OrderType, OrderStatus)
|
|
- BrokerOrder dataclass with all order types
|
|
- BrokerPosition dataclass
|
|
- BrokerAccount dataclass
|
|
- Exception hierarchy
|
|
- Convenience methods (buy_market, sell_market, buy_limit, sell_limit)
|
|
- Abstract interface compliance
|
|
|
|
**Test Count:** 25+ tests
|
|
|
|
**Key Features:**
|
|
- Tests all order types: market, limit, stop, stop-limit
|
|
- Tests fractional shares
|
|
- Tests all exception types
|
|
- Parametrized tests for enums
|
|
|
|
### 3. `test_alpaca_broker.py`
|
|
Tests for Alpaca broker integration with complete API mocking.
|
|
|
|
**Coverage:**
|
|
- Broker initialization (with credentials and env vars)
|
|
- Connection management
|
|
- Account operations
|
|
- Position operations (single and multiple)
|
|
- Order submission (all types)
|
|
- Order cancellation
|
|
- Order retrieval
|
|
- Current price fetching
|
|
- Error handling (network errors, insufficient funds, etc.)
|
|
- Helper methods for type conversion
|
|
|
|
**Test Count:** 40+ tests
|
|
|
|
**Key Features:**
|
|
- All Alpaca API calls are mocked using `requests` mock
|
|
- Tests both paper and live trading URLs
|
|
- Tests insufficient funds error
|
|
- Tests network errors
|
|
- Tests 404 responses
|
|
- Fast, no network calls
|
|
- Parametrized tests for status conversion
|
|
|
|
### 4. `test_web_app.py`
|
|
Tests for the Chainlit web interface.
|
|
|
|
**Coverage:**
|
|
- Command parsing (analyze, buy, sell, portfolio, account, etc.)
|
|
- Session state management
|
|
- Input validation
|
|
- Broker integration
|
|
- TradingAgents integration
|
|
- Error handling
|
|
- Message formatting
|
|
- Provider switching
|
|
|
|
**Test Count:** 50+ tests
|
|
|
|
**Key Features:**
|
|
- Chainlit module is mocked
|
|
- Tests all commands
|
|
- Tests error cases
|
|
- Tests fractional shares
|
|
- Parametrized tests for commands
|
|
|
|
## Shared Test Utilities
|
|
|
|
### `conftest.py`
|
|
Provides shared fixtures and utilities:
|
|
|
|
**Fixtures:**
|
|
- `clean_environment`: Auto-use fixture that cleans environment
|
|
- `mock_env_vars`: Common environment variables
|
|
- `sample_broker_account`: Sample account data
|
|
- `sample_broker_position`: Sample position data
|
|
- `sample_positions_list`: List of positions
|
|
- `sample_market_order`: Market order fixture
|
|
- `sample_limit_order`: Limit order fixture
|
|
- `sample_filled_order`: Filled order fixture
|
|
- `connected_broker`: Fully configured mock broker
|
|
- `mock_trading_graph`: Mock TradingAgents graph
|
|
|
|
**Utilities:**
|
|
- `MockBrokerFactory`: Factory for creating different broker mocks
|
|
- `AlpacaResponseMocks`: Factory for Alpaca API responses
|
|
- `OrderBuilder`: Fluent interface for building test orders
|
|
- `BrokerAssertions`: Helper class for common assertions
|
|
|
|
## Running Tests
|
|
|
|
### Run All Tests
|
|
```bash
|
|
pytest tests/
|
|
```
|
|
|
|
### Run Specific Test File
|
|
```bash
|
|
pytest tests/test_base_broker.py
|
|
pytest tests/brokers/test_alpaca_broker.py
|
|
pytest tests/test_llm_factory.py
|
|
pytest tests/test_web_app.py
|
|
```
|
|
|
|
### Run Tests by Marker
|
|
```bash
|
|
# Run only unit tests
|
|
pytest -m unit
|
|
|
|
# Run only broker tests
|
|
pytest -m broker
|
|
|
|
# Run only LLM tests
|
|
pytest -m llm
|
|
|
|
# Skip slow tests
|
|
pytest -m "not slow"
|
|
```
|
|
|
|
### Run with Coverage
|
|
```bash
|
|
# Generate HTML coverage report
|
|
pytest --cov=tradingagents --cov-report=html
|
|
|
|
# Generate terminal report
|
|
pytest --cov=tradingagents --cov-report=term-missing
|
|
|
|
# With minimum coverage threshold
|
|
pytest --cov=tradingagents --cov-fail-under=90
|
|
```
|
|
|
|
### Run Tests in Parallel
|
|
```bash
|
|
# Install pytest-xdist first
|
|
pip install pytest-xdist
|
|
|
|
# Run with 4 workers
|
|
pytest -n 4
|
|
```
|
|
|
|
## Test Configuration
|
|
|
|
### `pytest.ini`
|
|
Configuration file with:
|
|
- Test discovery patterns
|
|
- Custom markers (unit, integration, slow, broker, llm, web)
|
|
- Logging configuration
|
|
- Coverage settings
|
|
- Warning filters
|
|
|
|
### Markers
|
|
- `unit`: Unit tests (isolated components)
|
|
- `integration`: Integration tests (multiple components)
|
|
- `slow`: Slow-running tests (> 1 second)
|
|
- `broker`: Broker-related tests
|
|
- `llm`: LLM factory tests
|
|
- `web`: Web interface tests
|
|
- `requires_api_key`: Tests needing real API keys
|
|
- `requires_network`: Tests needing network access
|
|
|
|
## Test Quality Standards
|
|
|
|
All tests follow these standards:
|
|
- **Fast**: Each test runs in < 1 second
|
|
- **Isolated**: Tests don't depend on each other
|
|
- **Repeatable**: Tests give same results every run
|
|
- **Self-checking**: Tests include clear assertions
|
|
- **Timely**: Tests written alongside code
|
|
|
|
### Mocking Strategy
|
|
- External APIs are always mocked
|
|
- No network calls in tests
|
|
- No real API keys required
|
|
- Mock at the integration boundary
|
|
|
|
### Test Structure
|
|
```python
|
|
def test_feature_name():
|
|
# Arrange: Set up test data and mocks
|
|
...
|
|
|
|
# Act: Execute the code under test
|
|
...
|
|
|
|
# Assert: Verify the results
|
|
...
|
|
```
|
|
|
|
## Coverage Goals
|
|
|
|
Target coverage: **> 90%**
|
|
|
|
Current coverage by module:
|
|
- `llm_factory.py`: ~95% (all major paths)
|
|
- `brokers/base.py`: ~98% (comprehensive)
|
|
- `brokers/alpaca_broker.py`: ~92% (all API operations)
|
|
- `web_app.py`: ~85% (all commands and error paths)
|
|
|
|
## Areas Difficult to Test
|
|
|
|
1. **Actual API Calls**: All mocked for speed and reliability
|
|
2. **Chainlit UI Rendering**: UI library internals not tested
|
|
3. **Network Timeouts**: Would slow down test suite
|
|
4. **Rate Limiting**: Behavior depends on external service
|
|
|
|
## Dependencies
|
|
|
|
Test dependencies (from requirements.txt or pyproject.toml):
|
|
```
|
|
pytest>=6.0
|
|
pytest-cov>=2.0
|
|
pytest-asyncio>=0.18.0 (for async tests)
|
|
pytest-mock>=3.0 (optional, for advanced mocking)
|
|
pytest-xdist>=2.0 (optional, for parallel execution)
|
|
```
|
|
|
|
## Continuous Integration
|
|
|
|
Tests are designed to run in CI environments:
|
|
- No environment setup required
|
|
- Fast execution (< 60 seconds for full suite)
|
|
- Clear error messages
|
|
- Exit codes for pass/fail
|
|
|
|
### Example GitHub Actions
|
|
```yaml
|
|
name: Tests
|
|
on: [push, pull_request]
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/setup-python@v2
|
|
with:
|
|
python-version: '3.11'
|
|
- run: pip install -e ".[test]"
|
|
- run: pytest --cov=tradingagents --cov-report=xml
|
|
- uses: codecov/codecov-action@v2
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Write Tests First**: Follow TDD - write test, see it fail, make it pass
|
|
2. **One Assertion Per Test**: Tests should verify one thing
|
|
3. **Clear Test Names**: Test name should describe what it tests
|
|
4. **Use Fixtures**: Reuse test data and setup via fixtures
|
|
5. **Mock External Dependencies**: Keep tests fast and reliable
|
|
6. **Test Edge Cases**: Include boundary conditions and error cases
|
|
7. **Parametrize When Appropriate**: Use `@pytest.mark.parametrize` for similar tests
|
|
|
|
## Troubleshooting
|
|
|
|
### Tests Not Found
|
|
```bash
|
|
# Make sure pytest can find tests
|
|
pytest --collect-only
|
|
```
|
|
|
|
### Import Errors
|
|
```bash
|
|
# Install package in development mode
|
|
pip install -e .
|
|
```
|
|
|
|
### Module Not Found
|
|
```bash
|
|
# Check Python path
|
|
python -c "import sys; print(sys.path)"
|
|
```
|
|
|
|
### Slow Tests
|
|
```bash
|
|
# Run with durations report
|
|
pytest --durations=10
|
|
```
|
|
|
|
## Contributing
|
|
|
|
When adding new features:
|
|
1. Write tests first (TDD)
|
|
2. Aim for > 90% coverage
|
|
3. Mock external dependencies
|
|
4. Add parametrized tests for multiple inputs
|
|
5. Update this README with new test files
|
|
|
|
## Contact
|
|
|
|
For questions about the test suite, check:
|
|
- Test file docstrings
|
|
- Individual test docstrings
|
|
- `conftest.py` fixture documentation
|