Skip to content

يوضح هذا الدليل كيفية استخدام خيار concurrentTestGlob لتشغيل الاختبارات بشكل انتقائي بشكل متزامن بناءً على أنماط تسمية الملفات.

هيكل المشروع

هيكل المشروع
sh
my-project/
├── bunfig.toml
├── tests/
   ├── unit/
   ├── math.test.ts          # متسلسل
   └── utils.test.ts         # متسلسل
   └── integration/
       ├── concurrent-api.test.ts     # متزامن
       └── concurrent-database.test.ts # متزامن

التكوين

قم بتكوين bunfig.toml الخاص بك لتشغيل ملفات الاختبار التي تحتوي على البادئة "concurrent-" بشكل متزامن:

bunfig.toml
toml
[test]
# تشغيل جميع ملفات الاختبار ذات البادئة "concurrent-" بشكل متزامن
concurrentTestGlob = "**/concurrent-*.test.ts"

ملفات الاختبار

اختبار الوحدة (متسلسل)

الاختبارات المتسلسلة جيدة للاختبارات التي تشارك الحالة أو لديها متطلبات ترتيب محددة:

tests/unit/math.test.ts
ts
import { test, expect } from "bun:test";

// هذه الاختبارات تعمل بشكل متسلسل افتراضيًا
let sharedState = 0;

test("الجمع", () => {
  sharedState = 5 + 3;
  expect(sharedState).toBe(8);
});

test("يستخدم الحالة السابقة", () => {
  // هذا الاختبار يعتمد على حالة الاختبار السابق
  expect(sharedState).toBe(8);
});

اختبار التكامل (متزامن)

الاختبارات في الملفات التي تطابق نمط glob تعمل تلقائيًا بشكل متزامن:

tests/integration/concurrent-api.test.ts
ts
import { test, expect } from "bun:test";

// هذه الاختبارات تعمل تلقائيًا بشكل متزامن بسبب تطابق اسم الملف مع concurrentTestGlob.
// استخدام test() يعادل test.concurrent() عندما يطابق الملف concurrentTestGlob.
// كل اختبار مستقل ويمكن تشغيله بشكل متوازٍ.

test("جلب بيانات المستخدم", async () => {
  const response = await fetch("/api/user/1");
  expect(response.ok).toBe(true);
});

// يمكن أيضًا استخدام test.concurrent() للتحديد صراحةً كمتزامن
test.concurrent("جلب المنشورات", async () => {
  const response = await fetch("/api/posts");
  expect(response.ok).toBe(true);
});

// يمكن أيضًا استخدام test.serial() للتحديد صراحةً كمتسلسل
test.serial("جلب التعليقات", async () => {
  const response = await fetch("/api/comments");
  expect(response.ok).toBe(true);
});

تشغيل الاختبارات

bash
# تشغيل جميع الاختبار - ملفات concurrent-*.test.ts ستعمل بشكل متزامن
bun test

# تجاوز: فرض تشغيل جميع الاختبارات بشكل متزامن
# ملاحظة: هذا يتجاوز bunfig.toml ويشغل جميع الاختبارات بشكل متزامن، بغض النظر عن glob
bun test --concurrent

# تشغيل اختبارات الوحدة فقط (متسلسلة)
bun test tests/unit

# تشغيل اختبارات التكامل فقط (متزامنة بسبب نمط glob)
bun test tests/integration

الفوائد

  1. ترحيل تدريجي: ترحيل إلى الاختبارات المتزامنة ملفًا بملف عن طريق إعادة تسميتها
  2. تنظيم واضح: اصطلاح تسمية الملفات يشير إلى وضع التنفيذ
  3. الأداء: اختبارات التكامل تعمل بشكل أسرع بشكل متوازٍ
  4. الأمان: اختبارات الوحدة تظل متسلسلة عند الحاجة
  5. المرونة: من السهل تغيير وضع التنفيذ عن طريق إعادة تسمية الملفات

استراتيجية الترحيل

لترحيل الاختبارات الحالية إلى التنفيذ المتزامن:

  1. ابدأ باختبارات التكامل المستقلة - هذه عادةً لا تشارك الحالة
  2. أعد تسمية الملفات لتطابق نمط glob: mv api.test.ts concurrent-api.test.ts
  3. تحقق من نجاح الاختبارات - شغّل bun test للتأكد من عدم وجود ظروف سباق
  4. راقب مشاكل الحالة المشتركة - ابحث عن الاختبارات المتقلبة أو الإخفاقات غير المتوقعة
  5. استمر في ترحيل الاختبارات المستقرة تدريجيًا - لا تستعجل الترحيل

نصائح

  • استخدم بادئات وصفية: concurrent-، parallel-، async-
  • احتفظ بالاختبارات المتسلسلة ذات الصلة معًا في نفس الدليل
  • وثق سبب ضرورة بقاء اختبارات معينة متسلسلة مع التعليقات
  • استخدم test.concurrent() للتحكم الدقيق في الملفات المتسلسلة (ملاحظة: في الملفات التي يطابقها concurrentTestGlob، يعمل test() العادي بالفعل بشكل متزامن)

أنماط متعددة

يمكنك تحديد أنماط متعددة لفئات الاختبار المختلفة:

bunfig.toml
toml
[test]
concurrentTestGlob = [
  "**/integration/*.test.ts",
  "**/e2e/*.test.ts",
  "**/concurrent-*.test.ts"
]

هذا التكوين سيشغل الاختبارات بشكل متزامن إذا طابقت أيًا من هذه الأنماط:

  • جميع الاختبارات في أدلة integration/
  • جميع الاختبارات في أدلة e2e/
  • جميع الاختبارات ذات البادئة concurrent- في أي مكان في المشروع

Bun بواسطة www.bunjs.com.cn تحرير