پرش به محتویات

آزمون و کیفیت بک‌اند

تغییر فقط وقتی قابل 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 این کنترل‌ها را اجرا می‌کند:

  1. بررسی gofmt، goimports و Repository تمیز
  2. go mod tidy و go mod verify
  3. go vet ./... و golangci-lint
  4. Test واحد Query Mapping و Integration Test با PostgreSQL واقعی برای SQL، Scan، Constraint و Transaction
  5. Unit و Integration Test
  6. go test -race ./...
  7. govulncheck ./...، Secret Scan و Scan Image در صورت ساخت
  8. Build Binary و Docker Image
  9. 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 نامحدود وجود ندارد.

منابع رسمی