Dette er ein maskinomsett tekst som kann innehalda feil!
No som me har laga klassar og arbeidd med validering, har me eit godt grunnlag for å byrja med testing. Testing er ein viktig del av utviklingsprosessen, og det hjelper oss med å sikra at koden vår fungerer som venta.
For korleis kan me vera sikre på at koden fungerer som ho skal, viss me ikkje testar ho?
Kva er Unit Testing?
Unit Testing er ein metode for å automatisk og systematisk teste små delar av koden vår. I Python brukar me ein modul som heiter pytest for å skrive og køyre testar. Ein “unit” er den minste testbare delen av ein applikasjon, ofte ei enkel funksjon eller metode. Når me brukar pytest er det viktig at me følgjer riktige namnekonvensjonar for at pytest skal kunne finne testane våre, slik som å namngje testfiler med test_ framfor, og testfunksjonar med test_ framfor.
Døme på ein unit test:
def test_add():
# Sjekkar at summering av desimaltal fungerer korrekt.
assert 0.3 + 0.3 + 0.3 == 0.9
Vert køyrd ved å skriva pytest i terminalen.
Fun fact
Koden ovanfor vil mislykkast, for .3+.3+.3 vert til 0.8999999999 i Python!
Oppgåve 1 – Installer pytest
Installer pytest i ditt virtuelle miljø. Dette gjer du ved å køyre følgjande kommando i terminalen:
pip install pytest
# Installer pytest – eit testrammeverk for Python.
Oppgåve 2 – Lag ein test
Lag ei ny fil i prosjektmappa di som heiter test_data.py. I denne fila skal du lage ein test for Person klassen du laga i førre modul. Testen skal sjekke at ein Person kan opprettast med gyldige verdiar.
Døme på korleis testen kan sjå ut:
from main import Person
def test_person_working():
bob_kaare = Person(name="Bob Kåre",
eye_color=EyeColor.BLUE,
phone_number=PhoneNumber("12345678"),
email=Email("bob_kaare@example.com"))
# Sjekkar at namnet er korrekt.
assert bob_kaare.name == "Bob Kåre"
# Sjekkar at auga er blå.
assert bob_kaare.eye_color == EyeColor.BLUE
Denne typen testing vert kalla «happy path»-testing, fordi me testar at alt fungerer som det skal når me gjev gyldige verdiar, og er ikkje særleg nyttig.
Oppgåve 3 – Test validering
Lag fleire testar i test_person.py som sjekkar at valideringa i Email og PhoneNumber fungerer som ho skal. Test både gyldige og ugyldige verdiar. Her må du bruke ei funksjon i pytest som heiter raises, som sjekkar at ei bestemt feil vert kasta.
import pytest
def test_exception():
with pytest.raises(KeyError):
my_dict = {"a": 1, "b": 2}
value = my_dict["c"] # Dette vil «raise» ein KeyError
Tip
Du kann lage so mange funksjonar du vil, so lenge funksjonsnamnet byrjar med test_.
Løsning: Døme på ein test for ugyldig e-post
from main import Email
import pytest
def test_invalid_email():
with pytest.raises(ValueError):
email = Email("not-an-email")
Kvifor gjera dette?
Ved å ha gode prøver for koden vår, so kann me vera sikre på at ho fungerer som ho skal, og me kann lett finna ut um noko har gått gale um me gjer endringar i koden. Dette er særleg viktig i større prosjekt, der mange utviklarar arbeider saman, og det er lett å gjera feil.
Ved å til dømes bruka programvara som Jest eller Selenium kann ein prøva nettstader automatisk, og dermed sørgja for at alt fungerer som det skal etter kvar endring i koden. Me vil jo gjerne vita at “brukarregistrering”, “betaling” og “innlogging” fungerer som det skal, ikkje sant?
Tenk over følgjande scenario
Kva hender (eller skal henda) dersom..:
- Ein brukar prøver å registrera seg med ein e-post som allereie er i bruk?
- Ein brukar har fødselsdato i framtida?
- Ein brukar som skriv inn namnet «jOHN dOE»?
Oppgåve 4 - Automatisk Testing (CI)
Når me publiserer kode på GitHub, so kann me setja upp noko som vert kalla GitHub Actions som kann køyra testane våre automatisk kvar gong me gjer ei endring i koden. Dette vert kalla Continuous Integration (CI), og det hjelper oss med å sikra at koden vår alltid fungerer som ho skal.
Lag ei fil i prosjektmappa di som heiter .github/workflows/pytest.yml. I denne fila skal du leggja til følgjande kode:
name: Pytest
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
# Installer eventuelle andre avhengigheiter prosjektet ditt treng
pip install -r requirements.txt
- name: Run tests with pytest
run: pytest
Dersom du har lagt han inn rett, vil du no sjå ein ny fana i GitHub-repoet ditt som heiter «Actions». Her vil du kunna sjå at testane dine vert køyrt automatisk kvar gong du gjer ei endring i koden, og du vil få beskjed dersom nokon av testane sviktar (raudt kryss og via e-post).
Merknad om filstruktur
Filstrukturen di vil avgjera um GitHub Actions fungerer eller ikkje. Sørg for at .github mappa ligg i rotmappa av prosjektet ditt, og det same gjeld ei tests mappe der testfilene dine ligg.
Du kan eventuelt endra på pytest.yml fila for å peika til rett mappe.
Slike Actions-filer kann òg nyttast til å testa koden din på fleire versjonar av Python eller operativsystem, dei kann òg nyttast til å byggja og publisera programvaren din automatisk, t.d. publisera ei nettside, eller uppdatera ei app i App Store eller Google Play.
Code Coverage
Det finst òg noko som vert kalla “Code Coverage”, som kann hjelpa deg med å sjå kor mykje av koden din som faktisk vert testa. Dette kann vera nyttig for å finna ut um du hev nok prøver, eller um det er delar av koden din som ikkje vert testa i det heile tatt.
Ymse arbeidsstader krev at du hev ein viss prosentdel av koden din dekt av prøver før du kann deployera han, for å sikra at koden er robust og fungerer som han skal.

