.. | ||
functional | ||
integration | ||
unit | ||
__init__.py | ||
conftest.py | ||
fixtures.py | ||
README.md | ||
requirements.txt | ||
run_tests.py | ||
test_settings.py |
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
# Run all tests
cd /Users/maximilianfischer/git/django_fbf
python3 test/run_tests.py
Method 2: Using Django's manage.py
# 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)
# 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:
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:
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
def test_bird_creation(self):
bird = Bird.objects.create(**valid_data)
self.assertEqual(bird.name, "Test Bird")
self.assertTrue(isinstance(bird, Bird))
Form Testing
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
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
-
Import Errors
- Ensure Django settings are configured:
DJANGO_SETTINGS_MODULE=test.test_settings
- Check Python path includes the app directory
- Ensure Django settings are configured:
-
Database Errors
- Tests use in-memory SQLite, migrations are disabled
- Each test gets a fresh database state
-
Missing Dependencies
- Install test requirements:
pip install -r test/requirements.txt
- Ensure Django and all app dependencies are installed
- Install test requirements:
-
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:
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:
# Run with keepdb to preserve test database
python3 manage.py test test --keepdb
Contributing Tests
Adding New Tests
- Unit Tests: Add to appropriate file in
unit/
- Functional Tests: Add to
functional/test_workflows.py
- 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:
# 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:
cd /Users/maximilianfischer/git/django_fbf
python3 test/run_tests.py
This will exit with code 0 for success, 1 for failure.