Ertu að leita að leið til að gera prófanir auðveldari? Við erum hér fyrir þig! Skoðaðu eftirfarandi grein og lærðu hvernig þú getur gert það mögulegt.
Hér er tómt.
Nútíma forritunarþróun byggir á einni einfaldri reglu:
Notaðu samsetningu
Við setjum klasa, fall og þjónustur saman í stærri hugbúnaðareiningar. Þessi síðasti þáttur er undirstaða örþjónustur og sexhyrnd byggingarlist. Við viljum nota núverandi lausnir, samþætta þær við hugbúnaðinn okkar og fara beint á markaður.
Viltu sjá um notendaskráningu og vista notendur? gögn? Þú getur valið einn af OAuth-þjónustunum. Kannski býður forritið þitt upp á áskrift eða greiðslu? Það eru margar þjónustur sem geta hjálpað þér að takast á við þetta. Vantar þig greiningu á vefsíðunni þinni en þú skilur ekki Persónuverndarreglugerð ESB? Endilega taktu eina af tilbúnum lausnum.
Eitthvað sem gerir þróun svo auðvelda úr viðskiptalegu sjónarhorni getur gefið þér höfuðverk – augnablikið þegar þú þarft að skrifa einfalt próf.
Frábæru dýrin: biðraðir, gagnagrunnar og hvernig á að prófa þær
Einingaprófanir eru nokkuð einfaldar. Ef þú fylgir bara reglum, þá verður prófunarumhverfi þitt og kóði eru heilbrigðir. Hvaða reglur eru það?
Auðvelt að skrifa – einingapróf ætti að vera auðvelt að skrifa því þú skrifar mörg þeirra. Minni fyrirhöfn þýðir að fleiri próf eru skrifuð.
Læsilegt – Prófunarkóðinn ætti að vera auðlesinn. Prófið er saga. Það lýsir hegðun hugbúnaðarins og má nota sem skammleiðingu í skjölun. Góð einingapróf hjálpar þér að laga villur án þess að þurfa að rekja kóðann.
Áreiðanlegur – prófið ætti að mistakast aðeins ef villa er í kerfinu sem verið er að prófa. Augljóst? Ekki alltaf. Stundum standast próf ef þú keyrir þau eitt og eitt en mistakast þegar þau eru keyrð sem heild. Þau standast á þinni vél en mistakast á CI (Virkar á tölvunni minni). Góð einingapróf hefur aðeins eina orsök misheppnunar.
hratt – Prófanir ættu að vera hraðar. Undirbúningur til að keyra, ræsa og framkvæma prófanir sjálfar ætti að vera mjög snöggur. Annars munt þú skrifa þær en ekki keyra. Hægar prófanir þýða tapaða einbeitingu. Þú bíður og horfir á framvindulínuna.
Sjálfstæður – að lokum ætti prófið að vera sjálfstætt. Þessi regla leiðir af hinum fyrri. Einungis sannarlega sjálfstæð próf geta orðið eining. Þau trufla ekki hvert annað, má keyra þau í hvaða röð sem er og hugsanleg mistök ráðast ekki af niðurstöðum annarra prófa. Sjálfstætt þýðir einnig að ekki sé háð neinum utanaðkomandi auðlindum, svo sem gagnagrunnum, skilaboðakerfum eða skráarkerfi. Ef þú þarft að eiga samskipti við utanaðkomandi hluti geturðu notað mock-hluti, stubba eða dummy-hluti.
Allt verður flókið þegar við viljum skrifa einhverjar samþættingaprófanir. Það er ekki slæmt ef við viljum prófa nokkur þjónustu saman. En þegar við þurfum að prófa þjónustu sem nota utanaðkomandi auðlindir eins og gagnagrunna eða skilaboðþjónustu, þá erum við að leita í vandræði.
Til að keyra prófið þarftu að setja upp…
Fyrir mörgum árum, þegar við vildum búa til samþættingartest og nota t.d. gagnagrunna, höfðum við tvo valkosti:
Við getum sett upp gagnagrunn staðbundið. Stillum upp skema og tengjumst því úr prófinu okkar;
Við getum tengst núverandi eintaki „einhvers staðar í geimnum”.
Bæði voru kostir og gallar. En bæði bæta við auknum flækjustigi. Stundum var um tæknilega flækju að ræða sem stafaði af eiginleikum ákveðinna verkfæra, t.d. uppsetningu og stjórnun Oracle gagnagrunns á þínum eigin tölvu (localhost). Stundum var um óþægindi í ferlinu að ræða, t.d. þú þarft að samþykkja prófið. lið um notkun JMS… í hvert skipti sem þú vilt keyra prófanir.
Ílátin til bjargar
Á síðustu tíu árum hefur hugmyndin um ílátavæðingu öðlast viðurkenningu í greininni. Því er eðlileg ákvörðun að velja ílát sem lausn á samþættingartestvandamálinu okkar. Þetta er einföld, hrein lausn. Þú keyrir bara ferlið þitt og allt virkar! Geturðu ekki trúað því? Skoðaðu þessa einföldu uppsetningu á Maven-smíði:
com.dkanejs.maven.plugins
docker-compose-maven-plugin
4.0.0
up
test-compile
up
${verkefni.basedir}/docker-compose.yml
true
down
post-integration-test
down
${project.basedir}/docker-compose.yml
true
Og hinn docker-compose.yml Skráin lítur líka ansi vel út!
Dæmið hér að ofan er mjög einfalt. Aðeins ein PostgreSQL-gagnagrunnur, pgAdmin og það er allt. Þegar þú keyrir
bash
$ mvn clean verify
Þá ræsir Maven-viðbótin gámana og slökkvir á þeim eftir prófin. Vandamálin hefjast þegar verkefnið vex og compose-skráin okkar vex líka. Í hvert sinn þarftu að ræsa alla gáma og þeir verða virkir allan byggingarferilinn. Þú getur bætt aðeins úr ástandinu með því að breyta stillingum á keyrslu viðbótarinnar, en það dugar ekki. Í versta falli tæma gámarnir kerfisstauðu auðlindir áður en prófin hefjast!
Og þetta er ekki eina vandamálið. Þú getur ekki keyrt eina einustu samþættingaprófun úr IDE-inu þínu. Áður en þú gerir það þarftu að ræsa gámana handvirkt. Enn fremur mun næsta Maven-keyrsla rífa niður þá gáma (sjáðu á niður framkvæmd).
Þannig að þessi lausn er eins og stórt flutningaskip. Ef allt gengur vel, þá er allt í lagi. Öll óvænt eða óvenjuleg hegðun leiðir til okkur til einhvers konar hörmungar.
Prófunarkerfi – keyra kerfi úr prófunum
En hvað ef við gætum keyrt gámana okkar úr prófunum? Þessi hugmynd lítur vel út og er þegar í framkvæmd. Prófunarílát, því við erum að tala um þetta verkefni, hér er lausn á vandamálum okkar. Ekki fullkomið, en enginn er fullkominn.
Þetta er Java bókasafn sem styður JUnit- og Spock-prófanir og býður upp á léttar og auðveldlega leiðir til að keyra þær Docker ílát. Skoðum það og skrifum smá kóða!
Forsendur og stillingar
Áður en við byrjum, þurfum við að athuga stillingarnar okkar. Prófunarílát þörf:
Docker í útgáfu v17.09,
Java lágmarksútgáfa 1.8,
Aðgangur að neti, sérstaklega að docker.hub.
Meira um kröfur fyrir tilteknar stýrikerfi og CI má finna í Skjalagerð.
Nú er kominn tími til að bæta nokkrum línum við pom.xml.
org.testcontainers
testcontainers-bom
${testcontaines.version}
pom
import
org.postgresql
postgresql
runtime
org.testcontainers
postgresql
test
org.testcontainers
junit-jupiter
test
Ég nota Prófunarílát útgáfa 1.17.3, en endilega notaðu nýjasta.
Prófanir með Postgres-íláti
Fyrsta skrefið er að undirbúa eintak af íláti okkar. Þú getur gert það beint í prófinu, en sjálfstætt flokkur lítur betur út.
public class Postgres13TC extends PostgreSQLContainer {
private static final Postgres13TC TC = new Postgres13TC();
private Postgres13TC() {
super("postgres:13.2");
}
public static Postgres13TC getInstance() {
return TC;
}
@Override
public void start() {
super.start();
System.setProperty("DB_URL", TC.getJdbcUrl());
System.setProperty("DB_USERNAME", TC.getUsername());
System.setProperty("DB_PASSWORD", TC.getPassword());
}
@Override
public void stop() {
// gera ekkert. Þetta er deilt eintak. Látið JVM sjá um þessa aðgerð.
}
}
Í upphafi prófanna munum við búa til eintak af Postgres13TC. Þessi bekkur getur meðhöndlað upplýsingar um ílátið okkar. Mikilvægast hér eru tengistrengir gagnagrunnsins og auðkenni. Nú er kominn tími til að skrifa mjög einfalt próf.
Ég nota JUnit 5 hér. Athugasemd @Testcontainers er hluti af viðbótunum sem stýra ílátum í prófunarumhverfinu. Þær finna öll reitina með @Ílát athugasemd og byrjunar- og stöðvunarkassa í sömu röð.
Prófanir með Spring Boot
Eins og ég nefndi áður nota ég Spring Boot í verkefninu. Í þessu tilfelli þurfum við að skrifa aðeins meira kóða. Fyrsta skrefið er að búa til viðbótar stillingaklass.
Þessi bekkur skiptir út núverandi eiginleikum með gildum úr the prófunarílát. Fyrstu þrír eiginleikarnir eru staðlaðir Spring-eiginleikar. Næstu fimm eru viðbótareiginleikar sem hægt er að nota til að stilla aðra auðlinda og viðbætur, til dæmis Liquibase:
Nú er kominn tími til að skilgreina einfalt samþættingapróf.
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initializers = ContainerInit.class)
@Testcontainers
class DummyRepositoryTest {
@Autowired
private DummyRepository;
@Test
void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = new Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
Við höfum nokkrar viðbótarathugasemdir hér.
@SpringBootTest(webEnvironment = RANDOM_PORT) – merkir prófið sem Spring Boot-próf og ræsir Spring-samhengi.
@AutoConfigureTestDatabase(replace = NONE) – þessar athugasemdir segja að spring test viðbótin ætti ekki að skipta út postgres gagnagrunnsstillingu fyrir H2 í minnisstillingu.
@ContextConfiguration(initializers = ContainerInit.class) – auka vor samhengi Uppsetning þar sem við stillum eiginleika frá Prófunarílát.
@Testcontainers – eins og áður hefur verið nefnt, stýrir þessi athugasemd lífsferli ílátsins.
Í þessu dæmi nota ég reactive-geymslur, en það virkar á sama hátt með venjulegum JDBC- og JPA-geymslum.
Nú getum við keyrt þessa prófun. Ef þetta er fyrsta keyrslan þarf vélin að sækja myndir af docker.hub. Það gæti tekið smá stund. Eftir það munum við sjá að tveir gámar hafa keyrt. Annar er postgres og hinn er Testcontainers-stýringarvélin. Sú seinni gámur sér um að keyra gámana og jafnvel þótt JVM stöðvist óvænt, slökkur hann á gámunum og hreinsar umhverfið.
Skulum draga saman
Prófunarílát eru mjög notendavæn verkfæri sem hjálpa okkur að búa til samþættingapróf sem nota Docker-ílát. Það gefur okkur meiri sveigjanleika og eykur þróunarhraða. Rétt uppsetning próffæribúnaðar dregur úr þeim tíma sem þarf til að taka nýja þróunaraðila inn í teymið. Þeir þurfa ekki að setja upp öll háðakerfi, heldur eingöngu keyra skrifuðu prófin með valin stillingarskrár.