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:

a = 10
a = "takis"

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:

a = 10
a = "takis"

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/]
// reveal.js plugins