Indledning

Dette dokument beskriver en testvejledning for Cprindlæseren. Det forudsættes at projektet er bygget og installeret, og med denne vejledning kan man således afvikle integrations- og performancetests og derved kontrollere robustheden.

CprIndlæseren benytter i vid udstrækning docker til test, for at kunne teste så vidt muligt med de rigtige afhængigheder.

Det overordnede setup er beskrevet i NSP Continuous Integration & Delivery, og det er herved muligt at starte en specifik CprIndlæser med lokalt kørende database samt stamdatakopiregisterservice (SKRS); således at hele flowet kan afprøves lokalt.


Unittest

Der anvendes unittests i CprIndlæseren ved brug af JUnit.

CprIndlæserens unittest-setup er specielt på to punkter, i det der benyttes mocks for at kunne teste Camel, samt at der benyttes TestContainers, således at unittests kan ramme en rigtig lokalt kørende mariadb database kørende i docker (https://www.testcontainers.org).

Unittests kan køres ved at eksekvere

mvn test

Mocking i Camel

I det Camel kører asynkront, er det nødvendigt for unittests at vide, hvornår Camel er færdig med at indlæse en fil, hvis testen skal vide, hvornår den kan kontrollere, om det gik som forventet. Dette gøres i CprIndlæseren, i klassen BaseMockTest, hvor Camel-routen mockes ved at tilføje et sidste MockEndpoint, som en test kan vente på.

Hvis ikke der benyttes mocks til Camel kan man være nødsaget til at indsætte waits, hvilket gør testeksekveringen langsommere, samt kan være afhængig af eksekveringsmaskinens computerkraft.

Unittests med en kørende MariaDb

I det CprIndlæseren selv migrerer databaseskemaet (via Liquibase), samt i overensstemmelse med NSP husregler ikke benytter ORM som Hibernate, er det blevet godkendt at unittests selv starter en mariadb database via docker, og tester ved brug af den.

Der anvendes TestContainers til automatisk at starte en mariadb docker container op, som anvendes ved unittest. 

For eksempel se https://svn.nspop.dk/svn/importers/cprindlaeser/trunk/src/test/java/dk/nsp/indlaeser/cpr/BaseTest.java klassen i CprIndlæser-projektet.

Unittests med en kørende Kafkaserver

Testcontainers anvendes til at starte en Kafkaserver og tilhørende ZooKeeper op. Med en kørende Kafkaserver, er det muligt at teste configurationen af Camel-Kafka og dermed, at events bliver routet gennem Kafka som forventet.

Codecoverage

Efter afvikling af unit-tests genereres en testrapport med Maven-plugin’et JaCoCo. Rapporten kan ses ved at åbne følgende fil i en browser target/site/jacoco/index.html.

Rapporten dækker selve CprIndlæseren. Codecoverage er minimum 79%. Der henvises til JaCoCo testrapporten for yderligere information vedr. coverage. Bemærk at JaCoCo ikke kan verificere linjer, der kaster exceptions, og at sådanne linjer altid vil stå som missed.

Pr. 18. februar 2021 er coverage 82%.

Integrationstests

Tests til integrationstests markeres i koden med en custom testkategori og projektet sættes op så disse køres som beskrevet nedenfor.

Disse tests kræver at indlæseren samt de korrekte afhængigheder allerede kører, hvilket typisk laves via docker-compose. For CprIndlæseren er compose/development/docker-compose.yml lavet således, at denne starter en CprIndlæser, database samt SKRS i en opsætning, som kan testes via integrationstestene. Så man kan starte denne docker-compose fil lokalt (docker-compose up) og så ved siden af køre integrationstestene, som vil lægge en fil op, vente på at den bliver indlæst, og herefter se efter i både database samt SKRS om indlæsningerne er gået godt.


Inden docker-compose setup'et startes, skal projektet bygges. Det gøres med følgende kommando fra projektroden:

mvn clean install -DskipTests=true

Når projektet er  bygget startes et lokalt udviklingmiljø op med kommandoen:

docker-compose -f compose/development/docker-compose.yml up -- build

Bemærk: Det kan tage op mod et minut før containeren er klar. De nødvendige databaser bliver oprettet automatisk.

Herefter kan selve integrationstest afvikles:

mvn verify -Pintegrationtest