ضمان الجودة

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

يغطي التحقق الحالي عمليات القراءة المدعومة على PostgreSQL وSQLite، مع تقارير قياس أداء لـ Prisma v6 وv7 وv8 وDrizzle وSQL المُولَّد.

مجموعة E2E
حالية
التحقق من تكافؤ الاستعلامات
تغطية التكافؤ
100%
تطابق بايت ببايت
محركات قواعد البيانات
2
PostgreSQL وSQLite
مقارنات ORM
4
Prisma v6/v7/v8 و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 وPrisma v8 وDrizzle ORM.

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

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

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

قياس الأداء

مرحلة التمهيد
5 تكرارات لتهيئة الذاكرة المؤقتة وJIT
تكرارات تكيفية
5-50 تشغيلًا حسب تعقيد الاستعلام
قياس معزول
قياس مستقل لكل نوع استعلام
مقارنة بين عدة ORMs
Prisma v6 وv7 وv8 و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
  • أوضاع حساسية حالة الأحرف

اختبارات PostgreSQL

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

اختبارات 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 داخليًا:
// 1. تستدعي generateSQL() بالوسائط
// 2. تنفّذ SQL المُولَّد مباشرة
// 3. تنفّذ استعلام Prisma
// 4. تطبّع النتيجتين
// 5. فحص مساواة عميق - يفشل عند أي اختلاف
// 6. تقيس زمن التنفيذ

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

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

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

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

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

  3. 3تطبيع عميق

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

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

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

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

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

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

يعمل كل اختبار مشمول بالقياس على Prisma v6 وv7 وv8 حيثما كان ذلك مدعومًا:

Prisma v6 (6.19.3)

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

Prisma v7 (7.10.0)

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

Prisma v8 (8.1.0-dev.1)

  • تغطية إصدار التطوير من Prisma v8
  • بنية قائمة على adapters
  • تكافؤ قياس الأداء على PostgreSQL وSQLite

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

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

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

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

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