Nais applikasjon som kjører integrasjonstester for applikasjoner som er deployet på cloud "on-premise"
Funksjonelle tester av bidrag nais applikasjoner som er designet for å kunne kjøre en "sanity check" på en laptop som har innstallert naisdevice og vil gjelde applikasjoner som kjører på cloud "on-premise"
Modulen er skrevet i Kotlin som gjør det enkelt å skape lett-leselige tester satt opp med Gherkin
-filer (*.feature) som har norsk tekst og ligger i
src/main/resources/<no.nav.bidrag.cucumber.onprem.pakkenavn>
BDD (Behaviour driven development) beskrives i Gherkin
-filene (*.feature
) som kjører automatiserte tester på bakgrunnen av funksjonaliteten som
skal støttes. Eks: på en gherkin
fil på norsk
01: # language: no
02 @oppslagstjenesten
03: Egenskap: oppslagstjeneste
04: <detaljert beskrivelse av egenskapen>
05:
06: Scenario: fant ikke person
07: Gitt liste over "tidligere ansatte"
09: Når man forsøker å finne "Ola"
09: Så skal svaret være "Ola" er ikke ansatt her
10:
11: Scenario: fant person
12: Gitt liste over "ansatte"
13: Når man forsøker å finne "Per"
14: Så skal svaret være "Per" er i "kantina"
Kort forklart:
- linje 1: språk
- linje 2: "tag" av test
- linje 3: egenskapen som testes (feature)
- linje 4: tekstlig beskrivelse av egenskapen
- linje 6: et scenario som denne egenskapen skal støtte
- linje 7: "Gitt" en ressurs
- linje 8: "Når" man utfører noe
- linje 9: "Så" forventer man et resultat
- linje 11: et annet scenario som denne egenskapen skal støtte
- linje 12-14: "Gitt" - "Når" - "Så": forventet oppførsel til dette scenarioet
Norske kodeord for gherkin
: Gitt
- Når
- Så
er de fremste kodeordene for norsk BDD. Alle norske nøkkelord som kan brukes i gherkin
-filer
er Egenskap
, Bakgrunn
, Scenario
, Eksepmel
, Abstrakt scenario
, Gitt
, Når
, Og
, Men
, Så
, Eksempler
Cucumber støtter flere språk og for mer detaljert oversikt over funksjonaliteten som gherkin
gir, se detaljert beskrivelse på nett:
https://cucumber.io/docs/gherkin/reference/
Et scenario for en nais applikasjon er implementert på følgende måte:
- en
*.feature
som er tagget, eks@<tag>
, må ha en ingress for en nais applikasjon som brukes i feature - scenario-steget
Gitt nais applikasjon 'bidrag-sak'
vil bruke ingressen som er oppgitt for nais applikasjonen som i dette tilfellet erbidrag-sak
- hvis en tag ikke er en nais applikasjon blant ingressen(e) som oppgies så må den nevnes i egen liste over tags som skal brukes
Nedenfor så vises de nødvendige input for kjøring (1 og 2):
- ingress som skal testes
- tag som bruker denne ingressen
- hvis ingressen til applikasjon også skal fungere som en tag, brukes
ingress@tag:<nais applikasjon>
- det finnes en egen liste for å liste opp tags,
tags
- PS! det er standard at appnavn blir brukt som context path etter ingress. Hvis det ikke skal gjøres må
noContextPathForApps
også listes opp
Dette er hva som må til for å kjøre testing av en applikasjon som ikke har sikkerhet. Når applikasjonen har sikkerhet implementert, må også en testbruker angies.
- testbruker (for simulering av nav-ident, bruker med sikkerhet implementert i Azure)
Hvis kjøring av denne applikasjonen gjøres lokalt (fra naisdevice) og mot en applikasjon som kjører under sikkerhet, så kan en fullstendig testkjøring
ikke gjøres uten at azure token blir send med når testen starter. Azure Ad brukes for å lage sikkerhetstoken for testbruker. Det er derfor nødvendig
med et ekstra parameter som forteller bidrag-cucumber-onprem
at testbruker har et manuelt generert sikkerhetstoken eller kjøringen er en "sanity
check" for å teste at den tekniske implementasjonen til cucumber er ok.
- securityToken
- sanityCheck=true
Disse verdiene sendes som json til test-endepunkt, se avsnittet om Kjøring lokalt
. Eksempel på en slik json (sanityCheck, noContextPathForApps, tags,
navUsername og testUser er valgfri):
{
"ingressesForApps": [
"<ingress>@tag:app.a/tag.1>",
"<ingress>@tag:app.b/tag.2>",
"<ingress>@app.c>"
],
"tags": [
"<@tag.3>"
],
"noContextPathForApps": [
"<app.b>"
],
"testUser": "z123456",
"navUsername": "x123456",
"sanityCheck": true,
"securityToken": "<isso token for testbruker>"
}
Lokalt på et naisdevice, vil sanity check av en cucumber test være alt som er mulig hvis ikke et sikkerhetstoken blir manuelt generert og sendt med som input til testen. Applikasjonene som testes via denne applikasjonen er for applikasjoner deployet "on premise" og ikke krever zero-trust satt opp.
json | Beskrivelse | Kommentar |
---|---|---|
ingressesForApps |
kommaseparert liste over ingress og nais-applikasjon som testes | Eks:https://[email protected],https://[email protected] |
noContextPathForApps |
kommaseparert liste over applikasjoner (fra ingressesForApps ) som ikke bruker appnavn som context-path etter ingress |
|
tags |
kommaseparert liste over tags som skal kjøres (som ikke nevnes blant ingressene ala https://some-app@tag:some-name) | |
testUser |
Testbruker (saksbehandler) med ident ala z123456 | unødvendig for sanity check, men må brukes med securityToken (hvis kjøring lokalt). |
navUsername |
Reell bruker som må være med når man ønsker å hente gyldig token for testbruker |
Testbruker simulerer en saksbehandler hos NAV. Testbrukeren må ha et gyldig brukernavn og passord. Dette er en såkalt Z-bruker og det må sørges for at den har et gyldig passord og at "two factor authentication" er slått av for brukeren.
Ved kjøring lokalt kan det vøre ønskelig å bare teste at det tekniske "fungerer". Dette kan gjøres ved å sette miljøvariabelen SANITY_CHECK=true
. Da
vil bare resultatene fra operasjoner logges til konsoll i stedet for at den aktuelle sjekken gjøres.
SECURITY_TOKEN
- manuelt generert sikkerhetstoken for testbruker, Den kan også sendes med json til test-endpoint når testing foregår via lokal
spring-boot
SANITY_CHECK=true
- for tjenester som har implementert sikkerhet, så kan denne settes slik at selve sjekken bare logges til konsoll og ikke feiler.
Den kan også sendes med json til test-endpoint når testing foregår via lokal spring-boot
PS! Når du ikke sender med SANITY_CHECK=true
, så må du sende med SECURITY_TOKEN
(evt. fullstendig authentisering).
mvn exec:java \
-DSANITY_CHECK=true \
-DSECURITY_TOKEN=<isso generert id-token> \
-DNAV_USERNAME="<nav bruker ala x123456> \
-DTEST_USER="<test bruker ala z123456> \
-DSECURITY_TOKEN="<abc...xyz> \
-DINGRESSES_FOR_APPS=<ingress@app1,ingress@app2> \
-DTAGS=<@tag1>,<@tagp2> \
-Dexec.mainClass=no.nav.bidrag.cucumber.BidragCucumberOnprem
NB
- Fjern
-DSANITY_CHECK
(eller sett den til-DSANITY_CHECH=false
) hvis du vil kjøre en fullskala test. - Når
-DSANITY_CHECK=true
vil det være unødvendig å bruke-DTEST_USER
,-DNAV_USERNAME
og-DSECURITY_TOKEN
. - Når
-DSANITY_CHECK=false
(eller-DSANITY_CHECK
ikke er med) må man ha med-DTEST_USER
,-DNAV_USERNAME
og-DSECURITY_TOKEN
.
- åpne terminal og kjør kommandoen
mvn spring-boot:run
- for sanity check, åpne ny terminal kjør kommandoen
curl -X 'POST' http://localhost:8080/bidrag-cucumber-onprem/run \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d '{"tags":["@tag1","@tag2"],"sanityCheck":true,"ingressesForApps":["<ingress.som.testes@tag:navn>"]}' \
- for fullstendig test, åpne ny terminal og kjør kommandoen
curl -X 'POST' http://localhost:8080/bidrag-cucumber-onprem/run \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d '{"tags":["@tag1","@tag2"],"testUsername":"<z123456>","ingressesForApps":["<ingress.som.testes@tag:navn>"],"securityToken"="<security token (uten Bearer)}'
Man kan ogå bruke IntelliJ til å kjøre cucumber testene direkte. IntelliJ har innebygd støtte for cucumber (java), men hvis du vil navigere i koden ut
fra testene som kjøres, så bør du installere plugin Cucumber Kotlin
(IntelliJ settings/prefrences -> Plugins)
- alle testene: høyreklikk på prosjektet og velg
Run 'All features in bidrag-cucumber-onprem'
- en feature: høyreklikk på feature-fil, eks
sak.feature
prosjektet og velgRun 'Feature: ...'
NB!
Husk å legg inn miljøvariablene SANITY_CHECK
og INGRESSES_FOR_APPS
i Edit Configurations...
under Run
-drop down menyen...
Det anbefales at man lagrer ovennevnte konfigurasjon, slik dette ikke må settes opp på ny...
- Velg
Save '<program/feature>' Configuration
fraRun
-drop down menyen...
- start spring-boot applikasjonen med IntelliJ
- for sanity check: åpne ny terminal kjør kommandoen
curl -X 'POST' http://localhost:8080/bidrag-cucumber-onprem/run \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d '{"tags":["@tag1","@tag2"],"sanityCheck":true,"ingressesForApps":["<ingress.som.testes@tag:navn>"]}'
- for fullstendig test, åpne ny terminal og kjør kommandoen
curl -X 'POST' http://localhost:8080/bidrag-cucumber-onprem/run \ -H 'accept: */*' \ -H 'Content-Type: application/json' \ -d '{"tags":["@tag1","@tag2"],"testUsername":"<z123456>","ingressesForApps":["<ingress.som.testes@tag:navn>"],"securityToken"="<security token (uten Bearer)}'
- Start spring-boot applikasjon
- Gå til url: http://localhost:8080/bidrag-cucumber-onprem/swagger-ui/index.html?configUrl=/bidrag-cucumber-onprem/v3/api-docs/swagger-config#/
- Ekspander endpoint
/run
- Trykk på "Try it out"
- Endre json-schema med ingress@tag:navn, sanity check evt. testbruker med security token
- Press
Execute
- Gå til url for main eller feature branch
- main
- feature
- Ekspander endpoint
/run
- Trykk på "Try it out"
- Endre json-schema med ingress@tag, sanity check evt. testbruker med security token
- Press
Execute