TestExecutionListener

All lectures for UZ purposes
Daraja, Dars
Mavjud

Spring quyidagi TestExecutionListenerni taqdim etadi, ular sukut bo'yicha ro'yxatdan o'tadi, aynan quyidagi tartibda:

  • ServletTestExecutionListener: WebApplicationContext uchun servlet API interfeysi imitatsiya ob'ektlarini sozlaydi.

  • DirtiesContextBeforeModesTestExecutionListener: "oldin" rejimlari uchun @DirtiesContext annotatsiyasini qayta ishlaydi.

  • ApplicationEventsTestExecutionListener: ApplicationEventsni qo'llab-quvvatlaydi.

  • DependencyInjectionTestExecutionListener: Test nusxasi uchun bog'liqliklarni kiritishni ta'minlaydi.

  • DirtiesContextTestExecutionListener: "keyin" rejimlari uchun @DirtiesContext annotatsiyasini qayta ishlaydi.

  • TransactionalTestExecutionListener: Testlarni tranzaksiya tarzida bajaradi va sukut bo'yicha orqaga qaytish semantikasiga ega.

  • SqlScriptsTestExecutionListener: @Sql annotatsiyasi orqali sozlangan SQL-skriptlarni bajaradi.

  • EventPublishingTestExecutionListener: Testni bajarish voqealarini
    ApplicationContextda nashr qiladi.

TestExecutionListenerni ro'yxatdan o'tkazish

Siz TestExecutionListener amalga oshirishlarini test sinfi va uning pastki sinflari uchun @TestExecutionListeners annotatsiyasi orqali ro'yxatdan o'tkazishingiz mumkin. Buning tafsilotlari va misollarini annotatsiya qo'llab-quvvatlashiga bag'ishlangan bo'limda va @TestExecutionListeners annotatsiyasining javadocida topishingiz mumkin.

Default bo'yicha TestExecutionListener amalga oshirishlarini avtomatik aniqlash

@TestExecutionListeners annotatsiyasi orqali TestExecutionListener amalga oshirishlarini ro'yxatdan o'tkazish maxsus ishlatiladigan tinglovchilar uchun mos keladi. Ammo agar maxsus tinglovchini butun test to'plamida ishlatish kerak bo'lsa, bu biroz qiyinchilik tug'dirishi mumkin. Bu muammo TestExecutionListener amalga oshirilishlarini SpringFactoriesLoader mexanizmi orqali avtomatik aniqlashni qo'llab-quvvatlash orqali hal qilinadi.

Xususan, spring-test moduli META-INF/spring.factories faylida org.springframework.test.context.TestExecutionListener kaliti bilan barcha default TestExecutionListener amalga oshirishlarini e'lon qiladi. Uchinchi tomon frameworklari va ishlab chiquvchilar xuddi shu tarzda META-INF/spring.factoriesdagi o'zlarining mulk fayllari orqali default tinglovchilar ro'yxatiga o'z TestExecutionListener amalga oshirishlarini qo'shishlari mumkin.

TestExecutionListener amalga oshirishlarini tartiblash

TestContext frameworki yuqorida aytib o'tilgan SpringFactoriesLoader mexanizmi orqali default TestExecutionListener amalga oshirilishlarini aniqlasa, yaratilgan tinglovchilar nusxalari AnnotationAwareOrderComparator yordamida tartiblanadi. Bu Springning Ordered interfeysini hisobga oladi va @Order annotatsiyasini tartiblash uchun qo'llaydi. AbstractTestExecutionListener va Spring tomonidan taqdim etilgan barcha default TestExecutionListener amalga oshirishlari mos qiymatlar bilan Orderedni amalga oshiradi. Shuning uchun uchinchi tomon frameworklari va ishlab chiquvchilar o'zlarining default TestExecutionListener amalga oshirishlarini to'g'ri tartibda ro'yxatdan o'tkazganliklariga ishonch hosil qilishlari kerak, bu Orderedni amalga oshirish yoki @Order annotatsiyasini e'lon qilish orqali amalga oshiriladi. TestExecutionListenerning default amalga oshirishlari asosiy metodlarining getOrder() javadocini ko'ring, har bir asosiy tinglovchiga qaysi qiymatlar berilganligi haqida batafsil ma'lumot olish uchun.

TestExecutionListener amalga oshirishlarini birlashtirish

Agar maxsus TestExecutionListener @TestExecutionListeners annotatsiyasi orqali ro'yxatdan o'tkazilgan bo'lsa, default tinglovchilar ro'yxatdan o'tkazilmaydi. Testning eng keng tarqalgan stsenariylarida bu amalda ishlab chiquvchini default tinglovchilarga qo'shimcha sifatida barcha maxsus tinglovchilarni qo'lda e'lon qilishga majbur qiladi. Quyidagi ro'yxatda bunday konfiguratsiya uslubi namoyish etilgan:

Java
@ContextConfiguration
@TestExecutionListeners({
    MyCustomTestExecutionListener.class,
    ServletTestExecutionListener.class,
    DirtiesContextBeforeModesTestExecutionListener.class,
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class,
    TransactionalTestExecutionListener.class,
    SqlScriptsTestExecutionListener.class
})
class MyTest {
    // sinfning tanasi...
}
Kotlin
@ContextConfiguration
@TestExecutionListeners(
    MyCustomTestExecutionListener::class,
    ServletTestExecutionListener::class,
    DirtiesContextBeforeModesTestExecutionListener::class,
    DependencyInjectionTestExecutionListener::class,
    DirtiesContextTestExecutionListener::class,
    TransactionalTestExecutionListener::class,
    SqlScriptsTestExecutionListener::class
)
class MyTest {
    // sinfning tanasi...
}

Bu yondashuvning murakkabligi shundaki, u ishlab chiquvchini qaysi tinglovchilar default bo'yicha ro'yxatdan o'tganligini aniq bilishni talab qiladi. Bundan tashqari, default tinglovchilar to'plami versiyadan versiyaga o'zgarishi mumkin – masalan, SqlScriptsTestExecutionListener Spring Framework 4.1 da taqdim etildi, va DirtiesContextBeforeModesTestExecutionListener Spring Framework 4.2 da taqdim etildi. Bundan tashqari, Spring Boot va Spring Security kabi uchinchi tomon frameworklari yuqorida aytib o'tilgan avtomatik aniqlash mexanizmini ishlatib, o'zlarining default TestExecutionListener amalga oshirishlarini ro'yxatdan o'tkazadilar.

Default tinglovchilarni bilish va takroran e'lon qilish zaruratini bartaraf etish uchun @TestExecutionListeners annotatsiyasida mergeMode atributini MergeMode.MERGE_WITH_DEFAULTSga o'rnatish mumkin. MERGE_WITH_DEFAULTS lokal e'lon qilingan tinglovchilarni default tinglovchilar bilan birlashtirilishini bildiradi. Birlashtiruvchi algoritm ro'yxatdagi dublikatlarni olib tashlashni va birlashtirilgan tinglovchilar to'plamini AnnotationAwareOrderComparator semantikasi bo'yicha tartiblashni ta'minlaydi, "Ushbu tartiblash TestExecutionListener amalga oshirishlarini" bo'limida tavsiflangan. Agar tinglovchi Orderedni amalga oshirsa yoki @Order bilan belgilangan bo'lsa, u default tinglovchilar bilan birlashtirilgan joyga ta'sir qilishi mumkin. Aks holda, lokal e'lon qilingan tinglovchilar birlashtirilganda default tinglovchilar ro'yxatiga qo'shiladi.

Misol uchun, agar oldingi misoldagi MyCustomTestExecutionListener ning order qiymatini (masalan, 500) ServletTestExecutionListener ni (qiymati 1000)dan kamroq qilib belgilasa, MyCustomTestExecutionListener avtomatik ravishda default ro'yxatdan ServletTestExecutionListener oldin birlashtirilishi mumkin va oldingi misol quyidagicha almashtirilishi mumkin:

Java
@ContextConfiguration
@TestExecutionListeners(
    listeners = MyCustomTestExecutionListener.class,
    mergeMode = MERGE_WITH_DEFAULTS
)
class MyTest {
    // sinfning tanasi...
}
Kotlin
@ContextConfiguration
@TestExecutionListeners(
        listeners = [MyCustomTestExecutionListener::class],
        mergeMode = MERGE_WITH_DEFAULTS
)
class MyTest {
    // sinfning tanasi...
}
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION