init project tests
This commit is contained in:
parent
d0ff728224
commit
7c9318c778
44 changed files with 4431 additions and 49 deletions
282
test/README.md
Normal file
282
test/README.md
Normal file
|
@ -0,0 +1,282 @@
|
|||
# Django FBF Test Suite
|
||||
|
||||
Comprehensive test suite for the Django FBF (Falken-, Bussard- und Fischadler) project.
|
||||
|
||||
## Test Structure
|
||||
|
||||
```
|
||||
test/
|
||||
├── __init__.py # Test package initialization
|
||||
├── conftest.py # Pytest configuration
|
||||
├── test_settings.py # Django test settings
|
||||
├── run_tests.py # Custom test runner script
|
||||
├── fixtures.py # Test fixtures and utilities
|
||||
├── requirements.txt # Test-specific dependencies
|
||||
├── README.md # This file
|
||||
├── unit/ # Unit tests
|
||||
│ ├── __init__.py
|
||||
│ ├── test_bird_models.py # Bird model tests
|
||||
│ ├── test_bird_forms.py # Bird form tests
|
||||
│ ├── test_bird_views.py # Bird view tests
|
||||
│ ├── test_aviary_models.py # Aviary model tests
|
||||
│ ├── test_aviary_forms.py # Aviary form tests
|
||||
│ ├── test_contact_models.py # Contact model tests
|
||||
│ └── test_costs_models.py # Costs model tests
|
||||
├── functional/ # Functional tests
|
||||
│ ├── __init__.py
|
||||
│ └── test_workflows.py # User workflow tests
|
||||
└── integration/ # Integration tests
|
||||
├── __init__.py
|
||||
└── test_system_integration.py # System integration tests
|
||||
```
|
||||
|
||||
## Test Categories
|
||||
|
||||
### Unit Tests
|
||||
Tests individual components in isolation:
|
||||
- **Model Tests**: Test Django models, validation, relationships
|
||||
- **Form Tests**: Test Django forms, validation, field behavior
|
||||
- **View Tests**: Test Django views, permissions, responses
|
||||
|
||||
### Functional Tests
|
||||
Tests complete user workflows and feature interactions:
|
||||
- **Bird Management Workflows**: Creating, editing, transferring birds
|
||||
- **Aviary Management**: Capacity management, bird assignments
|
||||
- **Search and Filtering**: Testing search functionality
|
||||
- **User Permissions**: Access control and authentication flows
|
||||
|
||||
### Integration Tests
|
||||
Tests system-wide functionality and external integrations:
|
||||
- **Database Integration**: Transaction handling, constraints, performance
|
||||
- **Email Integration**: Email sending and notification systems
|
||||
- **File Handling**: Static files, media uploads
|
||||
- **API Integration**: External API calls (if any)
|
||||
- **Cache Integration**: Caching functionality (if implemented)
|
||||
|
||||
## Running Tests
|
||||
|
||||
### Method 1: Using the Custom Test Runner
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
cd /Users/maximilianfischer/git/django_fbf
|
||||
python3 test/run_tests.py
|
||||
```
|
||||
|
||||
### Method 2: Using Django's manage.py
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
cd /Users/maximilianfischer/git/django_fbf/app
|
||||
python3 manage.py test test --settings=test.test_settings
|
||||
|
||||
# Run specific test categories
|
||||
python3 manage.py test test.unit --settings=test.test_settings
|
||||
python3 manage.py test test.functional --settings=test.test_settings
|
||||
python3 manage.py test test.integration --settings=test.test_settings
|
||||
|
||||
# Run specific test files
|
||||
python3 manage.py test test.unit.test_bird_models --settings=test.test_settings
|
||||
```
|
||||
|
||||
### Method 3: Using pytest (if installed)
|
||||
|
||||
```bash
|
||||
# Install test requirements first
|
||||
pip install -r test/requirements.txt
|
||||
|
||||
# Run all tests
|
||||
cd /Users/maximilianfischer/git/django_fbf/test
|
||||
pytest -v
|
||||
|
||||
# Run with coverage
|
||||
pytest --cov=../app --cov-report=html
|
||||
|
||||
# Run specific test categories
|
||||
pytest unit/ -v
|
||||
pytest functional/ -v
|
||||
pytest integration/ -v
|
||||
|
||||
# Run specific test files
|
||||
pytest unit/test_bird_models.py -v
|
||||
```
|
||||
|
||||
### Method 4: Using the Rebuild Script
|
||||
|
||||
The rebuild script automatically runs all tests as part of the rebuild process:
|
||||
|
||||
```bash
|
||||
cd /Users/maximilianfischer/git/django_fbf
|
||||
./rebuild_project.sh
|
||||
```
|
||||
|
||||
## Test Configuration
|
||||
|
||||
### Test Settings (`test_settings.py`)
|
||||
- Uses SQLite in-memory database for speed
|
||||
- Disables migrations for faster test setup
|
||||
- Uses simple password hasher for performance
|
||||
- Configures email backend for testing
|
||||
- Sets up test-specific logging
|
||||
|
||||
### Test Fixtures (`fixtures.py`)
|
||||
- `TestDataMixin`: Provides common test data creation methods
|
||||
- Pytest fixtures for common objects
|
||||
- Sample data generators
|
||||
- Test utilities for assertions and validations
|
||||
|
||||
### Environment Setup
|
||||
- Tests use separate settings from development/production
|
||||
- Isolated test database (in-memory SQLite)
|
||||
- Mock external dependencies
|
||||
- Clean state for each test
|
||||
|
||||
## Test Data
|
||||
|
||||
### Sample Data Available
|
||||
- **Birds**: Robin, Sparrow, Falcon with different attributes
|
||||
- **Aviaries**: Forest Sanctuary, Lake Resort, Mountain Refuge
|
||||
- **Statuses**: Gesund (Healthy), Krank (Sick), Verletzt (Injured)
|
||||
- **Circumstances**: Gefunden (Found), Gebracht (Brought), Übertragen (Transferred)
|
||||
- **Users**: Admin and regular users with different permissions
|
||||
|
||||
### Creating Test Data
|
||||
Use the `TestDataMixin` class or pytest fixtures:
|
||||
|
||||
```python
|
||||
from test.fixtures import TestDataMixin
|
||||
|
||||
class MyTest(TestCase, TestDataMixin):
|
||||
def setUp(self):
|
||||
self.user = self.create_test_user()
|
||||
self.aviary = self.create_test_aviary(self.user)
|
||||
self.bird = self.create_test_bird(self.user, self.aviary, ...)
|
||||
```
|
||||
|
||||
## Coverage Goals
|
||||
|
||||
### Current Test Coverage
|
||||
- **Models**: All model fields, methods, and relationships
|
||||
- **Forms**: Form validation, field types, error handling
|
||||
- **Views**: Authentication, permissions, CRUD operations
|
||||
- **Workflows**: Complete user journeys
|
||||
- **Integration**: Database, email, file handling
|
||||
|
||||
### Coverage Targets
|
||||
- Unit Tests: >90% code coverage
|
||||
- Functional Tests: All major user workflows
|
||||
- Integration Tests: All external dependencies
|
||||
|
||||
## Common Test Patterns
|
||||
|
||||
### Model Testing
|
||||
```python
|
||||
def test_bird_creation(self):
|
||||
bird = Bird.objects.create(**valid_data)
|
||||
self.assertEqual(bird.name, "Test Bird")
|
||||
self.assertTrue(isinstance(bird, Bird))
|
||||
```
|
||||
|
||||
### Form Testing
|
||||
```python
|
||||
def test_form_valid_data(self):
|
||||
form = BirdAddForm(data=valid_form_data)
|
||||
self.assertTrue(form.is_valid())
|
||||
|
||||
def test_form_invalid_data(self):
|
||||
form = BirdAddForm(data=invalid_form_data)
|
||||
self.assertFalse(form.is_valid())
|
||||
self.assertIn('field_name', form.errors)
|
||||
```
|
||||
|
||||
### View Testing
|
||||
```python
|
||||
def test_view_requires_login(self):
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
def test_view_authenticated(self):
|
||||
self.client.login(username='user', password='pass')
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Import Errors**
|
||||
- Ensure Django settings are configured: `DJANGO_SETTINGS_MODULE=test.test_settings`
|
||||
- Check Python path includes the app directory
|
||||
|
||||
2. **Database Errors**
|
||||
- Tests use in-memory SQLite, migrations are disabled
|
||||
- Each test gets a fresh database state
|
||||
|
||||
3. **Missing Dependencies**
|
||||
- Install test requirements: `pip install -r test/requirements.txt`
|
||||
- Ensure Django and all app dependencies are installed
|
||||
|
||||
4. **URL Reversing Errors**
|
||||
- Some tests use try/except blocks for URL reversing
|
||||
- Update URL names in tests to match your actual URLs
|
||||
|
||||
### Debug Mode
|
||||
|
||||
Run tests with verbose output:
|
||||
```bash
|
||||
python3 manage.py test test --verbosity=2
|
||||
pytest -v -s # -s shows print statements
|
||||
```
|
||||
|
||||
### Test Database
|
||||
|
||||
The test database is automatically created and destroyed. To inspect:
|
||||
```bash
|
||||
# Run with keepdb to preserve test database
|
||||
python3 manage.py test test --keepdb
|
||||
```
|
||||
|
||||
## Contributing Tests
|
||||
|
||||
### Adding New Tests
|
||||
|
||||
1. **Unit Tests**: Add to appropriate file in `unit/`
|
||||
2. **Functional Tests**: Add to `functional/test_workflows.py`
|
||||
3. **Integration Tests**: Add to `integration/test_system_integration.py`
|
||||
|
||||
### Test Guidelines
|
||||
|
||||
- Use descriptive test method names: `test_bird_creation_with_valid_data`
|
||||
- Include both positive and negative test cases
|
||||
- Test edge cases and error conditions
|
||||
- Use fixtures and test utilities for common setup
|
||||
- Keep tests independent and isolated
|
||||
- Add docstrings for complex tests
|
||||
|
||||
### Running Before Commits
|
||||
|
||||
Always run tests before committing:
|
||||
```bash
|
||||
# Quick unit tests
|
||||
python3 manage.py test test.unit
|
||||
|
||||
# Full test suite
|
||||
./rebuild_project.sh
|
||||
```
|
||||
|
||||
## Continuous Integration
|
||||
|
||||
The test suite is designed to work with CI/CD pipelines:
|
||||
- Fast execution with in-memory database
|
||||
- Clear pass/fail status
|
||||
- Comprehensive coverage reporting
|
||||
- Integration with the rebuild script
|
||||
|
||||
For CI/CD integration, use:
|
||||
```bash
|
||||
cd /Users/maximilianfischer/git/django_fbf
|
||||
python3 test/run_tests.py
|
||||
```
|
||||
|
||||
This will exit with code 0 for success, 1 for failure.
|
Loading…
Add table
Add a link
Reference in a new issue