ð§Š Testing Strategy & Guidelines (āļāļđāđāļĄāļ·āļāđāļĨāļ°āđāļāļ§āļāļēāļāļĢāļ°āļāļāļāļēāļĢāļĢāļąāļāđāļāļŠāļāļāļŠāļāļ)
This document outlines the testing levels, methodologies, frameworks, and requirements for the SplitDee backend (FastAPI) and frontend (Flutter).
āđāļāļāļŠāļēāļĢāļāļđāđāļĄāļ·āļāļĢāļ°āđāļāļĩāļĒāļāļāļēāļĢāļāļąāļāļāļģāđāļāļŠāļāļāļŠāļāļ āļāļāļāđāļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļēāļĢāđāļāļĩāļĒāļāđāļāđāļ āđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļĢāļ§āļāļŠāļāļāļāļļāļāļ āļēāļāļŠāļģāļŦāļĢāļąāļāļŦāļāđāļēāļāđāļēāļ Flutter āđāļĨāļ°āļŦāļĨāļąāļāļāđāļēāļ FastAPI
ðđð āļ āļēāļĐāļēāđāļāļĒ (āļŠāļģāļŦāļĢāļąāļāļāļđāđāđāļāđāļāļēāļ)
1. āļĨāļģāļāļąāļāļāļĩāļĢāļ°āļĄāļīāļāļāļēāļĢāļāļāļŠāļāļ (Testing Pyramid)
āđāļĢāļēāļĒāļķāļāđāļĒāļāļāļēāļĢāļ§āļēāļāđāļāļŠāļāļāļŠāļāļāļāļēāļĄāđāļāļāļāđāļāļ§āļēāļĄāļŠāļĄāļāļļāļĨāļŠāļēāļāļĨāđāļāļ·āđāļāļāļĢāļ°āļŦāļĒāļąāļāđāļ§āļĨāļēāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāđāļĨāļ°āđāļāđāļāļļāļāļ āļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļŠāļđāļāļŠāļļāļ:
- Unit Tests (āļāļēāļāļāļĩāļĢāļ°āļĄāļīāļ - āļāļĢāļāļāļāļĨāļļāļĄāļŠāļđāļāļŠāļļāļ): āļāļĢāļ§āļāļŠāļāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļģāļŠāļąāđāļāļāļĢāļĢāļāļ°āļĢāļēāļĒāļāļąāļāļāđāļāļąāļāļĒāđāļāļĒāđāļāļĩāđāļĒāļ§āđ (āđāļāđāļ āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļĻāļāļīāļĒāļĄāļŦāļēāļĢāđāļāļīāļ, āļāđāļāļĄāļđāļĨāđāļāļāļāļīāļāļĩ, Riverpod models)
- Integration Tests (āđāļāļāļāļĨāļēāļ): āļāļĢāļ§āļāļŠāļāļāļāļēāļĢāļāļģāļāļļāļĢāļāļĢāļĢāļĄāļĢāđāļ§āļĄāļāļąāļāļāđāļēāļĄāđāļĄāļāļđāļĨ (āđāļāđāļ āļāļĢāļ§āļāļŠāļāļāļāļ§āļēāļĄāļāļđāļāļāđāļāļāļāļāļāđāļĄāļāļđāļĨ API, āļāļēāļĢāļāļąāļāļāļķāļāļĨāļāļāļēāļĢāļēāļāļāļĢāļīāļ)
- E2E / UI Tests (āļĒāļāļāļāļĩāļĢāļ°āļĄāļīāļ): āļāļĢāļ§āļāļŠāļāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļēāļĢāļāļīāļĄāļāđāđāļŠāļāļāļĢāļđāļāļŠāļĨāļīāļāļāļēāļāļŦāļāđāļēāļāļāļĄāļ·āļāļāļ·āļāļāļĢāļīāļāļāļ°āļĨāļļāđāļāļŦāļēāļŦāļĨāļąāļāļāđāļēāļ
2. āļĒāļļāļāļāļĻāļēāļŠāļāļĢāđāļāļēāļĢāļāļāļŠāļāļāļŦāļĨāļąāļāļāđāļēāļ (FastAPI Backend)
- Unit Testing: āļāļĢāļ§āļāļāļĢāļĢāļāļ°āļĢāļ°āļāļāļŦāđāļēāļĄāđāļāļ·āđāļāļĄāđāļāđāļāļŦāļĢāļ·āļāļāļīāļ§āļĢāļĩāđāļāļŠāđāļāđāļāļāļēāļ āļāļĢāļīāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļ āļēāļĒāļāļāļ (āđāļāđāļ S3 āļŦāļĢāļ·āļ FCM āđāļāđāļāđāļāļ·āļāļ āļŦāļĢāļ·āļ API āļāļāļēāļāļēāļĢ) āļāđāļāļāđāļāļĩāļĒāļāđāļāđāļāļāļģāļĨāļāļāļāļķāđāļāļĄāļēāļŦāļĨāļāļ (Mocked) āđāļŠāļĄāļāđāļāļ·āđāļāļāļ§āļēāļĄāđāļ§āđāļāļāļēāļĢāđāļāļŠ
- Integration Testing: āđāļāđāļāļēāļāļāđāļāļĄāļđāļĨāļāļāļŠāļāļ PostgreSQL āđāļĒāļāļāļđāđ āđāļĨāļ°āđāļāđ Alembic āļāļģāļāļēāļĢāđāļĄāđāļāļĢāļāļąāļāļāļēāļĢāļēāļāļāļāļĨāļāļāđāļāļĩāļĒāļāļāļĢāļīāļ āđāļāļĒāļĢāļąāļāđāļāđāļāļāļīāļāļē Transaction Rollback Pattern (āļāļ·āļāđāļāļŠāđāļŠāļĢāđāļāļŠāļąāđāļāļĒāļāđāļĨāļīāļāļĢāļēāļĒāļāļēāļĢāđāļāļĩāļĒāļāļĒāđāļāļāļŦāļĨāļąāļ 100%) āđāļāļ·āđāļāļāļāļāļ§āļēāļĄāļŠāļ°āļāļēāļāļāļāļāđāļāļŠāļāđāļāļāđāļāļŠāļŦāļąāļ§āļāđāļāļāļąāļāđāļ
- āļāļēāļĢāļāļģāļĨāļāļāđāļāļāđāļ§āļĒāđāļ āļēāļĒāļāļāļ: Mock āļŠāļąāļāļāļēāļ SlipOK āđāļāļāđāļ§āļĒāđāļāļĢāļ§āļāļŠāļĨāļīāļ āđāļĨāļ°āļāļāļĢāđāļ FCM āđāļāļ·āđāļāļāļĢāļ§āļāļāļēāļāđāļāļĢāļāļŠāļĢāđāļēāļ JSON
- āļāļģāļŠāļąāđāļāļĢāļąāļāļĢāļ°āļāļāļāļāļŠāļāļāļŦāļĨāļąāļāļāđāļēāļ:
cd backend && pytest --cov=app tests/
3. āļĒāļļāļāļāļĻāļēāļŠāļāļĢāđāļāļēāļĢāļāļāļŠāļāļāļŦāļāđāļēāļāđāļēāļ (Flutter Client)
- Unit Testing: āļāļĢāļ§āļāļāļēāļāļāļ§āļēāļĄāļāļđāļāļāđāļāļ Riverpod Providers, āļāļąāļ§āđāļāļĨāļāļāđāļāļĄāļđāļĨ JSON āđāļĨāļ°āļāļēāļĢāļāļģāļāļ§āļāļŠāđāļ§āļāļŦāļāļĩāđāļāļāļ Mochi
- Widget Testing: āļāļĢāļ§āļāļāļāļāđāļāļĢāļ°āļāļāļ UI āļāļāļŦāļāđāļēāļāļ (āđāļāđāļ āļāļāļ°āđāļāļĢāļ·āđāļāļāđāļŠāļāļāļŠāļĨāļīāļ āļāļļāđāļĄāļāļāļŦāđāļēāļĄāļāļāļĢāļąāļ§āļāđāļģ, āļāļēāļĢāļāļīāđāļāļāļđāļāđāļŠāļāļ confetti āļāđāļēāļĒāļŠāļĩāđāļāļĩāļĒāļ§āđāļĄāļ·āđāļāļāļģāļĢāļ°āđāļŠāļĢāđāļ)
- E2E Integration Testing: āđāļāđāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļĢāļ§āļāļŠāļāļāļāļģāļĨāļāļ E2E (āđāļāđāļ Patrol āļŦāļĢāļ·āļ native flutter_test) āļāļāļŠāđāļāļŠāđāļĨāļāđāļāļāđāļŠāļĄāļ·āļāļāļāļĢāļīāļ
- āļāļģāļŠāļąāđāļāļĢāļąāļāļĢāļ°āļāļāļāļāļŠāļāļāļŦāļāđāļēāļāđāļēāļ:
cd frontend && flutter test
4. āđāļāļāļāđāļāļēāļĢāļāļąāļāļāļĢāļāļāļāļ§āļēāļĄāļŠāļ°āļāļēāļāđāļĨāļ°āđāļāļ§āļāđāļē CI/CD
- āđāļāļāļāđāļāļąāđāļāļāđāļģāļāļ§āļēāļĄāļāļĢāļāļāļāļĨāļļāļĄāļĢāļŦāļąāļŠ (Code Coverage Gate): Pull Request āļāļĩāđāļāļāļāļ§āļāļĢāļ§āļĄāđāļāđāļēāļāļīāđāļ main āļāđāļāļāļĄāļĩāļĢāļŦāļąāļŠāļāđāļēāļāđāļāļŠāļāļāļŠāļāļāļāļĢāļāļāļāļĨāļļāļĄāļāļąāļ§āđāļāļĢāđāļāļĢāļĄ Use Case āđāļĨāļ°āđāļāđāļĄāļāļŦāļĨāļąāļāļāļĒāđāļēāļāļāđāļāļĒ 80% āđāļāđāļāļŠāļģāļāļąāļ āļŦāļēāļāļāļāļŠāļāļāđāļĄāđāļāđāļēāļāļŦāļĢāļ·āļāļĢāļŦāļąāļŠāđāļāļŠāļāđāļģāļāļ§āđāļēāđāļāļāļāđāļāļ°āļāļđāļāļāļĨāđāļāļāļāļēāļĢ Merge āļāļąāļāļāļĩāđāļāļ·āđāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļŠāļēāļāļĨ
ðŽð§ English (For AI Agents)
1. Testing Pyramid
- Unit Tests: Fast, isolated tests verifying core math equations, domain entities, and Riverpod models.
- Integration Tests: Verifies database connections, API payloads, and query boundaries.
- E2E / UI Tests: Simulates full screen transitions, slip uploads, and backend integration.
2. Backend Testing Strategy (FastAPI)
- Unit Testing: Isolated tests in
backend/tests/unit/. Assumes zero database or network access. All external dependencies (S3, FCM, SlipOK) must be mocked. - Integration Testing: Runs against a dedicated PostgreSQL test container migrated via Alembic before execution. Uses the Transaction Rollback Pattern to ensure test independence.
- Mocking Strategy: Uses
pytest-mockorresponsesto stub external APIs (SlipOK) and the Firebase Admin SDK. - Command:
cd backend && pytest --cov=app tests/
3. Frontend Testing Strategy (Flutter)
- Unit Testing: Tests state controllers, Riverpod providers, and JSON deserialization. API clients are mocked via
mockitoormocktail. - Widget Testing: Verifies specific visual states (loading spinners during OCR scan, disabled buttons, settled color codes).
- Integration Testing: Uses
patrolor nativeflutter_testintegration packages to simulate full multi-screen user journeys. - Command:
cd frontend && flutter test
4. Test Coverage & CI Gates
- Code Coverage Gate: Mandatory minimum 80% test coverage on core business logic (use cases and domain repositories).
- CI Workflow: GitHub Actions runs backend/frontend linters, executes unit/integration tests, and blocks merge requests on coverage drops or failures.