মান নিশ্চিতকরণ

টেস্টিং পদ্ধতি

বর্তমান যাচাই PostgreSQL ও SQLite জুড়ে সমর্থিত রিড কভার করে, সাথে আছে Prisma v6, v7, v8, Drizzle ও জেনারেট হওয়া SQL-এর বেঞ্চমার্ক রিপোর্ট।

E2E স্যুট
বর্তমান
কুয়েরি প্যারিটি যাচাইকৃত
প্যারিটি কভারেজ
100%
বাইট-বাই-বাইট মিল
ডেটাবেস ইঞ্জিন
2
PostgreSQL ও SQLite
ORM বেঞ্চমার্ক
4
Prisma v6/v7/v8, Drizzle

আমরা সঠিকতা কীভাবে যাচাই করি

জেনারেট হওয়া SQL যেন Prisma-এর মতো হুবহু একই ফলাফল দেয়, তা নিশ্চিত করতে প্রতিটি টেস্ট একটি কঠোর 5-ধাপের যাচাই প্রক্রিয়া অনুসরণ করে

  1. Prisma কুয়েরি থেকে SQL জেনারেট করা

    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 → 10-অঙ্কের প্রিসিশনসহ Float
Date নর্মালাইজেশন
সব DateTime মান → null (টাইমস্ট্যাম্প নয়, ডেটার ওপর মনোযোগ)
JSON পার্সিং
JSON স্ট্রিং স্বয়ংক্রিয়ভাবে শনাক্ত ও পার্স করা
অবজেক্ট কী সাজানো
সামঞ্জস্যপূর্ণ তুলনার জন্য বর্ণানুক্রমিক ক্রম

পারফরম্যান্স বেঞ্চমার্কিং

ওয়ার্মআপ পর্ব
ক্যাশ ও JIT প্রস্তুত করতে 5টি ইটারেশন
অভিযোজিত ইটারেশন
কুয়েরির জটিলতা অনুযায়ী 5-50টি রান
আলাদা পরিমাপ
প্রতিটি কুয়েরি টাইপ স্বাধীনভাবে মাপা হয়
একাধিক ORM-এর তুলনা
Prisma v6, v7, v8, Drizzle, জেনারেট হওয়া SQL
SQL জেনারেশন টাইম
কুয়েরি জেনারেশনের ওভারহেডের জন্য আলাদা টাইমিং

বিস্তৃত টেস্ট কভারেজ

টেস্টগুলো বিভিন্ন জটিলতার স্তরে প্রতিটি Prisma রিড অপারেশন কভার করে

কুয়েরি অপারেশন

  • জটিল ফিল্টারসহ findMany
  • skip ও পেজিনেশনসহ findFirst
  • ID ও ইউনিক ফিল্ড দিয়ে findUnique
  • WHERE শর্তসহ count
  • aggregate (sum, avg, min, max)
  • HAVING ক্লজসহ groupBy

জটিল পরিস্থিতি

  • নেস্টেড include (4 স্তর গভীর)
  • রিলেশন ফিল্টার (some/every/none)
  • উইন্ডো ফাংশনসহ Distinct
  • কার্সর পেজিনেশন
  • 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 অপটিমাইজেশন
  • সাবকুয়েরি কোরিলেশন
  • টেক্সট অ্যাফিনিটি সামলানো

উদাহরণ টেস্ট কেস

রিলেশন ফিল্টারসহ একটি জটিল নেস্টেড কুয়েরি আমরা কীভাবে যাচাই করি দেখুন

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. args দিয়ে generateSQL() কল করে
// 2. জেনারেট হওয়া SQL সরাসরি চালায়
// 3. Prisma কুয়েরি চালায়
// 4. দুটি ফলাফলই নর্মালাইজ করে
// 5. গভীর সমতা যাচাই - কোনো পার্থক্য থাকলে ফেল করে
// 6. এক্সিকিউশন টাইম বেঞ্চমার্ক করে

টেস্ট চলার সময় কী ঘটে

  1. 1কুয়েরি জেনারেশন (মাইক্রোসেকেন্ড)

    generateSQL() ফাংশন Prisma args পার্স করে প্যারামিটারাইজড 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)

  • অ্যাডাপ্টার-ভিত্তিক আর্কিটেকচার
  • @prisma/adapter-pg ও adapter-better-sqlite3
  • নতুন ইঞ্জিন অপটিমাইজেশন

Prisma v8 (8.1.0-dev.1)

  • Prisma v8 dev রিলিজের কভারেজ
  • অ্যাডাপ্টার-ভিত্তিক আর্কিটেকচার
  • PostgreSQL ও SQLite বেঞ্চমার্ক প্যারিটি

স্বয়ংক্রিয় বেঞ্চমার্ক রিপোর্ট

পূর্ণ স্বচ্ছতার জন্য সব বেঞ্চমার্ক ফলাফল স্বয়ংক্রিয়ভাবে তৈরি হয় এবং JSON ফাইল হিসেবে সংরক্ষিত থাকে:

প্রতিটি ফাইলে থাকে: টেস্টের নাম, Prisma এক্সিকিউশন টাইম, জেনারেট হওয়া SQL-এর টাইম, Drizzle টাইম, গতিবৃদ্ধির অনুপাত এবং ISO টাইমস্ট্যাম্প।

পূর্ণ টেস্ট স্যুট দেখুন

যাচাই স্যুট ও বেঞ্চমার্ক রিপোর্ট ওপেন সোর্স। টেস্ট কোড, বেঞ্চমার্ক ডেটা ও প্যারিটি চেক পর্যালোচনা করুন।