الزامات تست
در این سند
فلسفه تست
تیم ما بر این باور است که تست جامع برای نگهداری یک پایگاه کد قابل اعتماد و با کیفیت بالا ضروری است. فلسفه تست ما بر اساس این اصول هدایت میشود:
- تست زودهنگام، تست مکرر: تستنویسی باید در سراسر فرآیند توسعه یکپارچه شود
- پوشش مناسب: کدهای مختلف به سطوح مختلفی از تستنویسی نیاز دارند
- اولویت با خودکارسازی: تا حد امکان تستها را خودکار کنید
- خوانایی تست: تستها باید واضح باشند و به عنوان مستندات عمل کنند
- بهبود مستمر: روشهای تست باید همگام با پایگاه کد تکامل یابند
انواع تستهای مورد نیاز
- تست واحد
- تست یکپارچگی
- تست API
- تست انتها به انتها
الزامات تست واحد (Unit Testing)
- هدف پوشش: حداقل 80% پوشش کد برای منطق کسبوکار
- فریمورک: PHPUnit برای PHP، Jest برای JavaScript
- محدوده: کلاسها و توابع مجزا
- ایزولهسازی: استفاده از mock و stub برای ایزوله کردن واحد تحت تست
- قرارداد نامگذاری:
test[نام متد]_[سناریو]_[نتیجهموردانتظار]
مثال تست واحد:
public function testCalculateTotal_WithValidItems_ReturnsCorrectSum()
{
// Arrange
$calculator = new PriceCalculator();
$items = [
['price' => 10, 'quantity' => 2],
['price' => 15, 'quantity' => 1],
];
// Act
$result = $calculator->calculateTotal($items);
// Assert
$this->assertEquals(35, $result);
}
الزامات تست یکپارچگی (Integration Testing)
- پوشش: تمام تعاملات سرویسها و عملیات پایگاه داده
- فریمورک: PHPUnit با وابستگیهای واقعی
- پایگاه داده: از پایگاه داده تست با میگریشنها استفاده کنید
- API: نقاط انتهایی API داخلی را تست کنید
- محدوده: تعاملات اجزا در داخل سیستم
تستهای یکپارچگی باید موارد زیر را تأیید کنند:
- کوئریها و تراکنشهای پایگاه داده
- همکاریهای سرویس
- مدیریت رویدادها
- تعاملات کش
- عملیات سیستم فایل
الزامات تست API
- پوشش: 100% نقاط انتهایی عمومی API
- فریمورک: PHPUnit با ابزارهای تست Laravel
- احراز هویت: با نقشهای مختلف کاربری تست شود
- اعتبارسنجی: اعتبارسنجی ورودی و پاسخهای خطا را تست کنید
- قالب پاسخ: ساختار و محتوای پاسخ را تأیید کنید
مثال تست API:
public function testGetUser_WithValidId_ReturnsUserData()
{
// Arrange
$user = User::factory()->create();
// Act
$response = $this->getJson("/api/users/{$user->id}");
// Assert
$response->assertStatus(200)
->assertJsonStructure([
'data' => [
'id', 'name', 'email', 'created_at'
]
])
->assertJson([
'data' => [
'id' => $user->id,
'name' => $user->name,
]
]);
}
الزامات تست انتها به انتها (End-to-End Testing)
- پوشش: گردشهای حیاتی کاربر و فرآیندهای کسبوکار
- فریمورک: Cypress برای برنامههای تحت وب
- تناوب: اجرا در محیط Staging قبل از هر انتشار
- محدوده: سفرهای کامل کاربر از ابتدا تا انتها
- پشتیبانی مرورگر: در Chrome، Firefox و Safari تست شود
گردشهای کلیدی کاربر برای تست:
- ثبتنام و احراز هویت کاربر
- تراکنشهای اصلی کسبوکار
- پردازش پرداخت
- تولید گزارش
- عملکردهای مدیریتی
راهاندازی محیط تست
محیط تست محلی
- از Docker برای محیطهای تست یکنواخت استفاده کنید
- پایگاه داده تست جداگانه پیکربندی کنید
- دادههای تست را با استفاده از factoryها بارگذاری کنید
- از پیکربندی
.env.testingاستفاده کنید - وضعیت را بین اجراهای تست بازنشانی کنید
محیط تست CI
- تستها را در هر pull request اجرا کنید
- از GitHub Actions یا سرویس CI مشابه استفاده کنید
- روی نسخههای مختلف PHP/Node.js تست کنید
- وابستگیها را برای افزایش سرعت ساخت کش کنید
- گزارشهای تست را تولید و ذخیره کنید
مدیریت دادههای تست
اصول دادههای تست
- از factoryها برای تولید دادههای تست استفاده کنید
- برای موارد خاص، دادههای خاص ایجاد کنید
- پس از تستها، دادههای تست را پاک کنید
- به وضعیت موجود پایگاه داده وابسته نباشید
- از دادههای واقعی اما بینامشده استفاده کنید
استفاده از Factory
// مثالی از استفاده از factoryها برای دادههای تست
public function testUserList_WithMultipleUsers_ReturnsPaginatedResults()
{
// ایجاد 25 کاربر تست
User::factory()->count(25)->create();
// Act
$response = $this->getJson('/api/users?page=1&per_page=10');
// Assert
$response->assertStatus(200)
->assertJsonCount(10, 'data')
->assertJsonPath('meta.total', 25)
->assertJsonPath('meta.last_page', 3);
}
استانداردهای تست
ساختار تست
همه تستها باید از الگوی Arrange-Act-Assert (AAA) پیروی کنند:
- Arrange: شرایط تست را آماده کنید
- Act: عملیات مورد تست را انجام دهید
- Assert: نتیجه مورد انتظار را تأیید کنید
نامگذاری تست
- از نامهای توصیفی که هدف تست را توضیح میدهند استفاده کنید
- از الگوی:
test[نام متد]_[سناریو]_[نتیجهموردانتظار]پیروی کنید - مثالها:
testLogin_WithValidCredentials_RedirectsToDashboardtestCalculateTotal_WithNegativeValues_ThrowsException
سازماندهی تست
- تستهای مرتبط را در کلاسهای تست گروهبندی کنید
- ساختار برنامه را در سازماندهی تست منعکس کنید
- از مجموعههای تست برای دستهبندی تستها استفاده کنید
- تستهای کند را از تستهای سریع جدا کنید
پوشش کد
اهداف پوشش
- منطق کسبوکار: حداقل 80% پوشش
- کنترلرها: حداقل 90% پوشش
- مدلها: حداقل 70% پوشش
- ابزارها: حداقل 90% پوشش
گزارش پوشش
- گزارشهای پوشش را در خط لوله CI تولید کنید
- پوشش را در pull requestها بررسی کنید
- روند پوشش را در طول زمان پیگیری کنید
- شکافهای پوشش در مناطق حیاتی را برطرف کنید
توسعه مبتنی بر تست (TDD)
هنگام اجرای TDD، از این گردش کار پیروی کنید:
- یک تست ناموفق برای قابلیت مورد نیاز بنویسید
- حداقل کد لازم برای موفقیت تست را پیادهسازی کنید
- کد را بازسازی کنید در حالی که تستها همچنان موفق باشند
- برای قطعه بعدی قابلیت تکرار کنید
تست کدهای قدیمی
برای کدهای قدیمی بدون تست:
- قبل از ایجاد تغییرات، تست اضافه کنید
- ابتدا بر تستهای مشخصهسازی تمرکز کنید
- به تدریج با هر تغییر، پوشش را بهبود بخشید
- تستنویسی را بر اساس ریسک و تناوب تغییرات اولویتبندی کنید
تست کارایی
انواع تست کارایی
- تست بار (Load Testing): رفتار سیستم را تحت بار مورد انتظار تأیید کنید
- تست فشار (Stress Testing): نقاط شکست را تحت بار شدید پیدا کنید
- تست استقامت (Endurance Testing): مشکلات را در طول دورههای طولانی بررسی کنید
- تست اوج (Spike Testing): افزایش ناگهانی بار را تست کنید
معیارهای کارایی
- زمان پاسخ
- توان عملیاتی
- نرخ خطا
- استفاده از منابع
- کارایی کوئریهای پایگاه داده
تست امنیت
این تستهای امنیتی را شامل کنید:
- اعتبارسنجی و پاکسازی ورودی
- احراز هویت و مجوزدهی
- جلوگیری از تزریق SQL
- جلوگیری از اسکریپتنویسی بین سایتی (XSS)
- محافظت CSRF
- امنیت API
مستندسازی تست
هر مجموعه تست باید شامل موارد زیر باشد:
- هدف تستها
- الزامات راهاندازی
- وابستگیهای داده
- نتایج مورد انتظار
- محدودیتهای شناخته شده
بهبود مستمر
به طور منظم روشهای تست را بررسی و بهبود دهید:
- الگوهای شکست تست را تحلیل کنید
- تستهای شکننده یا ناپایدار را بازسازی کنید
- هنگام تغییر الزامات، تستها را بهروز کنید
- دانش تست را در سراسر تیم به اشتراک بگذارید
- با ابزارها و رویکردهای جدید تست آزمایش کنید