تست و دیباگ، دو ستون پنهان پروژه‌های وردپرسی موفق‌اند. تجربه‌ام: توسعه‌دهندگانی که این دو را جدی می‌گیرند، در شش ماه، بهره‌وری دو برابری دارند؛ چون دیگر وقت خود را صرف حدس و آزمون‌وخطا در پشتیبانی نمی‌کنند. خبر خوب اینکه وردپرس، ابزارهای تست و دیباگ جامعی دارد که اکثر توسعه‌دهندگان از آن‌ها غافل‌اند. این مقاله، چارچوب تست و دیباگ حرفه‌ای را از پایه مرور می‌کند. اگر با مفاهیم پایه آشنا نیستید، توسعهٔ افزونه از صفر، شروع اصولی کدنویسی، و محیط لوکال را پیش از ادامه ببینید.

چرا تست و دیباگ؟

سه دلیل عملی: یک — اطمینان در تغییرات. وقتی تست دارید، می‌توانید با اطمینان کد را تغییر دهید. دو — سرعت توسعه. در بلندمدت، تست‌ها زمان می‌خرند. سه — کاهش باگ در Production. تجربه‌ام: پروژه‌ای که ۲۰٪ کدش تست داشته باشد، در شش ماه، ۵۰٪ کمتر باگ در Production دارد. اصول کلی در ساختاربندی پروژه و استانداردهای کدنویسی.

تست، بیمه‌نامهٔ توسعه است؛ بدون آن، هر تغییر، یک قمار است.

سطوح تست

پنج سطح تست در وردپرس: یک — Unit Test. تست یک تابع یا کلاس به‌تنهایی. سریع، ولی نیاز به mock دارد. دو — Integration Test. تست تعامل کد با وردپرس. از WP_UnitTestCase. سه — Functional Test. تست تعامل کاربر با سایت. با Playwright، Cypress. چهار — Visual Regression. تست ظاهر بصری. پنج — Performance Test. تست سرعت و منابع. جدول انتخاب:

سطحمناسب برایابزار
Unitتوابع منطقی، بدون وابستگی به وردپرسPHPUnit
Integrationتعامل با وردپرس، DB، هوک‌هاWP_UnitTestCase
Functionalجریان‌های کاربریPlaywright, Cypress
Performanceسرعت و منابعJMeter, k6

ابزارهای تست

چهار ابزار اصلی در پروژه‌های وردپرسی: یک — PHPUnit. استاندارد تست PHP. دو — WP_UnitTestCase. کلاس مخصوص وردپرس که Unit Test را با هستهٔ وردپرس ادغام می‌کند. سه — WP-CLI. خط فرمان برای تست‌های سریع. چهار — Codeception. چارچوب تست‌های Functional. نصب و پیکربندی اولیه، در مستندات رسمی وردپرس آمده است.

PHPUnit و WP_UnitTestCase

نمونهٔ یک تست ساده:

class My_Plugin_Test extends WP_UnitTestCase {
    public function test_shortcode_output() {
        $output = do_shortcode( '[my_shortcode]' );
        $this->assertStringContainsString( '
', $output ); } public function test_meta_save() { $post_id = $this->factory()->post->create(); update_post_meta( $post_id, '_my_key', 'value' ); $this->assertEquals( 'value', get_post_meta( $post_id, '_my_key', true ) ); } }

سه نکته: یک — factory: برای ساخت داده‌های تست. دو — assert: متنوع، برای انواع بررسی. سه — تنظیمات: در phpunit.xml.dist با اتصال به DB تست. راهنمای تفصیلی در ساختاربندی پروژه و CI/CD در وردپرس.

دیباگ با Xdebug

Xdebug، ابزار حرفه‌ای دیباگ است. سه قابلیت: یک — Step Debugging: کد را خط به خط اجرا کنید، متغیرها را ببینید. دو — Stack Traces: مسیر خطا. سه — Profiling: زمان اجرای هر بخش کد. پیکربندی در php.ini:

xdebug.mode = debug,profile
xdebug.client_host = 127.0.0.1
xdebug.client_port = 9003
xdebug.start_with_request = yes

نکته: Xdebug روی Production غیرفعال باشد — بار اضافه دارد. تجربه‌ام: در پروژه‌ای با باگ پیچیده، Xdebug در چند دقیقه علت را نشان داد، در حالی که سه روز error_log و var_dump بی‌نتیجه مانده بود. راهنما در محیط لوکال.

دیباگ با لاگ

سه سطح لاگ در وردپرس: یک — WP_DEBUG. نمایش خطاهای PHP:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

خطاها در wp-content/debug.log. دو — error_log سفارشی. با error_log( print_r( $data, true ) ). سه — Query Monitor. برای دیباگ کوئری‌ها و هوک‌ها. الگوی دقیق در دیباگ کد سفارشی، رفع Fatal Error، و رفع Warning PHP.

دیباگ front-end

سه ابزار: یک — کنسول مرورگر. برای خطاهای JS. راهنما در پیدا کردن خطاهای JS در کنسول. دو — تب Network. برای درخواست‌های شبکه، حجم، ترتیب لود. سه — تب Performance. برای پروفایلینگ front-end و کشف گلوگاه‌های رندر. الگوی دقیق در ابزارهای تست سرعت و Core Web Vitals.

دیباگ عملکرد

سه ابزار: یک — Query Monitor: نشان می‌دهد کدام کوئری، کدام هوک، کدام افزونه، چقدر زمان می‌گیرد. دو — TTFB Monitoring: پایش زمان پاسخ سرور. سه — Slow Query Log در MySQL: کشف کوئری‌های کند. الگوی دقیق در تأثیر TTFB بر سرعت و بهینه‌سازی کوئری‌های MySQL.

تست در CI

اجرای تست‌ها در CI، تفاوت بین «تست تشویقی» و «تست اجرایی» است. الگوی GitHub Actions:

name: Tests
on: [push, pull_request]
jobs:
  phpunit:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8
        env:
          MYSQL_ROOT_PASSWORD: root
    steps:
      - uses: actions/checkout@v3
      - uses: shivammathur/setup-php@v2
        with: { php-version: '8.1' }
      - run: composer install
      - run: ./vendor/bin/phpunit

الگو در استانداردها در CI و CI/CD در وردپرس.

دید مهندسی

برای توسعه‌دهنده‌های سطح بالا، سه الگوی تست حرفه‌ای: یک — Test-Driven Development (TDD). ابتدا تست بنویسید، بعد کد. در وردپرس سخت‌تر از سایر پلتفرم‌ها، ولی مؤثر. دو — Fixtures و Factories. استفاده از factory وردپرس برای ساخت داده تست. سه — Mocking. برای تست کدی که به سرویس بیرونی وابسته است، از mock استفاده کنید. تجربه‌ام: در پروژه‌ای که endpointهای بیرونی داشت، mocking در تست، زمان CI را از ۱۵ دقیقه به ۲ دقیقه کاهش داد. الگوهای معماری در ساختاربندی پروژه و اتصال به سرویس‌های خارجی. یک نکته: در پروژه‌های بسیار بزرگ، تست Performance (با k6 یا JMeter) بخشی از CI است تا افت کارایی در مراحل اولیه کشف شود.

اشتباهات رایج

  • نبود تست Unit: تغییرات بعدی پر ریسک. ساختاربندی پروژه.
  • Xdebug روی Production: بار اضافه، کاهش سرعت. باید خاموش باشد.
  • نادیده‌گرفتن لاگ: خطاها بی‌صدا می‌مانند. دیباگ.
  • دیباگ با var_dump در Production: خطر افشا و شکست ظاهری.
  • نبود تست در CI: تست به‌صورت خودکار اجرا نمی‌شود. CI/CD.
  • نبود تست Performance: افت کارایی در Production. ابزارهای تست سرعت.
  • نادیده‌گرفتن تست E2E: باگ‌های UI در Production.
  • نبود محیط Staging برای دیباگ: کار روی Production، ریسک. محیط لوکال.

جمع‌بندی

تست و دیباگ در وردپرس، پنج سطح دارد: Unit، Integration، Functional، Visual، و Performance. ابزارها: PHPUnit، WP_UnitTestCase، Xdebug، Query Monitor، و Playwright. اگر امروز فقط یک کار می‌کنید: در پروژهٔ فعلی خود، یک Unit Test ساده برای یکی از توابع بنویسید و در CI اجرا کنید. همان اولین تجربه، درهای زیادی باز می‌کند. تجربهٔ خودتان از تست و دیباگ، در دیدگاه‌ها ارزشمند است. 🧪