PythonPodcast 10 - itnett/FTD02H-N GitHub Wiki

Episode 10 – Testing og Debugging i Python 🎧🛠️

Velkommen tilbake til vår Python-podcast! 🎉 I denne episoden skal vi ta for oss et svært viktig tema i programmering: Testing og debugging. Dette er en nøkkelkompetanse for alle som ønsker å bli gode programmerere, og det hjelper deg å finne og fikse feil i koden din, samt sikre at programmene dine fungerer som forventet. Før vi dykker inn i dagens tema, skal vi først ta en kort oppsummering av hva vi har lært så langt.


Oppsummering av tidligere episoder:

  1. Grunnleggende Python-syntaks, variabler og betingelser.

  2. Løkker, input/output, og funksjoner.

  3. Feilhåndtering og bruk av datastrukturer som lister, tupler og ordbøker.

  4. Filbehandling i Python.

  5. Unntaksbehandling og feilhåndtering – I forrige episode lærte vi hvordan vi kan bruke try, except og finally til å håndtere feil i programmene våre.


Hva er testing og debugging? 🧑‍💻

Testing er prosessen med å sjekke om koden din fungerer som forventet. Vi kan lage tester som kjører forskjellige deler av programmet og gir oss beskjed om alt fungerer som det skal.

Debugging er prosessen med å finne og fikse feil i koden. Det innebærer å identifisere årsaken til en feil, analysere den og finne ut hvordan vi kan rette den.

Vi kan bruke testing til å automatisk sjekke om koden fungerer som forventet, mens debugging hjelper oss med å identifisere og løse spesifikke feil.


Hva er en bug? 🐞

En bug er en feil i koden som gjør at programmet ikke oppfører seg som forventet. Bugs kan være små, som en enkel stavefeil, eller store, som en logisk feil som gjør at hele programmet krasjer.

For eksempel, la oss si at vi har en enkel funksjon som skal legge sammen to tall:

def legg_sammen(a, b): return a - b # Feil: Dette skal være a + b, ikke a - b

🔊 Les opp koden:

Linje 1: Vi definerer en funksjon som skal legge sammen to tall.

Linje 2: Her har vi en feil – i stedet for å legge sammen a og b, trekker vi b fra a.

Dette er en klassisk bug som vi kan finne ved hjelp av testing.


Unit Testing i Python 🔍

En av de mest brukte metodene for testing i Python er unit testing. Dette innebærer å skrive tester for små deler av programmet, som funksjoner eller klasser. Python har et innebygd bibliotek for dette som heter unittest.

La oss se hvordan vi kan teste den forrige funksjonen vår ved å bruke unittest.

Eksempel:

import unittest

Funksjonen vi vil teste

def legg_sammen(a, b): return a + b # Vi har rettet feilen her

Lag en testklasse

class TestLeggSammen(unittest.TestCase):

# Test metode 1
def test_positive_tall(self):
    self.assertEqual(legg_sammen(3, 4), 7)  # 3 + 4 = 7

# Test metode 2
def test_negative_tall(self):
    self.assertEqual(legg_sammen(-2, -3), -5)  # -2 + -3 = -5

# Test metode 3
def test_null(self):
    self.assertEqual(legg_sammen(0, 0), 0)  # 0 + 0 = 0

Kjør testen

if name == 'main': unittest.main()

🔊 Les opp koden:

Linje 1: Vi importerer unittest-biblioteket.

Linje 4: Vi har rettet funksjonen vår, slik at den nå korrekt legger sammen tall.

Linje 7: Vi definerer en testklasse som arver fra unittest.TestCase.

Linje 9-11: Her tester vi positive tall for å se om resultatet er som forventet.

Linje 13-15: Vi tester negative tall.

Linje 17-19: Vi tester nullverdier.

Linje 22: Vi kjører testen.

Når vi kjører denne koden, vil Python sjekke om alle testene går som forventet. Hvis en test feiler, vil vi få en feilmelding som hjelper oss med å forstå hva som gikk galt.


Debugging i Python 🛠️

Selv om testing hjelper oss med å oppdage feil, trenger vi ofte å debugge for å finne ut nøyaktig hva som er galt i koden vår. Python har et kraftig verktøy som heter pdb, som står for "Python Debugger". Dette lar oss kjøre programmet vårt steg for steg, se hva som skjer, og analysere variabler i sanntid.

La oss se hvordan vi kan bruke pdb til å debugge et program:

Eksempel med pdb:

import pdb

def divisjon(a, b): pdb.set_trace() # Starter debuggeren return a / b

print(divisjon(10, 0))

🔊 Les opp koden:

Linje 1: Vi importerer pdb-modulen.

Linje 4: Funksjonen divisjon() prøver å dele a på b, men her vil vi få en feilmelding når b er null.

Linje 5: pdb.set_trace() starter debuggeren slik at vi kan inspisere hva som skjer i koden.

Når vi kjører denne koden, vil pdb stoppe på linjen med set_trace(), og vi kan skrive kommandoer for å sjekke hva som skjer i programmet. For eksempel kan vi skrive p a for å se verdien til a, eller p b for å sjekke verdien til b. Vi kan også bruke n for å gå til neste linje i koden.


Debugging-kommandoer i pdb 📜

Her er noen vanlige kommandoer du kan bruke når du debugger med pdb:

p [variabelnavn]: Printer verdien til en variabel.

n: Går til neste linje i koden.

s: Steg inn i en funksjon.

q: Avslutter debuggeren.


Avansert Testing: mocking i Python 🎭

Noen ganger vil vi teste kode som er avhengig av eksterne ressurser, som en database eller en nettverkstilkobling. I slike tilfeller kan vi bruke mocking for å simulere oppførselen til disse ressursene. Python har en modul kalt unittest.mock som lar oss lage mock-objekter for å erstatte ekte objekter under testing.

La oss se på et eksempel der vi mocker en funksjon som henter data fra en API:

Eksempel:

from unittest.mock import patch import requests

def hent_data(): response = requests.get("https://api.example.com/data") return response.json()

Lag en mock for requests.get

@patch('requests.get') def test_hent_data(mock_get): mock_get.return_value.json.return_value = {"key": "value"} resultat = hent_data() assert resultat == {"key": "value"}

test_hent_data()

🔊 Les opp koden:

Linje 1: Vi importerer patch fra unittest.mock.

Linje 4: Funksjonen hent_data() prøver å hente data fra en API.

Linje 10: Vi lager en mock for requests.get, og setter return-verdien til en forhåndsdefinert respons.

Linje 14: Vi tester at funksjonen hent_data() returnerer riktig resultat.


Feilsøking ved bruk av assert og logging 🛠️📋

Når vi skriver kode, kan vi også bruke assert for å teste at visse betingelser er oppfylt. Hvis betingelsen ikke er oppfylt, vil programmet stoppe og vise en feilmelding.

Eksempel:

def legg_sammen(a, b): assert isinstance(a, int), "a må være et heltall!" assert isinstance(b, int), "b må være et heltall!" return a + b

🔊 Les opp koden:

Linje 2-3: Vi bruker assert for å sjekke at både a og b er heltall. Hvis de ikke er det, stopper programmet med en feilmelding.


Oppsummering av Episode 10 – Testing og Debugging i Python

  1. Testing: Vi lærte hvordan vi kan bruke unittest-modulen til å teste funksjonene våre, og vi gikk gjennom hvordan vi kan teste for forskjellige typer input og feil.

  2. Debugging: Vi så hvordan vi kan bruke pdb (Python Debugger) for å kjøre koden steg for steg og analysere hva som skjer underveis. Dette hjelper oss med å identifisere bugs i koden.

  3. Mocking: Vi lærte hvordan vi kan bruke unittest.mock til å simulere eksterne ressurser som API-kall eller databaseforespørsler, slik at vi kan teste koden uten å være avhengige av faktiske ressurser.

  4. assert: Vi brukte assert for å teste at visse betingelser er oppfylt i koden vår. Dette hjelper oss med å sjekke at programmet oppfører seg som forventet før vi går videre til mer avansert feilsøking.

  5. Logging: Selv om vi ikke dekket logging i detalj i denne episoden, er det viktig å merke seg at du kan bruke Pythons logging-modul for å loggføre informasjon om hvordan programmet ditt oppfører seg, noe som er nyttig for feilsøking.


Oppgaver til deg:

  1. Skriv tester: Lag et program som inneholder flere funksjoner, og skriv deretter tester for hver av funksjonene. Bruk unittest for å sjekke at programmet fungerer som forventet.

  2. Bruk pdb: Debug et program du har laget ved å sette inn pdb.set_trace() og følg med på hva som skjer i koden.

  3. Mocking: Prøv å lage et program som henter data fra en API eller en ekstern ressurs, og bruk mocking for å teste det.

  4. Skriv dine egne assert-uttrykk: Bruk assert i koden din for å sjekke at input-verdiene dine er gyldige før du kjører operasjoner på dem.


Hva vi skal lære i neste episode

I neste episode skal vi se på avansert filbehandling i Python. Vi skal lære hvordan vi kan lese og skrive til filer på en effektiv måte, samt bruke csv og json-modulene til å håndtere større datasett. Vi kommer også til å diskutere sikkerhetstiltak for filbehandling, slik at du kan lage sikre og pålitelige programmer.


Vi håper du fikk godt utbytte av denne episoden om testing og debugging! 🎉 Husk at det å kunne teste og debugge koden sin er en av de viktigste ferdighetene en programmerer kan ha. Som alltid, oppfordrer vi deg til å øve på det du har lært i dag. Praktisk erfaring er den beste måten å mestre dette på!


🎧 Hold deg oppdatert – Abonner på podcasten vår for flere episoder om Python, og følg oss for mer avansert innhold i fremtidige episoder! 🎙️

Takk for at du lyttet, og vi sees i neste episode! 🚀