پرش به مطلب اصلی

الزامات تست

در این سند

فلسفه تست

تیم ما بر این باور است که تست جامع برای نگهداری یک پایگاه کد قابل اعتماد و با کیفیت بالا ضروری است. فلسفه تست ما بر اساس این اصول هدایت می‌شود:

  1. تست زودهنگام، تست مکرر: تست‌نویسی باید در سراسر فرآیند توسعه یکپارچه شود
  2. پوشش مناسب: کدهای مختلف به سطوح مختلفی از تست‌نویسی نیاز دارند
  3. اولویت با خودکارسازی: تا حد امکان تست‌ها را خودکار کنید
  4. خوانایی تست: تست‌ها باید واضح باشند و به عنوان مستندات عمل کنند
  5. بهبود مستمر: روش‌های تست باید همگام با پایگاه کد تکامل یابند

انواع تست‌های مورد نیاز

الزامات تست واحد (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);
}

راه‌اندازی محیط تست

محیط تست محلی

  • از 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) پیروی کنند:

  1. Arrange: شرایط تست را آماده کنید
  2. Act: عملیات مورد تست را انجام دهید
  3. Assert: نتیجه مورد انتظار را تأیید کنید

نام‌گذاری تست

  • از نام‌های توصیفی که هدف تست را توضیح می‌دهند استفاده کنید
  • از الگوی: test[نام متد]_[سناریو]_[نتیجه‌موردانتظار] پیروی کنید
  • مثال‌ها:
    • testLogin_WithValidCredentials_RedirectsToDashboard
    • testCalculateTotal_WithNegativeValues_ThrowsException

سازماندهی تست

  • تست‌های مرتبط را در کلاس‌های تست گروه‌بندی کنید
  • ساختار برنامه را در سازماندهی تست منعکس کنید
  • از مجموعه‌های تست برای دسته‌بندی تست‌ها استفاده کنید
  • تست‌های کند را از تست‌های سریع جدا کنید

پوشش کد

اهداف پوشش

  • منطق کسب‌وکار: حداقل 80% پوشش
  • کنترلرها: حداقل 90% پوشش
  • مدل‌ها: حداقل 70% پوشش
  • ابزارها: حداقل 90% پوشش

گزارش پوشش

  • گزارش‌های پوشش را در خط لوله CI تولید کنید
  • پوشش را در pull requestها بررسی کنید
  • روند پوشش را در طول زمان پیگیری کنید
  • شکاف‌های پوشش در مناطق حیاتی را برطرف کنید

توسعه مبتنی بر تست (TDD)

هنگام اجرای TDD، از این گردش کار پیروی کنید:

  1. یک تست ناموفق برای قابلیت مورد نیاز بنویسید
  2. حداقل کد لازم برای موفقیت تست را پیاده‌سازی کنید
  3. کد را بازسازی کنید در حالی که تست‌ها همچنان موفق باشند
  4. برای قطعه بعدی قابلیت تکرار کنید

تست کدهای قدیمی

برای کدهای قدیمی بدون تست:

  1. قبل از ایجاد تغییرات، تست اضافه کنید
  2. ابتدا بر تست‌های مشخصه‌سازی تمرکز کنید
  3. به تدریج با هر تغییر، پوشش را بهبود بخشید
  4. تست‌نویسی را بر اساس ریسک و تناوب تغییرات اولویت‌بندی کنید

تست کارایی

انواع تست کارایی

  • تست بار (Load Testing): رفتار سیستم را تحت بار مورد انتظار تأیید کنید
  • تست فشار (Stress Testing): نقاط شکست را تحت بار شدید پیدا کنید
  • تست استقامت (Endurance Testing): مشکلات را در طول دوره‌های طولانی بررسی کنید
  • تست اوج (Spike Testing): افزایش ناگهانی بار را تست کنید

معیارهای کارایی

  • زمان پاسخ
  • توان عملیاتی
  • نرخ خطا
  • استفاده از منابع
  • کارایی کوئری‌های پایگاه داده

تست امنیت

این تست‌های امنیتی را شامل کنید:

  • اعتبارسنجی و پاکسازی ورودی
  • احراز هویت و مجوزدهی
  • جلوگیری از تزریق SQL
  • جلوگیری از اسکریپت‌نویسی بین سایتی (XSS)
  • محافظت CSRF
  • امنیت API

مستندسازی تست

هر مجموعه تست باید شامل موارد زیر باشد:

  • هدف تست‌ها
  • الزامات راه‌اندازی
  • وابستگی‌های داده
  • نتایج مورد انتظار
  • محدودیت‌های شناخته شده

بهبود مستمر

به طور منظم روش‌های تست را بررسی و بهبود دهید:

  • الگوهای شکست تست را تحلیل کنید
  • تست‌های شکننده یا ناپایدار را بازسازی کنید
  • هنگام تغییر الزامات، تست‌ها را به‌روز کنید
  • دانش تست را در سراسر تیم به اشتراک بگذارید
  • با ابزارها و رویکردهای جدید تست آزمایش کنید