يوضح هذا الدليل كيفية استخدام خيار 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-" بشكل متزامن:
toml
[test]
# تشغيل جميع ملفات الاختبار ذات البادئة "concurrent-" بشكل متزامن
concurrentTestGlob = "**/concurrent-*.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 تعمل تلقائيًا بشكل متزامن:
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الفوائد
- ترحيل تدريجي: ترحيل إلى الاختبارات المتزامنة ملفًا بملف عن طريق إعادة تسميتها
- تنظيم واضح: اصطلاح تسمية الملفات يشير إلى وضع التنفيذ
- الأداء: اختبارات التكامل تعمل بشكل أسرع بشكل متوازٍ
- الأمان: اختبارات الوحدة تظل متسلسلة عند الحاجة
- المرونة: من السهل تغيير وضع التنفيذ عن طريق إعادة تسمية الملفات
استراتيجية الترحيل
لترحيل الاختبارات الحالية إلى التنفيذ المتزامن:
- ابدأ باختبارات التكامل المستقلة - هذه عادةً لا تشارك الحالة
- أعد تسمية الملفات لتطابق نمط glob:
mv api.test.ts concurrent-api.test.ts - تحقق من نجاح الاختبارات - شغّل
bun testللتأكد من عدم وجود ظروف سباق - راقب مشاكل الحالة المشتركة - ابحث عن الاختبارات المتقلبة أو الإخفاقات غير المتوقعة
- استمر في ترحيل الاختبارات المستقرة تدريجيًا - لا تستعجل الترحيل
نصائح
- استخدم بادئات وصفية:
concurrent-،parallel-،async- - احتفظ بالاختبارات المتسلسلة ذات الصلة معًا في نفس الدليل
- وثق سبب ضرورة بقاء اختبارات معينة متسلسلة مع التعليقات
- استخدم
test.concurrent()للتحكم الدقيق في الملفات المتسلسلة (ملاحظة: في الملفات التي يطابقهاconcurrentTestGlob، يعملtest()العادي بالفعل بشكل متزامن)
أنماط متعددة
يمكنك تحديد أنماط متعددة لفئات الاختبار المختلفة:
toml
[test]
concurrentTestGlob = [
"**/integration/*.test.ts",
"**/e2e/*.test.ts",
"**/concurrent-*.test.ts"
]هذا التكوين سيشغل الاختبارات بشكل متزامن إذا طابقت أيًا من هذه الأنماط:
- جميع الاختبارات في أدلة
integration/ - جميع الاختبارات في أدلة
e2e/ - جميع الاختبارات ذات البادئة
concurrent-في أي مكان في المشروع