JavaRush /Kurslar /All lectures for UZ purposes /Test qilish uchun meta-annotatsiyalarni qo'llab-quvvatlas...

Test qilish uchun meta-annotatsiyalarni qo'llab-quvvatlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

Ko'pchilik test qilish bilan bog'liq annotatsiyalarni meta-annotatsiyalar sifatida foydalanib, o'zimizning annotatsiyalarimizni yaratib va test to'plamidagi konfiguratsiya takrorlanishini qisqartirishimiz mumkin.

Har bir quyidagi annotatsiyalarni TestContext frameworki bilan birga meta-annotatsiya sifatida ishlatish mumkin.

  • @BootstrapWith

  • @ContextConfiguration

  • @ContextHierarchy

  • @ActiveProfiles

  • @TestPropertySource

  • @DirtiesContext

  • @WebAppConfiguration

  • @TestExecutionListeners

  • @Transactional

  • @BeforeTransaction

  • @AfterTransaction

  • @Commit

  • @Rollback

  • @Sql

  • @SqlConfig

  • @SqlMergeMode

  • @SqlGroup

  • @Repeat (faqat JUnit 4 da qo'llab-quvvatlanadi)

  • @Timed (faqat JUnit 4 da qo'llab-quvvatlanadi)

  • @IfProfileValue (faqat JUnit 4 da qo'llab-quvvatlanadi)

  • @ProfileValueSourceConfiguration (faqat JUnit 4 da qo'llab-quvvatlanadi)

  • @SpringJUnitConfig (faqat JUnit Jupiter da qo'llab-quvvatlanadi)

  • @SpringJUnitWebConfig (faqat JUnit Jupiter da qo'llab-quvvatlanadi)

  • @TestConstructor (faqat JUnit Jupiter da qo'llab-quvvatlanadi)

  • @NestedTestConfiguration (faqat JUnit Jupiter da qo'llab-quvvatlanadi)

  • @EnabledIf (faqat JUnit Jupiter da qo'llab-quvvatlanadi)

  • @DisabledIf (faqat JUnit Jupiter da qo'llab-quvvatlanadi)

Quyidagi misolni ko'rib chiqamiz:

Java
@RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class OrderRepositoryTests { }
@RunWith(SpringRunner.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public class UserRepositoryTests { }
Kotlin
@RunWith(SpringRunner::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@RunWith(SpringRunner::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }

Agar avvalgi konfiguratsiya JUnit 4 test to'plamimizda takrorlanayotgan bo'lsa, unda takrorlanishni qisqartirish uchun maxsus tarkibiy annotatsiyani joriy qilib, Spring uchun umumiy test konfiguratsiyasini markazlashtirish mumkin, quyidagicha:

Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
Kotlin
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
annotation class TransactionalDevTestConfig { }

Keyin, @TransactionalDevTestConfig maxsus annotatsiyamizni quyidagi kabi JUnit 4 asosidagi alohida test sinflarining konfiguratsiyasini soddalashtirish uchun ishlatishimiz mumkin:

Java
@RunWith(SpringRunner.class)
@TransactionalDevTestConfig
public class OrderRepositoryTests { }
@RunWith(SpringRunner.class)
@TransactionalDevTestConfig
public class UserRepositoryTests { }
Kotlin
@RunWith(SpringRunner::class)
@TransactionalDevTestConfig
class OrderRepositoryTests
@RunWith(SpringRunner::class)
@TransactionalDevTestConfig
class UserRepositoryTests

JUnit Jupiter yordamida testlar yozayotgan bo'lsak, kodni yanada qisqartirish mumkin, chunki JUnit 5 annotatsiyalari ham meta-annotatsiyalar sifatida ishlatilishi mumkin. Quyidagi misolni ko'rib chiqaylik:

Java
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }
Kotlin
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class OrderRepositoryTests { }
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
class UserRepositoryTests { }

Agar avvalgi konfiguratsiya JUnit Jupiter test to'plamimizda takrorlanayotgan bo'lsa, unda takroriylikni kamaytirish uchun maxsus tarkibiy annotatsiyani joriy qilib, Spring va JUnit Jupiter uchun umumiy test konfiguratsiyasini markazlashtirish mumkin, quyidagicha:

Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(SpringExtension.class)
@ContextConfiguration({"/app-config.xml", "/test-data-access-config.xml"})
@ActiveProfiles("dev")
@Transactional
public @interface TransactionalDevTestConfig { }
Kotlin
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@ExtendWith(SpringExtension::class)
@ContextConfiguration("/app-config.xml", "/test-data-access-config.xml")
@ActiveProfiles("dev")
@Transactional
annotation class TransactionalDevTestConfig { }

Keyin, @TransactionalDevTestConfig maxsus annotatsiyamizni quyidagi kabi JUnit Jupiter asosidagi alohida test sinflarining konfiguratsiyasini soddalashtirish uchun ishlatishimiz mumkin:

Java
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }
Kotlin
@TransactionalDevTestConfig
class OrderRepositoryTests { }
@TransactionalDevTestConfig
class UserRepositoryTests { }

JUnit Jupiter @Test, @RepeatedTest, ParameterizedTest va boshqalarni meta-annotatsiyalar sifatida ishlatishni qo'llab-quvvatlagani uchun, test metod darajasida o'zimizning tarkibiy annotatsiyalarimizni yaratishimiz ham mumkin. Masalan, agar @Test va @Tag annotatsiyalarini JUnit Jupiterdan @Transactional annotatsiyasi bilan birlashtiruvchi tarkibiy annotatsiyani yaratmoqchi bo'lsak, @TransactionalIntegrationTest annotatsiyasini quyidagicha yaratishimiz mumkin:

Java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Transactional
@Tag("integration-test") // org.junit.jupiter.api.Tag
@Test // org.junit.jupiter.api.Test
public @interface TransactionalIntegrationTest { }
Kotlin
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@Transactional
@Tag("integration-test") // org.junit.jupiter.api.Tag
@Test // org.junit.jupiter.api.Test
annotation class TransactionalIntegrationTest { }

Keyin, @TransactionalIntegrationTest maxsus annotatsiyamizni quyidagi kabi JUnit Jupiter asosidagi alohida test metodlarining konfiguratsiyasini soddalashtirish uchun ishlatishimiz mumkin:

Java
@TransactionalIntegrationTest
void saveOrder() { }
@TransactionalIntegrationTest
void deleteOrder() { }
Kotlin
@TransactionalIntegrationTest
fun saveOrder() { }
@TransactionalIntegrationTest
fun deleteOrder() { }

Batafsil ma'lumotni Spring Annotation Programming Model viki sahifasidan topishingiz mumkin.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION