Bandymų su Quarkus ir Liquibase iššūkių įveikimas
Veiksmingų integravimo testų rašymas yra būtinas norint užtikrinti šiuolaikinių programų stabilumą, ypač naudojant tokias technologijas kaip Kvarkusas, Bandymo konteineriai, ir Liquibase. Tačiau procesas ne visada yra paprastas. Kūrėjai dažnai susiduria su netikėtais iššūkiais, tokiais kaip išteklių konfliktai arba netinkama konfigūracija.
Viena dažna problema iškyla dirbant su duomenų bazių perkėlimu bandymuose. Įsivaizduokite, kad praleidžiate valandas konfigūruodami Liquibase, kad suprastumėte, jog jūsų perkėlimo scenarijai veikia viename duomenų bazės konteineryje, o jūsų programa prisijungia prie kito. Apmaudu, tiesa? 🐛
Šiame įraše pasidalinsiu savo patirtimi sprendžiant panašų iššūkį: integracijos testų vykdymą Quarkus programoje su Test Containers ir Liquibase. Ypatingas elgesys, kurį pastebėjau, buvo tai, kad buvo kuriami keli duomenų bazės konteineriai, todėl bandymai nepavyko. Šiame įraše bus aptariamas derinimas ir šios problemos sprendimas.
Jei kada nors susidūrėte su tokiomis problemomis, nesate vieni. Žingsnis po žingsnio išnagrinėsime, kaip nustatyti pagrindinę priežastį ir užtikrinti, kad jūsų testai veiktų sklandžiai. Turėdami veiksmingą pavyzdį ir praktinius patarimus, galėsite išvengti įprastų spąstų ir sukurti patikimus integravimo testus. 🚀
komandą | Naudojimo pavyzdys |
---|---|
QuarkusTestResource | Naudojamas norint užregistruoti pasirinktinį bandymo išteklių gyvavimo ciklo tvarkyklę, pvz., PostgreSQLTestResource, kad būtų galima valdyti išorines priklausomybes atliekant Quarkus testus. |
withReuse(true) | „TestContainers“ metodas, leidžiantis pakartotinai naudoti konteinerį atliekant kelis bandymus, sumažinant paleisties laiką, kai pakartotinai naudojamas duomenų bazės konteineris. |
QuarkusTestProfile | Apibrėžia pasirinktinį testavimo profilį, skirtą tam tikroms konfigūracijoms nepaisyti, pvz., kito konfigūracijos failo kelio arba profilio ypatybių nustatymui. |
withDatabaseName | Nustato duomenų bazės, sukurtos PostgreSQL konteineryje, pavadinimą. Naudinga nustatant konkrečių testų duomenų bazės egzempliorius. |
given() | RestAssured metodas, naudojamas bandymams siųsti HTTP užklausas, leidžiančias patvirtinti galutinius taškus ir atsakymo duomenis. |
then() | Sujungiama po užklausos RestAssured patvirtinti atsakymo būseną arba turinį. Pavyzdžiui, tikrinti būsenos kodus arba duomenų formatus. |
Map.of | Metodas, įdiegtas „Java 9“, skirtas glaustai sukurti nekintamus žemėlapius, čia naudojamas bandomojo profilio konfigūracijos ypatybėms apibrėžti. |
getJdbcUrl | Grąžina JDBC ryšio eilutę, skirtą „PostgreSQL TestContainer“, užtikrinant, kad programa prisijungtų prie tinkamo sudėtinio rodinio. |
@QuarkusTest | Anotacija, naudojama bandymui atlikti Quarkus sistemos aplinkoje, leidžianti įterpti priklausomybę ir specifines Quarkus funkcijas testuose. |
@TestProfile | Susieja bandymo klasę su konkrečiu Quarkus testo profiliu, užtikrinant, kad atliekant bandymą būtų taikoma tinkama konfigūracija. |
Kaip išspręsti „Liquibase“ ir „TestContainers“ konfliktus „Quarkus“.
Anksčiau pateikti scenarijai demonstruoja praktinį požiūrį į integracijos testavimo valdymą Quarkus programoje naudojant TestContainers ir Liquibase. Pagrindinis tikslas yra užtikrinti, kad jūsų programa sąveikautų su tuo pačiu duomenų bazės konteineriu, kuriame „Liquibase“ vykdo perkėlimo scenarijus. Tai pasiekiama sukuriant tinkintą gyvavimo ciklo tvarkyklę „PostgreSQLTestResource“, kuri programiškai paleidžia „PostgreSQL“ konteinerį ir pateikia jo konfigūracijos informaciją bandomai „Quarkus“ programai. Taip išvengiama įprastų sunkumų, kai programa netyčia sukuria antrą konteinerį, o tai gali sukelti neatitikimų. 🚀
Naudojant metodą „withReuse(true)“ užtikrinama, kad „PostgreSQL“ konteineris išliktų aktyvus tarp bandymų, sumažinant kiekvieno bandymo atvejo konteinerių iš naujo paleidimo išlaidas. Tai ypač naudinga tais atvejais, kai kelios bandymo klasės turi pasiekti tą pačią duomenų bazės būseną. Pasirinktinis „TestProfileResolver“ užtikrina nuoseklumą, nurodydamas „Quarkus“ į teisingą konfigūracijos failą ir nepaisydamas tam tikrų ypatybių, pvz., duomenų bazės URL ir „Liquibase“ konfigūracijos, kad atitiktų bandymo sudėtinio rodinio sąranką. Išsaugodami vieną tiesos šaltinį konfigūracijai, sumažinate klaidas, kurias sukelia nesuderinamos aplinkos.
Bandymo scenarijuje „XServiceTest“ komentaras „@QuarkusTestResource“ susieja pasirinktinį bandymo šaltinį su bandymo klase. Tai labai svarbu įterpiant konteinerio konfigūracijas vykdymo metu, užtikrinant, kad programa ir „Liquibase“ veiktų tame pačiame duomenų bazės egzemplioriuje. Be to, anotacija „@Inject“ naudojama „XTypeVersionService“ – paslaugai, kuri sąveikauja su duomenų baze, prijungti. Vykdydami bandomąjį atvejį „getXTypeVersion“, patvirtinate, kad duomenų bazėje yra laukiami duomenys po perkėlimo, ir patvirtinate, kad „Liquibase“ sėkmingai vykdoma tinkamame konteineryje.
Įsivaizduokite, kad vykdote testą, tikėdamiesi, kad visos paslaugos bus suderintos, bet nerasite rezultatų dėl netinkamos konfigūracijos – tai gali sukelti sugaištą derinimo laiką. Šie scenarijai skirti užkirsti kelią tokiems scenarijams, aiškiai valdydami bandomosios aplinkos gyvavimo ciklą ir užtikrindami nuoseklų elgesį. Be to, tokie įrankiai kaip „RestAssured“ patvirtina API galinius taškus, įgalindami viso krūvos bandymo scenarijų, kai patikrinama ir vidinė migracija, ir sąsajos sąveika. Naudodami šias konfigūracijas galite sukurti patikimesnius bandymus, pašalinti aplinkos neatitikimus ir užtikrinti, kad jūsų komandos testavimo sistema būtų kuo veiksmingesnė. 🔧
Tinkamos „Liquibase“ ir „TestContainers“ integracijos užtikrinimas „Quarkus“.
Backend sprendimas naudojant Quarkus su TestContainers PostgreSQL ir Liquibase migracijai valdyti. Šis scenarijus išsprendžia sudėtinio rodinio nesutapimo problemas.
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.utility.DockerImageName;
import java.util.HashMap;
import java.util.Map;
public class PostgreSQLTestResource implements QuarkusTestResourceLifecycleManager {
private static PostgreSQLContainer<?> postgreSQLContainer;
@Override
public Map<String, String> start() {
postgreSQLContainer = new PostgreSQLContainer<>(DockerImageName.parse("postgres:alpine"))
.withDatabaseName("test")
.withUsername("postgres")
.withPassword("password")
.withReuse(true);
postgreSQLContainer.start();
Map<String, String> config = new HashMap<>();
config.put("quarkus.datasource.jdbc.url", postgreSQLContainer.getJdbcUrl());
config.put("quarkus.datasource.username", postgreSQLContainer.getUsername());
config.put("quarkus.datasource.password", postgreSQLContainer.getPassword());
return config;
}
@Override
public void stop() {
if (postgreSQLContainer != null) {
postgreSQLContainer.stop();
}
}
}
Programos-Liquibase integracijos patvirtinimas naudojant vienetų testus
Modulinis ir daugkartinio naudojimo Quarkus testo pavyzdys, kuris patikrina duomenų bazės ryšį ir perkėlimo scenarijaus vykdymą.
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
@QuarkusTest
@TestProfile(TestProfileResolver.class)
public class XServiceTest {
@Inject
XTypeVersionService xTypeVersionService;
@Test
public void getXTypeVersion() {
List<XTypeVersionEntity> entities = xTypeVersionService.get();
assertFalse(entities.isEmpty(), "The entity list should not be empty.");
}
}
Konfigūracijos nuoseklumo užtikrinimas visuose bandymo profiliuose
Pasirinktinė bandymo profilio konfigūracija, užtikrinanti Liquibase ir taikomųjų programų konteinerių suderinimą.
public class TestProfileResolver implements QuarkusTestProfile {
@Override
public String getConfigProfile() {
return "test";
}
@Override
public Map<String, String> getConfigOverrides() {
return Map.of("quarkus.config.locations", "src/test/resources/application.yaml");
}
}
Front-End modeliavimas duomenų patvirtinimui
Dinaminis sąsajos kodo fragmentas, užtikrinantis, kad duomenys iš duomenų bazės integravimo būtų tinkamai rodomi.
fetch('/api/xTypeVersion')
.then(response => response.json())
.then(data => {
const list = document.getElementById('entity-list');
data.forEach(entity => {
const item = document.createElement('li');
item.textContent = entity.name;
list.appendChild(item);
});
})
.catch(error => console.error('Error fetching data:', error));
Užpakalinės ir priekinės dalies nuoseklumo vienetų testai
Bandomųjų scenarijų pavyzdžiai, skirti patvirtinti užpakalinės sistemos logiką ir sąsajos integraciją su bandymo duomenimis.
import org.junit.jupiter.api.Test;
public class FrontEndValidationTest {
@Test
public void fetchData() {
given().when().get("/api/xTypeVersion")
.then().statusCode(200)
.body("size()", greaterThan(0));
}
}
Duomenų bazės integravimo optimizavimas Quarkus testams
Dirbant su integravimo testais Quarkus aplinkoje, labai svarbu veiksmingai spręsti duomenų bazės konteinerių valdymą. Viena dažna problema kyla dėl nesutampančių konteinerių tarp programos ir perkėlimo įrankių, pvz., Liquibase. Pagrindinis sprendimas yra sverto panaudojimas TestContainers biblioteka, kuri užtikrina, kad jūsų programa ir perkėlimo scenarijai veiktų tame pačiame konteineryje. Taikant šį metodą išvengiama pasikartojančių konteinerių kūrimo ir konfigūracijos išlaikomos suderintos per visą bandymo gyvavimo ciklą. 🎯
Kitas svarbus aspektas, į kurį reikia atsižvelgti, yra migracijos strategija. Daugeliu atvejų kūrėjai bandymų metu naudoja „numesk ir sukurk“ strategiją, kad užtikrintų naują duomenų bazės būseną. Tačiau galbūt norėsite į duomenų bazę įtraukti bandymų duomenis naudodami „Liquibase“. Norėdami tai padaryti efektyviai, įtraukite inicijavimo SQL scenarijų ir sukonfigūruokite jį naudodami ypatybę „TC_INITSCRIPT“. Šis metodas užtikrina, kad ir duomenų bazės struktūra, ir reikalingi bandymo duomenys būtų paruošti prieš atliekant bandymus, pašalinant klaidas, atsirandančias dėl trūkstamų įrašų.
Galiausiai stebėjimo žurnalai gali būti išgelbėjimas. Tiek „Quarkus“, tiek „Liquibase“ pateikia išsamias registravimo parinktis, kurios gali padėti derinti ryšio problemas arba netinkamas konfigūracijas. Nustatę atitinkamus žurnalo lygius, galite stebėti, ar Liquibase scenarijai veikia taip, kaip tikėtasi, ir patikrinti URL adresus, naudojamus prisijungti prie duomenų bazės. Šis matomumo lygis yra būtinas norint išspręsti bet kokius konfliktus, kylančius atliekant bandymą, padedant sukurti patikimą testavimo sistemą. 🚀
DUK apie Quarkus, TestContainers ir Liquibase integraciją
- Koks yra vaidmuo TestContainers integracijos testuose?
- TestContainers padeda valdyti izoliuotus duomenų bazės atvejus testavimo metu, užtikrinant nuoseklią aplinką.
- Kodėl man reikia withReuse(true) komandą?
- The withReuse(true) komanda leidžia pakartotinai naudoti tą patį konteinerį atliekant kelis bandymus, taupant išteklius ir sąrankos laiką.
- Koks yra tikslas TC_INITSCRIPT nuosavybė?
- The TC_INITSCRIPT ypatybė nurodo inicijavimo SQL scenarijų, kad būtų galima pradėti duomenų bazę paleidžiant konteinerį.
- Kaip užtikrinti, kad „Liquibase“ perkėlimas būtų pritaikytas tinkamai?
- Konfigūruodami quarkus.liquibase.jdbc.url ypatybę, galite užtikrinti, kad „Liquibase“ naudotų tą patį duomenų bazės konteinerį kaip ir programa.
- Kokius žurnalo lygius turėčiau naudoti derinimui?
- Nustatyti TRACE arba DEBUG lygiai, skirti Liquibase ir TestContainers stebėti duomenų bazės operacijas ir perkėlimą.
- Kaip galiu išbandyti API atsakymus su pradiniais duomenimis?
- Naudokite tokius įrankius kaip RestAssured siųsti užklausas galutiniams taškams ir patikrinti, ar pateikti duomenys atitinka bandymo duomenis.
- Ką daro @QuarkusTestResource anotacija daryti?
- The @QuarkusTestResource anotacija registruoja pasirinktinį gyvavimo ciklo tvarkyklę išorinėms priklausomybėms, pvz., duomenų bazėms.
- Kodėl man reikia pasirinktinio TestProfileResolver?
- Tai užtikrina, kad būtų įkeltos teisingos konfigūracijos, kad būtų galima atlikti testą, suderinti aplinkos kintamuosius ir išteklius.
- Kaip nustatyti, ar kuriami keli konteineriai?
- Patikrinkite „Docker Desktop“ arba stebėkite konsolės žurnalus, ar nėra pasikartojančių konteinerių egzempliorių ir atitinkamų jų prievadų.
- Koks yra geriausias būdas išvalyti bandymo išteklius?
- Nepaisyti stop savo gyvavimo ciklo tvarkytuvėje, kad sustabdytumėte ir pašalintumėte konteinerį, kai bus baigti bandymai.
Pagrindiniai bandymų konfliktų sprendimo būdai
Norint užtikrinti, kad perkėlimas ir duomenų bazės sąveika būtų suderinta, norint atlikti integracijos testavimą su Quarkus, Liquibase ir TestContainers reikia kruopščiai nustatyti. Tinkindami bandomųjų išteklių tvarkyklę ir naudodami vieningą konfigūraciją, galite pašalinti konfliktus tarp „Liquibase“ naudojamų konteinerių ir programos.
Šie veiksmai padeda supaprastinti testavimo procesą, todėl lengviau derinti ir patvirtinti testus. Nepamirškite naudoti išsamių žurnalų, pvz., įgalinimo TRACE Liquibase, kad galėtumėte stebėti savo testų veikimą ir anksti pašalinti neatitikimus. Taikydami šį metodą galite užtikrintai kurti keičiamus ir prižiūrimus testus. 🐛
Šaltiniai ir nuorodos testavimui naudojant Quarkus, Liquibase ir TestContainers
- Išsamiau aptariamas naudojimas Liquibase duomenų bazės perkėlimui valdyti testavimo metu. Žiūrėkite oficialią dokumentaciją: Liquibase dokumentacija .
- Aprašoma, kaip TestContainers suteikia dinamišką konteinerinę aplinką bandymams. Nuoroda: TestContainers oficiali svetainė .
- Aptaria pažangius testavimo modelius Kvarkusas, įskaitant bandymų profilius ir gyvavimo ciklo valdymą. Sužinokite daugiau čia: Quarkus testavimo vadovas .
- Paaiškinama, kaip spręsti integravimo problemas, susijusias su keliais sudėtiniais rodiniais. Bendruomenės ištekliai: StackOverflow TestContainers žyma .
- Papildomos įžvalgos apie PostgreSQL konfigūracija TestContainers: TestContainers PostgreSQL modulis .