Ba'zi bir integratsion testlarni amalga oshirish uchun ilovalarni serverlarga joylashtirmasdan yoki boshqa korporativ infratuzilmani ulashga muhtoj bo'lmasdan o'tkazish juda muhim. Bu quyidagi narsalarni test qilish imkonini beradi:
-
Spring IoC-container kontekstlarini to'g'ri ulash.
-
JDBC yoki ORM asboblari yordamida ma'lumotlarga kirish. Bu, boshqa narsalar qatorida, SQL buyruqlarining to'g'riligi, Hibernate so'rovlari, JPA ob'ektlari ko'rsatmalarini o'z ichiga olishi mumkin.
Spring Framework integratsion testlarni qo'llab-quvvatlashni spring-test modulida taklif qiladi. Haqiqiy JAR-faylning nomi chiqish versiyasini o'z ichiga olishi mumkin va org.springframework.test kabi uzun shaklda bo'lishi mumkin, bu siz uni qayerdan olishingizga bog'liq (qarang: bog'liqlikni boshqarish bo'limi uchun tavsiyalar). Ushbu kutubxona org.springframework.test paketini o'z ichiga oladi, bu Spring container bilan aloqador integratsion testlar uchun foydali sinflarni o'z ichiga oladi. Bunday testlar ilova serverlari yoki boshqa joylashtirish muhitlariga bog'liq emas. Bunday testlar modulli testlardan sekinroq ishlaydi, lekin Selenium yoki ilova serveriga joylashtirilgan masofaviy testlarga qaraganda ancha tezroq.
Modul va integratsion testlarni qo'llab-quvvatlash Spring TestContext Framework an'otatsion-yonaltirilgan freymevork shaklida taqdim etilgan. TestContext freymevorki haqiqatan ham ishlatilayotgan test infratuzilmasiga bog'liq emas, bu testlarni turli muhitlarda instrumentatsiya qilish imkonini beradi, shu jumladan JUnit, TestNG va boshqalar.
Integratsion Testlarning Maqsadlari
Spring'dagi integratsion testlarni qo'llab-quvvatlash quyidagi asosiy maqsadlarni ko'zlaydi:
-
Spring IoC-kontextini testlar orasida keshini boshqarish.
-
Test muhitlari (stendlar) uchun dependensiyalarni inject qilishni ta'minlash.
-
Integratsion testlarga mos keladiganlarni ta'minlash.
-
Spring'ga xos asosiy sinflarni taqdim etish, bu ishlab chiquvchilarga integratsion testlarni yozishda yordam beradi.
Quyidagi bir necha bo'limlarda har bir maqsad tushuntiriladi va rejalashtirish va konfiguratsiya bo'yicha batafsil ma'lumotlar beriladi.
Kontekstni Boshqarish va Keshlash
Spring TestContext Frameworki kontekstlar ApplicationContext va WebApplicationContext'ni Spring'da ketma-ket yuklash va ularga keshni ta'minlaydi. Yuklangan kontekstlar uchun kesh qo'llab-quvvatlash muhim, chunki dastlabki ishga tushirish vaqti muammo bo'lishi mumkin – bu Springdagi kechikish tufayli emas, balki Spring container tomonidan yaratilgan obyektlar uchun kerak bo'lgan vaqt tufayli. Masalan, 50-100 Hibernate mapping fayllari bilan loyihada mapping fayllarini yuklash uchun 10-20 soniya talab qilinishi mumkin, va bu xarajatlar har bir testdan oldin har bir test stendida yanada umumiy test jarayonini sekinlashtiradi, bu ishlab chiquvchilarning samaradorligini pasaytiradi.
Test sinflari odatda XML yoki Groovy konfiguratsiya metadatalari uchun resurslar joylashuvi massivini – ko'pincha classpath'da – yoki ilovalarni sozlashda foydalaniladigan komponentlar sinflari massivini e'lon qiladi. Ushbu joylashuvlar yoki sinflar web.xml yoki ishlab chiqarish muhitida joylashtirish uchun boshqa konfiguratsiya fayllarida ko'rsatilganlar yoki o'xshashlar.
Standart bo'yicha yuklangan va sozlangan ApplicationContext har bir test uchun qayta ishlatiladi. Shunday qilib, resurslar faqat bir marta har bir test kompartamenti uchun sarflanadi, va keyinchalik testlarni bajarish ancha tez amalga oshiriladi. Ushbu kontekstda "test kompartamenti" atamasi barcha testlarni bir JVM'da bajarishni anglatadi – masalan, ushbu loyiha yoki moduli uchun Ant, Maven yoki Gradle qurilishidan barcha testlar. Agar test ilova kontekstini buzsa va qayta yuklashni talab qilsa (masalan, bean ta'rifini o'zgartirganda yoki ilova obyektining holatini o'zgartirganda), TestContext freymevorki konfiguratsiyani qayta yuklab, ilova kontekstini qayta tiklash uchun sozlanishi mumkin.
Test Stendlari uchun Dependensiyalarni Inject qilish
TestContext freymevorki ilova kontekstini yuklaganda, sizning test sinflaringizning obyektlari uchun dependensiyalarni inject qilish orqali konfiguratsiyalashi mumkin. Bu ilova kontekstidan oldindan tayyorlangan beanlar yordamida test stendlarni sozlash uchun qulay mexanizmni ta'minlaydi. Bu erda katta afzallik shundaki, ilova kontekstlarini turli test ssenariylarida qayta ishlatish imkoniyati (masalan, Spring tomonidan boshqariladigan obyektlar grafalari, tranzaksion proksi, DataSource obyektlari va h.k.) bu murakkab test stendlarini alohida test hollarida ikki marta yaratishga ehtiyoj qoldiradi.
Misol sifatida, bizda Title domen obyekti uchun ma'lumotlarga kirish logikasini amalga oshiruvchi (HibernateTitleRepository) sinfi mavjud deb faraz qilaylik. Biz ushbu sohalarni testlaydigan integratsion testlar yozmoqchimiz:
-
Spring konfiguratsiyasi:
HibernateTitleRepositorybean'ining konfiguratsiyasi to'g'rimi va mavjudmi? -
Hibernate mapping fayli konfiguratsiyasi: Hamma to'g'riligi bilan mos keladimi va kerakli lazy load'lar to'g'ri sozlanganmi?
-
HibernateTitleRepositoryrepozitoriy logikasi: Ushbu sinfning sozlangan nusxasi kutilgan funksiyalarni bajaradimi?
Tranzaktsiyalarni Boshqarish
Haqiqiy ma'lumotlar bazasiga murojaat qiluvchi testlarda keng tarqalgan muammodan biri doimiy saqlash omborining (persistence store) holatiga ta'sir qilishdir. Hattoki rivojlanish uchun mo'ljallangan ma'lumotlar bazasini foydalansangiz ham, holat o'zgarishi kelajakda testlarga ta'sir qilishi mumkin. Bundan tashqari, ko'plab operatsiyalar – doimiy saqlangan ma'lumotlarni kiritish yoki o'zgartirish kabi – tranzaksiyadan tashqarida bajarib bo'lmaydi (yoki tekshirilmaydi).
TestContext freymevorki bu muammoni hal qiladi. Standart bo'yicha freymevork har bir test uchun tranzaktsiyani yaratadi va uni qaytaradi. Siz kod yozishingiz mumkin, bu tranzaksiyaning mavjudligiga ishonch hosil qiladi. Agar siz testlarda tranzaktsion tarzda proksiyalangan obyektlarni chaqirsangiz, ular to'g'ri harakat qiladi va sozlangan tranzaksiyalar semantikasiga mos keladi. Bundan tashqari, agar test usuli test uchun boshqariladigan tranzaksiya davomida tanlangan jadvallarni o'chirib tashlasa, ushbu tranzaksiya standart ravishda qaytariladi va ma'lumotlar bazasi testdan oldingi holatga qaytadi. Tranzaktsiyalarni qo'llab-quvvatlash PlatformTransactionManager bean orqali test ilova kontekstida taqdim etiladi.
Agar siz tranzaksiyaning saqlanishini xohlasangiz (noan'anaviy, lekin ba'zan foydali, agar ma'lum bir test ma'lumotlar bazasini to'ldirish yoki o'zgartirishni talab qilsa), TestContext freymevorkidan tranzaktsiyani qaytarish oʻrniga saqlashni soʻrash mumkin, @Commit annotatsiyasidan foydalanib.
TestContext freymevorki orqali tranzaktsiyalarni boshqarishni ko'ring (ma'ruza oxiridagi havolaga qarang).
Integratsion Testlar uchun Yordamchi Sinflar
Spring TestContext Framework integratsion testlarni yozishni soddalashtiradigan bir nechta abstrakt yordamchi sinflarni taklif etadi. Ushbu asosiy test sinflari test infratuzilmasiga kirish uchun aniq belgilangan interceptors va pluggable hooks, shuningdek, yordamchi obyektlarni o'z ichiga oladi, bu esa quyidagi narsalarga kirish imkonini beradi:
-
ApplicationContext– bean'larni aniq qidirish yoki umuman kontekst holatini test qilish uchun. -
JdbcTemplate– ma'lumotlar bazasiga so'rovlar uchun SQL buyruqlarini bajarish uchun. Siz bunday so'rovlarni ma'lumotlar bazasining holatini kod ilovasi, ma'lumotlar bazasiga tegishli, Spring tomonidan qo'llab-quvvatlanadi va bunday so'rovlar kod ilovasi bilan bir xil tranzaksiyada amalga oshirilishini ta'minlaydi. ORM asboblari bilan birgalikda ishlatilganda, yolg'ondan qochish kerak (ma'ruza oxiridagi havolaga qarang).
Bundan tashqari, siz loyihangiz uchun o'ziga xos bo'lgan barcha sinflar uchun o'z maxsus superklass yaratilishingiz mumkin, bu proekt uchun aniq bo'lgan obyektlar va metodlarni o'z ichiga oladigan.
TestContext Framework haqidagi hamma narsani va uni: "Kontektsni boshqarish/keshini boshqarish", freymevork uchun yordamchi sinflar, shuningdek, test stendlarga dependensiyalarni inject qilish va tranzaktsiyalarni boshqarish xavolasini ko'ring.
GO TO FULL VERSION