mirror of
https://github.com/wshobson/agents
synced 2026-06-21 14:13:58 +00:00
162 lines
3.3 KiB
Markdown
162 lines
3.3 KiB
Markdown
# Python Testing Patterns — Advanced Reference
|
|
|
|
Advanced testing patterns including database testing, CI/CD integration, and configuration.
|
|
|
|
## Testing Database Code
|
|
|
|
```python
|
|
# test_database_models.py
|
|
import pytest
|
|
from sqlalchemy import create_engine, Column, Integer, String
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import sessionmaker, Session
|
|
|
|
Base = declarative_base()
|
|
|
|
|
|
class User(Base):
|
|
"""User model."""
|
|
__tablename__ = "users"
|
|
|
|
id = Column(Integer, primary_key=True)
|
|
name = Column(String(50))
|
|
email = Column(String(100), unique=True)
|
|
|
|
|
|
@pytest.fixture(scope="function")
|
|
def db_session() -> Session:
|
|
"""Create in-memory database for testing."""
|
|
engine = create_engine("sqlite:///:memory:")
|
|
Base.metadata.create_all(engine)
|
|
|
|
SessionLocal = sessionmaker(bind=engine)
|
|
session = SessionLocal()
|
|
|
|
yield session
|
|
|
|
session.close()
|
|
|
|
|
|
def test_create_user(db_session):
|
|
"""Test creating a user."""
|
|
user = User(name="Test User", email="test@example.com")
|
|
db_session.add(user)
|
|
db_session.commit()
|
|
|
|
assert user.id is not None
|
|
assert user.name == "Test User"
|
|
|
|
|
|
def test_query_user(db_session):
|
|
"""Test querying users."""
|
|
user1 = User(name="User 1", email="user1@example.com")
|
|
user2 = User(name="User 2", email="user2@example.com")
|
|
|
|
db_session.add_all([user1, user2])
|
|
db_session.commit()
|
|
|
|
users = db_session.query(User).all()
|
|
assert len(users) == 2
|
|
|
|
|
|
def test_unique_email_constraint(db_session):
|
|
"""Test unique email constraint."""
|
|
from sqlalchemy.exc import IntegrityError
|
|
|
|
user1 = User(name="User 1", email="same@example.com")
|
|
user2 = User(name="User 2", email="same@example.com")
|
|
|
|
db_session.add(user1)
|
|
db_session.commit()
|
|
|
|
db_session.add(user2)
|
|
|
|
with pytest.raises(IntegrityError):
|
|
db_session.commit()
|
|
```
|
|
|
|
## CI/CD Integration
|
|
|
|
```yaml
|
|
# .github/workflows/test.yml
|
|
name: Tests
|
|
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
|
|
strategy:
|
|
matrix:
|
|
python-version: ["3.9", "3.10", "3.11", "3.12"]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v4
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
pip install -e ".[dev]"
|
|
pip install pytest pytest-cov
|
|
|
|
- name: Run tests
|
|
run: |
|
|
pytest --cov=myapp --cov-report=xml
|
|
|
|
- name: Upload coverage
|
|
uses: codecov/codecov-action@v3
|
|
with:
|
|
file: ./coverage.xml
|
|
```
|
|
|
|
## Configuration Files
|
|
|
|
```ini
|
|
# pytest.ini
|
|
[pytest]
|
|
testpaths = tests
|
|
python_files = test_*.py
|
|
python_classes = Test*
|
|
python_functions = test_*
|
|
addopts =
|
|
-v
|
|
--strict-markers
|
|
--tb=short
|
|
--cov=myapp
|
|
--cov-report=term-missing
|
|
markers =
|
|
slow: marks tests as slow
|
|
integration: marks integration tests
|
|
unit: marks unit tests
|
|
e2e: marks end-to-end tests
|
|
```
|
|
|
|
```toml
|
|
# pyproject.toml
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py"]
|
|
addopts = [
|
|
"-v",
|
|
"--cov=myapp",
|
|
"--cov-report=term-missing",
|
|
]
|
|
|
|
[tool.coverage.run]
|
|
source = ["myapp"]
|
|
omit = ["*/tests/*", "*/migrations/*"]
|
|
|
|
[tool.coverage.report]
|
|
exclude_lines = [
|
|
"pragma: no cover",
|
|
"def __repr__",
|
|
"raise AssertionError",
|
|
"raise NotImplementedError",
|
|
]
|
|
```
|