اختبار التكامل لجافا مع Docker: تقنيات متقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

اختبار التكامل لجافا مع Docker: المستوى المتقدم

\n

اختبار التكامل هو مرحلة أساسية في تطوير تطبيقات Java الحديثة، خاصة في بنية الميكروسيرفيسات. استخدام Docker يسمح بعزل بيئات الاختبار، مما يضمن قابلية التكرار والاستقلالية عن الخدمات الخارجية. في هذه المقالة، سنستعرض تقنيات متقدمة لاختبار التكامل لتطبيقات Java مع Docker، بما في ذلك العمل مع مكتبة Testcontainers، إعداد الحاويات المخصصة، اختبار السيناريوهات غير المتزامنة، والتكامل مع خطوط أنابيب CI/CD. المادة موجهة للمطورين الذين هم على دراية بأساسيات JUnit وDocker.

\n\n

لماذا يعتبر Docker ضرورياً لاختبار التكامل لجافا؟

\n

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

\n
    \n
  • معزولة: كل سيناريو اختبار يعمل في بيئة نظيفة.
  • \n
  • قابلة للتكرار: سلوك متطابق على الجهاز المحلي وفي CI.
  • \n
  • متوازية: الحاويات لا تتعارض في المنافذ بفضل التعيين الديناميكي.
  • \n
\n

بالنسبة لجافا، المكتبة الأكثر شيوعاً هي Testcontainers، التي توفر واجهة برمجة تطبيقات بسيطة لإدارة الحاويات من الاختبارات.

\n\n

إعداد Testcontainers: من البسيط إلى المعقد

\n

لنبدأ بمثال أساسي — اختبار طبقة DAO مع PostgreSQL. أضف التبعية في pom.xml:

\n
<dependency>\n    <groupId>org.testcontainers</groupId>\n    <artifactId>testcontainers</artifactId>\n    <version>1.19.3</version>\n    <scope>test</scope>\n</dependency>\n<dependency>\n    <groupId>org.testcontainers</groupId>\n    <artifactId>postgresql</artifactId>\n    <version>1.19.3</version>\n    <scope>test</scope>\n</dependency>
\n

الآن لننشئ اختباراً يستخدم حاوية PostgreSQL:

\n
import org.junit.jupiter.api.Test;\nimport org.testcontainers.containers.PostgreSQLContainer;\nimport org.testcontainers.junit.jupiter.Container;\nimport org.testcontainers.junit.jupiter.Testcontainers;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\n@Testcontainers\npublic class UserRepositoryIntegrationTest {\n\n    @Container\n    private PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")\n            .withDatabaseName("testdb")\n            .withUsername("test")\n            .withPassword("test");\n\n    @Test\n    void shouldSaveAndFindUser() throws Exception {\n        // الحصول على الرابط الديناميكي من الحاوية\n        String jdbcUrl = postgres.getJdbcUrl();\n        String username = postgres.getUsername();\n        String password = postgres.getPassword();\n\n        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {\n            conn.createStatement().execute("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(255))");\n            conn.createStatement().execute("INSERT INTO users (name) VALUES ('Alice')");\n            ResultSet rs = conn.createStatement().executeQuery("SELECT name FROM users WHERE id = 1");\n            rs.next();\n            assertEquals("Alice", rs.getString("name"));\n        }\n    }\n}
\n

يقوم Testcontainers تلقائياً بتشغيل الحاوية قبل الاختبارات وإيقافها بعدها. للمستوى المتقدم، استخدم الحاويات المخصصة (على سبيل المثال، مع بيانات محملة مسبقاً

المدونات

توصيات الكتب