آزمون و کیفیت بکاند
تغییر فقط وقتی قابل Merge است که رفتار موفق، خطا، امنیت و سازگاری آن بهصورت تکرارپذیر اثبات شود. Coverage یک Signal است و جای سناریوی درست یا Assertion معنادار را نمیگیرد.
سطوح آزمون
| سطح | هدف | ابزار پایه |
|---|---|---|
| Unit | Invariant، Value Object و Use Case خالص | testing و Fakeهای کوچک |
| Component | Handler یا Worker با Adapterهای کنترلشده | httptest و Test Double |
| Integration | PostgreSQL، Migration، RLS، MinIO و Query واقعی | Containerهای نسخه Pinشده |
| Contract | OpenAPI، Provider Adapter و Webhook | Fixture بدون PII و Mock Server |
| End-to-end | جریانهای حیاتی محدود | محیط Development ایزوله |
| Load و Resilience | بودجه Performance و رفتار Failure | k6 و Fault Injection کنترلشده |
بیشترین آزمونها Unit و Integration هستند. E2E فقط جریانهای پرریسک مانند ورود، عضویت، پرداخت، Ticket و دسترسی فایل را پوشش میدهد تا کندی و Flakiness کنترل شود.
قواعد آزمون Go
- آزمون Deterministic و مستقل از ترتیب، Timezone سیستم و شبکه واقعی است.
- Table-driven Test فقط وقتی چند Case واقعا ساختار مشترک دارند استفاده میشود.
- Assertion شکست را با ورودی، انتظار و نتیجه قابل فهم گزارش میکند.
t.Parallel()فقط وقتی State مشترک، Database مشترک یا Race ایجاد نمیکند مجاز است.- زمان با Clock تزریقشده و Random با Generator امن در Production و Seed کنترلشده در Test مدیریت میشود.
- Golden File کوچک، قابل Review و دارای دلیل است؛ Update خودکار آن بدون بررسی Diff ممنوع است.
- Mock فقط Interaction مهم در مرز را میسنجد؛ جزئیات پیادهسازی داخلی Mock نمیشوند.
آزمون داده و Tenant
- Migration از Database خالی و Upgrade از Snapshot نسخه قبلی آزمایش میشود.
- Repository با PostgreSQL واقعی و نسخه Major Production تست میشود؛ SQLite جایگزین قابل قبول نیست.
- برای هر Table Tenant-scoped آزمون Read، Write، Update و Delete Cross-tenant وجود دارد.
- Constraint، Concurrent Update، Deadlock/Serialization Retry و Idempotency با Race واقعی آزمون میشوند.
- Queryهای حساس با Dataset نماینده و Plan قابل انتظار Benchmark میشوند.
- Test Data Builder از شناسه و داده ساختگی استفاده میکند و Dump Production وارد Repository نمیشود.
آزمون امنیت
- OTP و Refresh Rotation آزمون همزمانی، Replay، Expiry، Rate Limit و Reuse Detection دارند.
- Permissionهای حساس حداقل Caseهای Allow، Deny، Role منقضی، Membership غیرفعال و Cross-tenant دارند.
- Parserهای ورودی، Cursor، Webhook، Upload metadata و فرمت موبایل Fuzz میشوند.
- Secret Scanning، SAST، Dependency Scan، Container Scan و
govulncheckدر CI اجرا میشوند. - Finding بحرانی یا بالا بدون استثنای زماندار و تایید Security مانع Merge یا Deploy است.
Coverage
- Patch نباید Coverage Package تغییرکرده را کاهش دهد مگر با توضیح Reviewer.
- هدف اولیه Packageهای Domain و Application حداقل 80 درصد Statement Coverage است.
- مسیرهای امنیتی و مالی حیاتی باید تمام Branchهای کسبوکار شناختهشده را با Test صریح پوشش دهند؛ عدد Coverage بهتنهایی کافی نیست.
- Generated Code، Migration و Glue ساده میتوانند از محاسبه هدف خارج شوند، اما رفتارشان با Integration Test پوشش داده میشود.
Gateهای Pull Request
CI Pull Request بهترتیب Fail-fast این کنترلها را اجرا میکند:
- بررسی
gofmt،goimportsو Repository تمیز go mod tidyوgo mod verifygo vet ./...وgolangci-lint- Test واحد Query Mapping و Integration Test با PostgreSQL واقعی برای SQL،
Scan، Constraint و Transaction - Unit و Integration Test
go test -race ./...govulncheck ./...، Secret Scan و Scan Image در صورت ساخت- Build Binary و Docker Image
- Lint و Breaking Change قرارداد OpenAPI
تغییر HTTP Router یا Middleware علاوه بر Gateهای بالا باید Contract Test مسیر موفق، 404، 405، Panic Recovery، Request ID، Security Header، Body Limit، Timeout و Route Template کمCardinality را پاس کند.
ابزارها با Version کامل Pin میشوند. Actionهای GitHub با SHA کامل Pin و Permission Workflow حداقلی تعریف میشوند.
آزمون Performance و Resilience
- Baseline پیش از Optimization ثبت میشود و هر تغییر Performance با
benchstatیا گزارش k6 مقایسه میشود. - Dataset شامل تعداد واقعی Tenant، Row، Permission و تاریخچه نزدیک افق ششماهه است.
- Load Test p50، p95، p99، Error Rate، Saturation، Connection و Queue Age را ثبت میکند.
- سناریوهای Provider کند، قطع PostgreSQL، Worker Crash، GHCR ناپایدار و Object Storage Timeout در محیط غیرProduction تمرین میشوند.
- تست شبکه Client شامل Latency بالا، Bandwidth کم، قطع و وصل و Retry تکراری است.
- نتیجه آزمون Performance با تاریخ، Commit، محیط، داده و Threshold در Artifact CI نگهداری میشود.
مدیریت Flaky Test
- Retry خودکار برای پنهان کردن Flake مسیر عادی نیست.
- Test Flaky با Issue، مالک و Deadline کوتاه Quarantine میشود و Critical Path را بدون جایگزین مسدود نگه میدارد.
- علت در Time، Port، Shared State، Ordering یا Dependency پیدا و ثبت میشود.
- نرخ Flake خود CI Metric دارد.
معیار پذیرش
- تمام Gateهای PR سبز و Artifactها قابل بازتولید هستند.
- Test بدون دسترسی به Production، Secret واقعی یا اینترنت عمومی اجرا میشود.
- سناریوهای Tenant، Auth، مالی و Idempotency پوشش صریح دارند.
- تغییر Performance بودجههای مصوب را نقض نمیکند.
- Flaky Test پنهان یا Retry نامحدود وجود ندارد.