Software kwaliteit
T. Issaris
19 April 2021
Overzicht
- Testing
- Coding conventions
- Linting
- Code analysis
- Type hinting
- Metrics
- Reviews
- Code coverage
- Version control
- Issue tracker
Coding conventions
Richtlijnen/afspraken rond:
- Identatie (hoeveel spaties)
- Naamgeving variabelen
- Commentaar
- …
Style guide for Python
“PEP 8”
- maximum 79 letters per regel
- tussen twee functies twee witregels
- oproep functie:
- juist: bmi(19, 23)
- fout: bmi (19,23)
Code analysis
- Kijken naar stijl
- Zoeken naar fouten
- Waarschuwingen voor mogelijke problemen
Linter
- Statische analyse code
- Zoekt mogelijke fouten
- Kan volgen van coding conventions controleren
- Voor Python: pylint, flake8, …
- (Automatisch code aanpassing naar code convention: Black)
Type hinting
Je kan Python zonder type-informatie gebruiken:
Maar je kan ook aangeven welk type een variabele heeft:
a:int = 10
a = "takis" # Hier gaat de type checker een foutmelding op geven
Type checking
De type checker kan echter ook zonder type-hints fouten ontdekken:
error: Incompatible types in assignment (expression has type "str", variable has type "int")
Type checkers
Er zijn verschillende type checkers voor Python:
- mypy: Dropbox (populairst)
- pyright: Microsoft
- pyre-check: Facebook
- pytype: Google
Metrics
“Score” voor je software:
- percentage code-coverage
- complexiteit code
- regels code per bestand
- hoe diep is je code genest?
- commentaar voorzien?
Code coverage
- Welke regels van je code werden door je testen gebruikt?
- Hoeveel procent van je regels code werden getest?
- Dikwijls rapport van je code waarin je kan zien welke regels getest werden.
- Voor Python: coverage
Code coverage: Voorbeelden
- [https://adamj.eu/tech/2019/04/30/getting-a-django-application-to-100-percent-coverage/]
Version control
- Bijhouden van alle versies/aanpassingen aan je broncode.
- Bijhouden wie elke aanpassing heeft gemaakt.
- Bijhouden wanneer elke aanpassing werd gemaakt.
- Bijhouden waarom elke aanpassing werd gemaakt.
- Aantonen dat code geen ongewenste aanpassingen kan bevatten (backdoors)
- Samenwerking tussen developers vergemakkelijken.
- Populairste systemen: git, mercurial
- Beschikbaar als SaaS: GitHub, Gitlab, Bitbucket
Version control: Voorbeelden
Issue tracker
- Bijhouden van lijsten van “issues”
- Issues kunnen bugs zijn maar ook feature requests
- Beschikbare systemen: Jira, Roundup, Redmine, Trac, Bugzilla
- Ook geintegreerd in: Github, Gitlab, Bitbucket
Issue tracker
Voor iedere issue:
- Omschrijving
- Ernst
- Verantwoordelijke toekennen
- Categorie
- Rapporteringsdatum
- Contactinformatie rapporteerder
Issue tracker: voorbeelden
White-box vs black-box tests
- white-box: tests geschreven adh van de code
- black-box: tests geschreven adh van de specificatie (wat de code moet doen)
Black-box
def test_bereken_volume_cilinder():
result = bereken_volume_kubus(zijde=2)
if result == 8:
print("ok")
else:
print("fout!")
White-box
def bereken_volume_kubus(zijde):
if zijde < 0:
return 0
return zijde ** 3
def test_bereken_volume_cilinder():
result = bereken_volume_kubus(zijde=2)
if result == 8:
print("ok")
else:
print("fout!")
def test_bereken_volume_cilinder():
result = bereken_volume_kubus(zijde=2)
if result == 8:
print("ok")
else:
print("fout!")
Soorten testen
- Unit tests
- Integration tests
- System tests
- Acceptation tests
- Functional tests
- …
Unit tests
- Test functionaliteit van stukje code: functie, class
- White-box stijl
- Geschreven door developer
- Zorgt voor zekerheid dat de afzonderlijke blokjes werken
Integration tests
- Test koppeling tussen stukken software
- Zorgt voor zekerheid dat de blokjes correct samenwerken
Functional tests
- Test de functionele stukken
- Zorgt voor zekerheid dat de complete software de nodige functies correct uitvoert.
Browser automation
- (Selenium)[https://selenium-python.readthedocs.io/]
- (Cypress)[https://www.cypress.io/]
- (Cypress Demo)[https://vimeo.com/237527670]
- (Cypress Quickstart)[https://vimeo.com/237115455]
- (Selenium demo)[https://youtu.be/_4PJwmRzYXg?t=731]
- (Selenium docs)[ttps://selenium-python.readthedocs.io/]
Functional tests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
Gebruik Github
- (GitHub guide)[https://guides.github.com/activities/hello-world/]