🧪 ضمان الجودة

الاختبار المنهجية

137 اختبار end-to-end يتحقق من أن كل SQL مُولّد يطابق ناتج Prisma تمامًا

137
اختبارات E2E
التحقق من كل استعلام
100%
تغطية التطابق
تطابق حرفيًا (byte-for-byte)
2
محركات قواعد البيانات
PostgreSQL وSQLite
3
مقارنات ORM
Prisma v6/v7, Drizzle

كيف نتحقق من الصحة

يتبع كل اختبار عملية تحقق صارمة من 5 خطوات لضمان أن SQL المُولّد ينتج نفس نتائج Prisma

1

توليد SQL من استعلام Prisma

تحليل وسيطات استعلام Prisma وتوليد SQL مكافئ باستخدام نفس النماذج والمخطط. يستخدم SQL المُولّد استعلامات مُعلّمة بالمعاملات للأمان والأداء.

2

تنفيذ الاستعلامين بالتوازي

تشغيل SQL المُولّد مباشرة عبر postgres.js أو better-sqlite3 وتشغيل نفس الاستعلام عبر Prisma. كلاهما يضرب نفس حالة قاعدة البيانات.

3

تطبيع النتائج

معالجة اختلافات الأنواع (BigInt مقابل Number، دقة Decimal، تسلسل Date) وتطبيع ترتيب مفاتيح الكائن للمقارنة العادلة.

4

فحص مساواة عميق

التحقق من التطابق التام: نفس عدد الصفوف ونفس قيم الحقول ونفس العلاقات المتداخلة ونفس الترتيب. أي اختلاف يفشل الاختبار.

5

قياس الأداء

قياس زمن التنفيذ عبر 5 تشغيلات تمهيدية ثم متوسط 10–50 تكرارًا لكل اختبار. المقارنة مع Prisma v6 وPrisma v7 وDrizzle ORM.

تقنيات تحقق متقدمة

تطبيع أنواع البيانات

  • تحويل BigInt: JavaScript BigInt → Number للمقارنة
  • معالجة Decimal: Prisma Decimal → Float بدقة 10 أرقام
  • تطبيع التاريخ: كل قيم DateTime → null (التركيز على البيانات لا الطوابع الزمنية)
  • تحليل JSON: كشف وتحليل تلقائي لسلاسل JSON
  • فرز مفاتيح الكائن: ترتيب أبجدي لمقارنة متسقة

قياس الأداء

  • مرحلة التمهيد: 5 تكرارات لتهيئة الكاش وJIT
  • تكرارات تكيفية: 5–50 تشغيلًا حسب تعقيد الاستعلام
  • قياس معزول: قياس مستقل لكل نوع استعلام
  • مقارنة متعددة ORM: Prisma v6, v7, Drizzle, SQL المُولّد
  • زمن توليد SQL: توقيت منفصل لعبء توليد الاستعلام

تغطية اختبار شاملة

تغطي الاختبارات كل عمليات القراءة في Prisma عبر مستويات متعددة من التعقيد

عمليات الاستعلام

  • findMany مع مرشحات معقدة
  • findFirst مع skip والترقيم
  • findUnique بواسطة ID وحقول فريدة
  • count مع شروط WHERE
  • aggregate (sum, avg, min, max)
  • groupBy مع HAVING

سيناريوهات معقدة

  • Includes متداخلة (حتى 4 مستويات)
  • مرشحات العلاقات (some/every/none)
  • Distinct مع دوال نافذة
  • ترقيم بالـcursor
  • دمج Select + include
  • عدّ العلاقات (_count)

أنواع المرشحات

  • مقارنات (lt/lte/gt/gte)
  • منطق (AND/OR/NOT)
  • عمليات نصية (contains/startsWith)
  • فحوص NULL (is/isNot)
  • IN/NOT IN arrays
  • أوضاع حساسية حالة الأحرف

اختبارات PostgreSQL

  • ✓ ILIKE للبحث غير الحساس
  • ✓ عمليات JSON/JSONB
  • ✓ تعامل حقول array
  • ✓ دعم الأنواع المركبة
  • ✓ تحقق دوال النافذة
  • ✓ اختبار عزل المعاملات

اختبارات SQLite

  • ✓ مطابقة نمط LIKE
  • ✓ التحقق من امتداد JSON1
  • ✓ محاكاة دوال النافذة
  • ✓ تحسين DISTINCT
  • ✓ ترابط الاستعلامات الفرعية
  • ✓ تعامل text affinity

مثال على حالة اختبار

شاهد كيف نتحقق من استعلام متداخل معقد مع مرشحات علاقات

tests/e2e/postgres.test.ts
it('nested relation filter', () =>
  runParityTest(
    db,
    benchmarkResults,
    'findMany nested relation',
    'Organization',
    {
      method: 'findMany',
      where: {
        projects: {
          some: {
            tasks: { some: { status: 'DONE' } }
          }
        }
      }
    },
    () => db.prisma.organization.findMany({
      where: {
        projects: {
          some: {
            tasks: { some: { status: 'DONE' } }
          }
        }
      },
      orderBy: { id: 'asc' }
    }),
  )
)

// runParityTest internally:
// 1. Calls generateSQL() with the args
// 2. Executes generated SQL directly
// 3. Executes Prisma query
// 4. Normalizes both results
// 5. Deep equality check - fails if any difference
// 6. Benchmarks execution time

ما الذي يحدث أثناء تنفيذ الاختبار

1. توليد الاستعلام (ميكروثوانٍ)

تقوم generateSQL() بتحليل وسيطات Prisma وإنشاء SQL مُعلّم بالمعاملات. يتم قياس هذه الخطوة بشكل منفصل لقياس عبء توليد SQL.

2. تنفيذ متوازٍ (ميلي ثانية)

يضرب الاستعلامان نفس حالة قاعدة البيانات بالتزامن باستخدام Promise.all() لضمان مقارنة عادلة وظروف بيانات متطابقة.

3. تطبيع عميق

تخضع النتائج لتطبيع تكراري: BigInt→Number، Decimal→Float(10)، Date→null، تحليل JSON، وفرز المفاتيح. يضمن ذلك دقة مقارنة byte-for-byte.

4. مساواة صارمة

مقارنة JSON stringify بدون أي تسامح. أي اختلاف في عدد الصفوف أو القيم أو الكائنات المتداخلة أو الترتيب يفشل الاختبار مع diff مفصل.

5. قياس الأداء

بعد التحقق، تقيس 5–50 تكرارًا متوسط زمن التنفيذ. تشمل النتائج: Prisma v6 وPrisma v7 وDrizzle ORM وSQL المُولّد وعبء توليد SQL.

تحقق متعدد الإصدارات

يعمل كل اختبار على Prisma v6 وv7 لضمان التوافق عبر الإصدارات:

Prisma v6 (6.16.3)

  • • استخدام PrismaClient مباشرة
  • • بنية محرك قديمة
  • • مقاييس أداء أساس

Prisma v7 (7.2.0)

  • • بنية قائمة على adapters
  • • @prisma/adapter-pg & adapter-better-sqlite3
  • • تحسينات محرك جديدة

تقارير قياس مؤتمتة

تُولَّد جميع نتائج القياس تلقائيًا وتُخزَّن كملفات JSON للشفافية الكاملة:

benchmark-results/v6-postgres-latest.json
benchmark-results/v7-postgres-latest.json
benchmark-results/v6-sqlite-latest.json
benchmark-results/v7-sqlite-latest.json

يحتوي كل ملف على: اسم الاختبار، زمن Prisma، زمن SQL المُولّد، زمن Drizzle، نسب التسريع، وطابع ISO.

استكشف مجموعة الاختبارات كاملة

كل الاختبارات الـ137 مفتوحة المصدر. راجع كود الاختبار والقياسات ومنطق التحقق.