ID: S202606011210
Status: school
Tags: avans 2-4 LU2, avans 2-4, avans 2-4 softwaredesign en kwaliteit vak
avans 2-4 sdkl6 metrieken en testbaarheid
ISO25010

cyclomatic complexity
hoe meet je maintainability. hoe meet je test coverage.
die waarden kan je het beste testen met automatische tools. Denk sonarcloud. bij security heb je ook dit soort tooltjes.
Zorg dat het wel gaat via cicd pipeline.
sonarqube valkuil
nonfunctionals dat je een quality gate level A nodig hebt is incorrect, want een A wordt gebaseerd op meerdere non functionals. Want jij kan zelf de baseline A instellen.

Deze bovenstaande tabel geeft aan wat waarmee getest wordt. Dit komt overheen met de niet functional requirements van de ISO25010 Maintainability. Dit kan je dus uit een tool halen al deze dingen.
cyclomatic complexity
Cyclomatische complexiteit is een getalletje die meet hoeveel code paden er in je code zitten. Dit is gewoon een getal.
Code zonder if-statements en loops heeft CC gelijk aan 1
- +1 voor elk if-statement of if-else statement
- +1 voor elke loop
- +1 voor elke case in een switch statement
- +1 voor elke && en voor elke || in elke meervoudige conditie
Een alternatief voor cyclomatic complexity is SonarQube Cognitive Complexity, ik zou ze beide gebruiken.
Praktisch per methode:
- CC tussen 1 en 10: betrekkelijk eenvoudige code, makkelijk te testen, weinig kans op fouten
- CC tussen 11 en 20: moeilijkere code, niet in één keer te overzien, lastiger te testen, grotere kans op fouten
- CC tussen 21 en 50: erg ingewikkeld, met veel moeite te testen, grote kans op fouten
- CC groter dan 50: niet te testen, instabiele code, splits de methode op in meerdere methodes.
Coverage Types
Code coverage
Je wilt je “code coverage” afstellen op de belangrijke dingen, en niet een arbitrair nummer zoals “80%“. Noem ook zeker wat de % aan code coverage inhoudt.
Verschillende types van coverage:
- Statement (of line coverage)
- Decision (of branch coverage)
- Condition
- Decision/condition
- Multiple condition/decision
Line Coverage
100% line coverage = elk statement minimaal één keer uitgevoerd. In de onderstaande test heb je dus maar 1 test nodig, en die moet true zijn. Maar dat is dan wel maar 25% decision coverage.
string myMethod(boolean condition, boolean condition2)
{
string s = NULL;
if (condition && condition2)
{
s = "condities zijn geldig";
}
return s.toUpper();
}Decision Coverage
Decision: punt in het programma vanaf waar minimaal 2 alternatieve routes starten
- Decision coverage = % van alle mogelijke decision uitkomsten van alle decisions dat uitgevoerd is
- 100% = elk statement én alle mogelijke uitkomsten van elke decision zijn minimaal 1x uitgevoerd
Condition Coverage
Condition: elke voorwaarde die true/false kan zijn
- Condition coverage = % van alle mogelijke uitkomsten van elke condition minimaal 1x
- 100% = met alle mogelijke waarden voor elke condition minimaal 1x uitgevoerd
Let op: verschil met decision coverage!
- 100% condition coverage ≠ 100% decision coverage
- Voorbeeld met
a && b:- Test 1:
a == true && b == false - Test 2:
a == false && b == true
- Test 1:
Dit geeft 100% condition coverage (a en b zijn elk minstens 1x true en 1x false), maar de nice logic wordt nooit uitgevoerd!
→ 100% condition coverage < 100% decision coverage
Condition/Decision Coverage
Combinatie van condition en decision coverage
- 100% = elk statement én alle mogelijke uitkomsten van elke decision én uitkomsten van elke condition, alle minimaal 1x
- Voorbeeld met
if (a && b):- a true && b false
- a false && b true
- a true && b true
Multiple Condition/Decision Coverage
Meer uitgebreide versie van condition/decision coverage
- Alle mogelijke combinaties voor de condities zijn getest voor alle decisions
- 100% = elk statement én alle mogelijke uitkomsten van elke decision én alle mogelijke combinaties van de uitkomsten van elke condition, alle minimaal 1x
- Voorbeeld met
if (a && b):- a false && b false
- a true && b false
- a false && b true
- a true && b true
Path coverage
TMAP: ook wel algorithm test
Loose statements testen is vaak niet voldoende, het gaat ook vooral om de samenhang. Als je software runt zijn er heel veel mogelijke paden door de software. Alle paden worden getest.
Kan dat?
- Wat als we een loop hebben?
- Dan is het aantal paden mogelijk erg groot (oneindig) als je elke hoeveelheid iteraties in de loop als apart pad ziet
Praktische aanpak: werken met test depth (1 … ∞)
- Test depth = aantal opeenvolgende stappen in het pad
- Test depth 1 = stappen combineren zodanig dat ze allemaal minimaal 1x uitgevoerd zijn
- Test depth 2 = combinaties maken van een stap met alle mogelijke stappen daar direct aan voorafgaand
- Test depth N = idem meer met N eraan voorafgaande stappen
- Wij beperken ons tot Test depth 1 bij path coverage
Dijkstra’s algorithm mentioned. Relevant video I watched yesterday (25m after it released):
Testen Met Path Coverage
Dit zijn de 8 stappen voor het opzetten van path coverage tests:
- Code weergave dmv grafen
- Focus: beslispunten
- (Opeenvolgende) activiteiten vervang je door een pijl
- Elke pijl krijgt een uniek nummer
- Alle basispaden zoeken
- Voor elk testpad de padvergelijking opstellen
- Voor elke vergelijking een testcase zoeken
- Van elke testcase een voorspelling van het verwachte resultaat
- Implementeer de test
- Voer testen uit
- Rapporteer testresultaten



Graaf theorie


De cyclomatic complexity hiervan is 4, want 1 is als er geen branches in zitten. +3 branches maakt 4.



Whitebox vs Blackbox testing
-
Deze testaanpak houdt rekening met de interne structuur/logica van je software
- White box testing (ook wel glass box testing)
- Black box testing = testen waarbij je het systeem als één geheel beschouwt
-
White box testing
- Voor:
- Gebruik van meer informatie van de software onder test en BlackBox
- Goede coverage verzekerd
- Tegen:
- Arbeidsintensief dus duur
- Risico van meenemen van fouten naar de testcode!
- Voor:
Gebruik niet voor hele applicatie, maar voor specifieke onderdelen als moeilijke algoritmes
References
- dit is de les van vandaag.
- Een relevante Veritasium video: https://youtu.be/kS-CGkiPetQ?si=_hsLbpGzQO7P0A1v