16b. Testen
2021-04-16
slides.com/jod/pt_16b
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Whitebox
test de onderliggende procedures
Soorten testen
Blackbox
test de functionaliteit van het systeem zonder te weten wat de achterliggende implementatie is
"abstractie"
Dimensie 1: blackbox vs whitebox
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
-
Unittest
- Werkt dit (beperkte) stuk code naar behoren?
-
Integratietest
- Werken de verschillende modules in de code goed samen?
-
Systeemtest
- Werkt het programma in samenwerking met andere systemen?
-
Validatie / Acceptatietest
- Is de gebruiker tevreden?
Soorten testen
Dimensie 2: vier testniveaus
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
- Whitebox
- Verifieert individuele stukjes code
- één of enkele procedures
- één of enkele datastructuren ("klassen" in object-geörienteerde talen)
- Checkt of het stukje code doet wat het moet doen
- noodzakelijke voorwaarde: heldere afspraak wat elk stukje code doet!
1. Unittesten
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
void quicksort(int a[], int n) {
// ...
}
int isGesorteerd(int a[], int n){
for(int i=1; i<n; ++i){
if(a[i-1]>a[i]) return 0;
}
return 1;
}
int quicksort_test(){
int a[5] = {5,3,4,2,3}; // simpel geval
quicksort(a,5);
if(!isGesorteerd(a,5)) return 0;
int b[4] = {1,2,3,4}; // randgeval
quicksort(b,4);
if(!isGesorteerd(b,4)) return 0;
// ...
return 1;
}
quicksort sorteert array van klein naar groot <- heldere functionaliteit
checkt of een array gesorteerd is
Test voor relevante arrays of quicksort inderdaad de array sorteert
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
1. Unittesten
- Bij grotere projecten zijn verschillende modules soms onlosmakelijk met elkaar verbonden
- Je wil ze toch graag apart testen
Oplossing: stubbing / mocking
Maak een versimpelde implementatie (stub) of simuleer de werking (mock) van de modules die niet getest moeten worden.
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Schrijf unit tests vooraleer de echte code geschreven wordt.
Voordelen:
- Grondig nagedacht wat de code moet doen
- Test functioneert als documentatie
- Er is zeker een test ;)
Test-driven development
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
- Whitebox
- Gelijkaardig nut als unit tests
- Stukje code dat checkt of de invarianten van de code voldaan zijn
- invariant is een eigenschap die onveranderlijk waar moet zijn
- preconditie: invariant op de input van een procedure
- postconditie: invariant op het resultaat van een procedure
1.+ Asserties in code
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
#include <assert.h>
int isGesorteerd(int a[], int n){
for(int i=1; i<n; ++i){
if(a[i-1]>a[i]) return 0;
}
return 1;
}
void quicksort(int a[], int n) {
// ...
assert(isGesorteerd(a,n)); // postconditie
}
Via assert wordt automatisch gecheckt of de array gesorteerd is
-> postconditie
#include <assert.h>
void drukAf(Node* root){
assert(root!=NULL); // preconditie
// ...
}
Via assert wordt automatisch gecheckt of de root Node pointer niet NULL is
-> preconditie
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Extra voorbeeld: robotvoorbeeld voor backtrackingalgoritmes op pastebin.com/bh5HWEGj
1.+ Asserties in code
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
- #include <assert.h>
- Worden niet meegecompileerd met de optie "gcc -DNDEBUG"
- Release vs. Debug compilatie
- Indien assertie geschonden, krijg je een makkelijk te interpreteren foutboodschap (en bvb. geen segmentation fault)
- Ook handig om te debuggen
- Caveat: zorg ervoor dat je programma op exact dezelfde manier uitvoert mét en zónder de assert!
- Anders risico op bugs die enkel met/zonder de asserts optreden...
1.+ Asserties in code
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
2. Integratietesten
- Whitebox
- Als alle stukjes code in isolatie werken, dan nog kunnen ze via interactie onverwacht gedrag (bugs ;) opleveren
- Naarmate code groter en complexer wordt, moeten combinaties van modules getest worden.
- Door steeds grotere combinaties van modules te testen, wordt het hele systeem getest
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
2.+ Regressietesten
- Hergebruik van de bestaande testen (meestal unit- en integratietesten) tijdens ontwikkeling
- geen specifiek type test, wel een methode
- Doel is om te controleren dat, na aanpassingen aan de code, alle testen nog slagen
- Good practice: tijdens het oplossen van een bug, schrijf een unit- of integratietest voor de bug, en voeg die toe aan de set van regressietesten
- was die test er al geweest, dan had de bug vermeden kunnen worden
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
2.++ Test coverage
Wanneer is je code voldoende getest?
int procedure(unsigned char x, unsigned char y){
if(x!=0 && y!=0){
return x+y;
}else{
return 0;
}
}
Deze procedure heeft 256*256 mogelijke inputs. Testen of al deze inputs de juiste output genereren is doenbaar, maar lastig.
In het algemeen is het meestal ondoenbaar om een programma voor alle mogelijke scenario's te testen.
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
2.++ Test coverage
Alternatief: schrijf voldoende testen zodat het hele programma "gecoverd" is
- Function coverage: worden alle procedures opgeroepen door de testen?
- Statement coverage: worden alle lijnen code minstens 1 keer uitgevoerd door de testen?
- Branch coverage: is elk controlestatement minstens 1 keer true en 1 keer false geweest?
- Condition coverage: is elke kleinste subexpressie van een logische conditie minstens 1 keer true en 1 keer false geweest?
Steeds uitgebreider
Idealiter: 100% test coverage ;)
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
int procedure(unsigned char x, unsigned char y){
if(x!=0 && y!=0){
return x+y;
}else{
return 0;
}
}
int test_procedure(){
// 1 test is genoeg voor function coverage
assert(procedure(1,1)==2);
// met tweede test hebben we statement en branch coverage
assert(procedure(0,1)==0);
// met nog een derde test hebben we condition coverage
assert(procedure(1,0)==0);
return 1;
}
2.++ Test coverage
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
2.+++ Test tools
- Vind het wiel niet opnieuw uit!
- stackoverflow.com/questions/65820/unit-testing-c-code
- Bieden functionaliteit voor unit tests, integration tests, mocking, code coverage ...
- ... of zijn super light-weight (bvb. enkel nuttige macro's)
- Zeker ook voor andere programmeertalen dan C
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
3. Systeemtesten
- Blackbox
- Testen van het volledige systeem, inclusief de omgeving en/of hardware waarop het draait
- Test ook de niet-functionele vereisten
- performantie, stabiliteit, betrouwbaarheid, veiligheid, fouttolerantie, ...
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
4. Validatietesten
- Blackbox
- Testen van de volledige functionaliteit, om te testen of het systeem aan de wensen van de opdrachtgever / klant voldoet
- Vaak worden na het validatietesten wijzigingen gevraagd in de vereisten waaraan de software moet voldoen -> een werkend systeem geeft beter inzicht in wat nodig is voor de klant / opdrachtgever
- Voorbeeld: beta-testing in de gamesindustrie
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Samenvatting
- Blackbox vs Whitebox testen
-
Unittesten
- Asserties
-
Integratietesten
- Regressietesten
- Test coverage
- Tools
- Systeemtesten
- Validatietesten
16b. Testen
By Jo Devriendt
16b. Testen
- 637