اختبار التكامل في SpringBoot مع بداية TestContainers

تم إعداد ترجمة المقال استعدادًا لبدء دورة "مطور في إطار الربيع" .








أحد أسباب شعبية Spring و Spring Boot هو دعم الاختبار الجيد . يمكنك كتابة كلا الاختبارين الوحدتين باستخدام Mockito دون استخدام وظائف Spring واختبارات التكامل مع تهيئة سياق Spring.



قد تتطلب اختبارات التكامل التفاعل مع الخدمات الخارجية مثل قواعد البيانات العلائقية وقواعد بيانات NoSQL وكافكا وغيرها. عند الاختبار ، من الملائم نشر هذه الخدمات في حاويات Docker.



حاويات الاختبار



من وثائق Testcontainers:



TestContainers هي مكتبة Java تدعم اختبارات JUnit من خلال توفير مثيلات خفيفة الوزن وعابرة لقواعد البيانات الشائعة ومتصفحات الويب مع السيلينيوم وأي شيء آخر يمكن تشغيله في حاوية Docker.




باستخدام Testcontainers ، يمكنك بدء تشغيل حاوية Singleton Docker على النحو التالي:



@SpringBootTest
@ContextConfiguration(initializers = {UserServiceIntegrationTest.Initializer.class})
class UserServiceIntegrationTest {
    private static PostgreSQLContainer sqlContainer;
    
    static {
        sqlContainer = new PostgreSQLContainer("postgres:10.7")
                .withDatabaseName("integration-tests-db")
                .withUsername("sa")
                .withPassword("sa");
        sqlContainer.start();
    }

    static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
            TestPropertyValues.of(
              "spring.datasource.url=" + sqlContainer.getJdbcUrl(),
              "spring.datasource.username=" + sqlContainer.getUsername(),
              "spring.datasource.password=" + sqlContainer.getPassword()
            ).applyTo(configurableApplicationContext.getEnvironment());
        }
    }

    @Autowired
    private UserService userService;
    
    @Test
    void shouldGetAllUsers() {
        // test userService.getAllUsers()
    }   

}


نظرًا لاستخدام هذا كثيرًا ، تم إنشاء بداية من قبل المجتمع لتبسيط الحياة من قبل المجتمع - Testcontainers Spring Boot Starter .



حاويات الاختبار SpringBoot Starter



حاويات الاختبار - يعتمد المبدئ على بداية السحابة الربيعية . إذا كان تطبيقك لا يستخدم مبتدئين SpringCloud ، فأنت بحاجة إلى إضافة بداية الربيع السحابية كاعتماد اختبار.



<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter</artifactId>
    <scope>test</scope>
</dependency>


وأيضًا إضافة مكتبة لقاعدة البيانات. على سبيل المثال ، إذا كنت تريد استخدام Postgresql:



<dependency>
    <groupId>com.playtika.testcontainers</groupId>
    <artifactId>embedded-postgresql</artifactId>
    <scope>test</scope>
</dependency>


عند إضافتها embedded-postgresqlإلى البيئة ، ستتوفر الخصائص التالية:



embedded.postgresql.port
embedded.postgresql.host
embedded.postgresql.schema
embedded.postgresql.user
embedded.postgresql.password


يمكن استخدامها لإعداد مصدر بيانات.



عادةً ما تُستخدم حاويات Docker فقط لاختبارات التكامل ، وليس اختبارات الوحدة. بمساعدة ملفات التعريف ، يمكننا تعطيلها افتراضيًا وتمكينها فقط من أجل اختبارات التكامل.



src/test/resources/bootstrap.properties



embedded.postgresql.enabled=false


src/test/resources/bootstrap-integration-test.properties



embedded.postgresql.enabled=true
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://${embedded.postgresql.host}:${embedded.postgresql.port}/${embedded.postgresql.schema}
spring.datasource.username=${embedded.postgresql.user}
spring.datasource.password=${embedded.postgresql.password}


يمكنك الآن إجراء اختبارات التكامل مع ملف تعريف اختبار التكامل باستخدام @ActiveProfiles:



@SpringBootTest
@ActiveProfiles("integration-test")
class UserServiceIntegrationTest {
    
    @Autowired
    private UserService userService;
    
    @Test
    void shouldGetAllUsers() {
        // test userService.getAllUsers()
    }   

}


يمكنك تحديد إصدار معين من صورة عامل الإرساء على النحو التالي:



src/test/resources/bootstrap-integration-test.properties



embedded.postgresql.dockerImage=postgres:10.7
embedded.postgresql.enabled=true




يوفر مشغل Testcontainers بالفعل دعمًا للحاويات الأكثر شيوعًا مثل Postgresql و MariaDB و MongoDB و Redis و RabbitMQ و Kafka و Elasticsearch وغيرها.

والمثير للدهشة أنه لا يوجد حاليًا دعم مباشر لـ MySQL. على الرغم من وجود حل بسيط لهذا كما هو موضح هنا






إعادة بناء كود التطبيق في الربيع







All Articles