0%
Testcontainers: قاعدة بيانات حقيقية أثناء الاختبارات

Testcontainers

PostgreSQL مؤقت لكل مجموعة اختبارات، دون تثبيت ولا قاعدة بيانات مشتركة.

10-15 دقيقة

Testcontainers: قاعدة بيانات حقيقية أثناء الاختبارات

أمام الفريق ثلاثة خيارات، وكلها تطرح مشكلة. الخيار الأول قاعدة PostgreSQL مشتركة على خادم التكامل: فعمليتا تشغيل متزامنتان تتداخلان، واختبار يترك صفًا خلفه فيُفسد اختبار جاره، ولا أحد يجرؤ على إعادة تهيئتها. الخيار الثاني قاعدة محلية مثبّتة على كل جهاز: لكل شخص إصدارُه وإضافاته ومخططه المختلف قليلًا، وانضمام مطوّر جديد يكلّف نصف يوم. الخيار الثالث قاعدة في الذاكرة مثل H2: سريعة وموحّدة، لكنها عمياء عن كل ما هو خاص بـ PostgreSQL، كما رأينا في الدرس الأول.

يقترح Testcontainers طريقًا رابعًا: مجموعة الاختبارات نفسها تشغّل حاوية Docker تحتوي PostgreSQL، وتطبّق عليها المخطط، وتنفّذ الاختبارات، ثم تدمّر الحاوية. الإصدار هو المعلن في الشيفرة، فهو إذن واحد في كل مكان. والعزل تام، ما يتيح التنفيذ المتوازي. ولأنه PostgreSQL حقيقي، فإن jsonb وILIKE وفهارس GIN وقيود الاستبعاد تتصرف تمامًا كما في الإنتاج. الثمن حقيقي: يصبح Docker اعتمادًا لمجموعة الاختبارات، ويستغرق التشغيل وقتًا، ومعظم هذا الدرس مخصص تحديدًا لكيفية احتواء هذا الثمن.

الإعداد

ينشر Testcontainers قائمة مواد (BOM) توحّد إصدارات الوحدات.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>testcontainers-bom</artifactId>
            <version>1.20.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>postgresql</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testcontainers</groupId>
        <artifactId>junit-jupiter</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

التعليقات

التعليقات مدعومة عبر GitHub Discussions

سجّل الدخول باستخدام GitHub للمشاركة في النقاش

تم نسخ الرابط!