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

  1. Unittest
    • Werkt dit (beperkte) stuk code naar behoren?
  2. Integratietest
    • Werken de verschillende modules in de code goed samen?
  3. Systeemtest
    • Werkt het programma in samenwerking met andere systemen?
  4. 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