20TD02U Debugging, testing og unntaksbehandling - itnett/FTD02N GitHub Wiki

Debugging, Testing og Unntaksbehandling i Programmering

For å lage robuste og feilfrie programmer er det viktig å forstå og bruke debugging, testing og unntaksbehandling effektivt. Disse tre konseptene er avgjørende for å sikre at applikasjoner fungerer som forventet, håndterer feil på en grasiøs måte og opprettholder høy kvalitet gjennom hele utviklingssyklusen.

Debugging

Debugging er prosessen med å identifisere, diagnostisere og fikse feil eller problemer i programvare. Her er noen teknikker og verktøy for effektiv debugging.

  1. Print Statements

    • En enkel, men effektiv teknikk for å spore programflyt og variabelverdier.
    • Eksempel: Se skriptet her
  2. Debugger Tools

    • Verktøy som lar deg trinnvis kjøre koden, sette breakpoints, og inspisere variabler.
    • Python: pdb (Python Debugger) Se skriptet her
    • IDEer: Mange integrerte utviklingsmiljøer (IDEs) som PyCharm, Visual Studio Code, og Eclipse har innebygde debuggere.
  3. Logging

    • Bruk logging for å samle informasjon om programkjøring, spesielt nyttig for produksjonsmiljøer.
    • Eksempel: Se skriptet her

Testing

Testing er prosessen med å evaluere programvare for å sikre at den fungerer som forventet. Det finnes flere typer testing:

  1. Enhetstesting (Unit Testing)

    • Tester individuelle komponenter eller funksjoner isolert.
    • Verktøy: unittest, pytest
    • Eksempel med unittest: Se skriptet her
  2. Integrasjonstesting (Integration Testing)

    • Tester kombinasjonen av flere komponenter for å sikre at de fungerer sammen.
    • Eksempel: Se skriptet her
  3. Systemtesting (System Testing)

    • Tester det komplette systemet for å verifisere at det oppfyller kravene.
  4. Godkjenningstesting (Acceptance Testing)

    • Verifiserer at systemet oppfyller brukerens krav og forventninger.
  5. Automatisert Testing

    • Bruk av skript og verktøy for å automatisere kjøringen av tester.
    • Eksempel med pytest: Se skriptet her

Unntaksbehandling (Exception Handling)

Unntaksbehandling er prosessen med å håndtere feil eller eksepsjonelle tilstander som oppstår under programkjøring. Dette sikrer at programmet kan håndtere feil på en kontrollert måte uten å krasje.

  1. Try-Except Blokker

    • Bruk try-except for å fange og håndtere unntak.
    • Eksempel: Se skriptet her
  2. Else Blokker

  3. Finally Blokker

    • Kjør kode uavhengig av om et unntak oppstår eller ikke.
    • Eksempel: Se skriptet her
  4. Egendefinerte Unntak

    • Lag dine egne unntak for spesifikke feiltilstander.
    • Eksempel: Se skriptet her

Kombinere Debugging, Testing og Unntaksbehandling

Effektiv programvareutvikling kombinerer alle tre aspekter for å sikre kodekvalitet:

  1. Skriv tester for å fange feil tidlig.
  2. Bruk unntaksbehandling for å håndtere uforutsette feil.
  3. Bruk debugging-teknikker for å finne og fikse feil i koden.

Eksempelprosjekt: Kalkulator

Her er et eksempelprosjekt som kombinerer debugging, testing og unntaksbehandling:

kalkulator.py: Se skriptet her

test_kalkulator.py: Se skriptet her

Oppsummering

Debugging, testing og unntaksbehandling er avgjørende for å utvikle robuste og feilfrie programmer. Ved å kombinere disse praksisene kan du sikre høy kvalitet i koden din og håndtere feil på en kontrollert måte.

Spørsmål for Videre Utforskning

  1. Hvordan kan du bruke mocking i enhetstester for å simulere eksterne avhengigheter?
  2. Hva er forskjellen mellom black-box testing og white-box testing?
  3. Hvordan kan du bruke avanserte debugging-teknikker som memory dumps og profileringsverktøy?
  4. Hvordan håndterer du unntak i asynkrone programmeringsmiljøer?
  5. Hva er beste praksis for å skrive feiltolerante tester som kan kjøre på tvers av ulike miljøer?

Et nyttig tips: Alltid skriv tester for kritiske deler av applikasjonen din, og bruk kontinuerlig integrasjon (CI) verktøy som Jenkins eller GitHub Actions for å automatisere testing og sikre at koden alltid fungerer som forventet.

Fortsettelse om Debugging, Testing og Unntaksbehandling

For å få en dypere forståelse og ytterligere ferdigheter innen debugging, testing og unntaksbehandling, er det viktig å utforske avanserte konsepter og teknikker. Dette inkluderer bruk av mocking, avanserte debugging-verktøy, asynkron unntaksbehandling og kontinuerlig integrasjon (CI).

Avanserte Testingsteknikker

  1. Mocking

    • Mocking brukes til å simulere oppførselen til eksterne avhengigheter i tester. Dette gjør det mulig å teste komponenter isolert.
    • unittest.mock: En del av Python’s standardbibliotek som gir mulighet til å mocke objekter i tester.

    Eksempel: Se skriptet her

  2. Parameterisert Testing

    • Kjører samme test med ulike inndata for å dekke flere scenarier.
    • pytest.mark.parametrize: En funksjon i pytest som gjør det enkelt å parameterisere tester.

    Eksempel med pytest: Se skriptet her

  3. Testing av Asynkron Kode

    • Testing av asynkrone funksjoner krever spesifikke teknikker og verktøy.
    • pytest-asyncio: Et verktøy for å teste asynkrone funksjoner med pytest.

    Eksempel: Se skriptet her

Avanserte Debugging-teknikker

  1. Profiling

    • Profiling brukes til å måle ressursbruk som CPU og minne for å identifisere ytelsesflaskehalser.
    • cProfile: Et innebygd Python-verktøy for profilering.

    Eksempel: Se skriptet her

  2. Memory Dumps

    • Brukes til å ta et øyeblikksbilde av minnebruken i et program.
    • Verktøy: objgraph, meliae

    Eksempel med objgraph: Se skriptet her

  3. Remote Debugging

    • Debugging av applikasjoner som kjører på eksterne maskiner.
    • Verktøy: pdb, PyCharm, Visual Studio Code

    Eksempel med pdb for fjern debugging: Se skriptet her

Avanserte Unntaksbehandlings-teknikker

  1. Context Managers for Ressurshåndtering

    • Brukes for å sikre at ressurser frigjøres korrekt, selv ved feil.
    • Eksempel: Se skriptet her
  2. Unntak i Asynkrone Miljøer

    • Håndtering av unntak i asynkrone funksjoner krever spesifikke teknikker.
    • Eksempel: Se skriptet her

Kontinuerlig Integrasjon (CI)

CI er en praksis der kode endringer integreres og testes kontinuerlig, noe som sikrer at nye endringer ikke bryter eksisterende funksjonalitet. Populære CI-verktøy inkluderer Jenkins, GitHub Actions, og GitLab CI.

Eksempel på CI-konfigurasjon med GitHub Actions

Opprett .github/workflows/python-app.yml:

name: Python application

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Check out repository
      uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.x'

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Run tests
      run: |
        pytest

Denne konfigurasjonen setter opp en arbeidsflyt som kjører tester hver gang ny kode pushes til repository.

Oppsummering

Vi har dekket avanserte konsepter innen debugging, testing og unntaksbehandling, inkludert bruk av mocking, parameterisert testing, asynkron testing, profilering, memory dumps, remote debugging, context managers, asynkron unntaksbehandling, og kontinuerlig integrasjon. Disse teknikkene og verktøyene vil hjelpe deg med å bygge mer robuste, skalerbare og vedlikeholdbare applikasjoner.

Spørsmål for Videre Utforskning

  1. Hvordan kan du bruke metaprogrammering for å dynamisk generere test cases?
  2. Hva er de beste metodene for å profilere en stor applikasjon for å identifisere ytelsesproblemer?
  3. Hvordan håndterer du unntak i en distribuert mikrotjenestearkitektur?
  4. Hva er fordelene og utfordringene med å bruke mocking i enhetstester?
  5. Hvordan kan du integrere sikkerhetstesting i CI/CD-pipelinen din?

Et nyttig tips: Implementer logging på en slik måte at du kan samle inn og analysere loggdata fra ulike miljøer for bedre innsikt i applikasjonens oppførsel og potensielle feil.

Fortsettelse om Debugging, Testing og Unntaksbehandling

Vi vil nå utforske flere avanserte konsepter, teknikker og verktøy som kan brukes til debugging, testing og unntaksbehandling for å bygge mer robuste og vedlikeholdbare applikasjoner.

Mer om Mocking

Mocking brukes til å isolere enhetsfunksjonalitet ved å simulere eksterne avhengigheter. Dette er spesielt nyttig i enhetstester der du ikke ønsker å gjøre faktiske nettverkskall, databaseoperasjoner eller bruke eksterne tjenester.

Bruk av unittest.mock i Python

Se skriptet her

Avanserte Profiling- og Ytelsesteknikker

Profileringsverktøy hjelper deg med å identifisere ytelsesflaskehalser i applikasjonen din.

Bruk av cProfile for CPU-profiler

Se skriptet her

Bruk av memory_profiler for minneprofilering

Se skriptet her

Se skriptet her

Bruk av Asynkrone Funksjoner og Unntaksbehandling

Asynkrone funksjoner gir mulighet for samtidige operasjoner, men krever spesiell behandling når det gjelder unntak og feilhåndtering.

Asynkrone Funksjoner med asyncio

Se skriptet her

Unntaksbehandling i Asynkrone Funksjoner

Se skriptet her

Kontinuerlig Integrasjon (CI) og Kontinuerlig Levering (CD)

CI/CD er praksisen med å automatisere bygging, testing og distribusjon av kode. Dette sikrer rask levering av funksjoner og oppdateringer med høy kvalitet.

Eksempel på CI-konfigurasjon med GitLab CI/CD

Opprett .gitlab-ci.yml:

stages:
  - build
  - test

build_job:
  stage: build
  script:
    - python setup.py install

test_job:
  stage: test
  script:
    - pip install -r requirements.txt
    - pytest

Feilhåndtering og Logging i Produksjon

Feilhåndtering og logging er kritisk for å overvåke applikasjonens ytelse og helse i produksjonsmiljøet. Bruk av dedikerte logging-biblioteker og tjenester kan gi innsikt i applikasjonens oppførsel og hjelpe med feilsøking.

Bruk av logging-biblioteket i Python

Se skriptet her

Integrasjon med Eksterne Logging-tjenester

Mange applikasjoner bruker eksterne tjenester som ELK Stack (Elasticsearch, Logstash, Kibana), Splunk, eller cloud-baserte løsninger som AWS CloudWatch og Azure Monitor for logging og overvåking.

Oppsummering

Ved å bruke avanserte konsepter og teknikker innen debugging, testing og unntaksbehandling kan du forbedre påliteligheten og vedlikeholdbarheten til applikasjonene dine. Dette inkluderer:

  1. Mocking og isolasjon av tester
  2. Profilering for ytelsesforbedring
  3. Asynkrone funksjoner og unntaksbehandling
  4. Kontinuerlig integrasjon og levering
  5. Effektiv logging og overvåking i produksjon

Spørsmål for Videre Utforskning

  1. Hvordan håndterer du distribuerte sporings- og overvåkingssystemer i mikrotjenestearkitektur?
  2. Hva er forskjellen mellom "hard" og "soft" unntaksbehandling i asynkrone miljøer?
  3. Hvordan implementerer du rolling updates og blue-green deployments i CI/CD-pipelines?
  4. Hva er de beste praksisene for å skrive tester for komplekse asynkrone arbeidsflyter?
  5. Hvordan kan du bruke containerteknologier som Docker for å forbedre testing og utvikling?

Et nyttig tips: Implementer strukturerte og kontekstuelle loggmeldinger, slik at loggene blir lettere å søke i og analysere. Bruk unike ID-er for korrelasjon mellom loggmeldinger fra ulike deler av systemet.

Debugging, Testing og Unntaksbehandling

Debugging, testing og unntaksbehandling er essensielle ferdigheter i programmering. De sikrer at programvaren fungerer som forventet, er fri for feil, og håndterer uforutsette situasjoner på en kontrollert måte. La oss utforske hver av disse ferdighetene med relevans til læringsutbyttene du har nevnt.

Debugging

Debugging er prosessen med å identifisere, analysere og fikse feil (bugs) i programvaren.

Kunnskap

  1. Grunnleggende Programmering og Programmeringsverktøy:

    • Bruke IDEer som PyCharm eller Visual Studio Code, som har innebygde debugging-verktøy for å sette brytepunkter, trinnvise gjennomganger og inspeksjon av variabler.

    Praktisk Anvendelse:

    • Brytepunkter: Sett et brytepunkt i koden for å stoppe kjøringen ved en bestemt linje.
    • Inspeksjon: Inspekter variabler og se deres verdier under kjøring.

    Se skriptet her

    Bruk IDE for å sette et brytepunkt på return a + b og inspiser verdiene av a og b.

  2. Grunnleggende Programmeringsteknikker:

    • Feilsøke kode som inneholder variabeldeklarasjoner, kontrollstrukturer, løkker og funksjoner.

    Praktisk Anvendelse:

    • Forstå hvordan variabler endres gjennom kontrollstrukturer og løkker.

    Se skriptet her

    Debug denne løkken for å se hvordan verdien av i endres i hver iterasjon.

  3. Kommunikasjon Mellom Ulike Programgrensesnitt:

    • Debugging av API-kall og nettverkskommunikasjon for å sikre korrekt dataoverføring.

    Praktisk Anvendelse:

    • Bruk verktøy som Postman for å teste og feilsøke API-endepunkter.

    Se skriptet her

    Debug for å sjekke responsen fra API-kallet.

Testing

Testing sikrer at programvaren fungerer som forventet og hjelper med å identifisere feil tidlig i utviklingsprosessen.

Kunnskap

  1. Grunnleggende Programmering og Programmeringsverktøy:

    • Bruke testingrammeverk som unittest i Python for å skrive og kjøre tester.

    Praktisk Anvendelse:

    • Unit Testing: Skrive tester for individuelle funksjoner eller moduler.

    Se skriptet her

  2. Grunnleggende Programmeringsteknikker:

    • Teste kode som bruker variabler, kontrollstrukturer, løkker og funksjoner for å sikre riktig oppførsel.

    Praktisk Anvendelse:

    • Skrive tester for å dekke forskjellige kodestrukturer og logikk.

    Se skriptet her

  3. Viktigheten av Å Ivareta Sikkerheten av Applikasjoner:

    • Skrive tester for sikkerhetsfunksjoner som autentisering og autorisasjon.

    Praktisk Anvendelse:

    • Teste at sikkerhetsmekanismer fungerer som forventet.

    Se skriptet her

Unntaksbehandling

Unntaksbehandling handler om å håndtere feil på en kontrollert måte uten at programmet krasjer.

Kunnskap

  1. Grunnleggende Programmeringsteknikker:

    • Bruke try, except blokker for å fange opp og håndtere unntak.

    Praktisk Anvendelse:

    • Skrive kode som trygt håndterer feil.

    Se skriptet her

  2. Kommunikasjon Mellom Ulike Programgrensesnitt:

    • Håndtere unntak som oppstår under nettverkskommunikasjon, som forbindelsesfeil.

    Praktisk Anvendelse:

    • Bruke unntaksbehandling for å sikre robusthet.

    Se skriptet her

Generell Kompetanse

  1. Vedlikeholde og Utvikle Sin Egen Kompetanse:

    • Kontinuerlig forbedre ferdigheter innen debugging, testing og unntaksbehandling gjennom praksis og læring.

    Praktisk Anvendelse:

    • Bruke faglitteratur, online kurs og øvingsoppgaver for å holde ferdighetene oppdatert.
  2. Delta Aktivt i Prosjekter:

    • Bidra med debugging, testing og unntaksbehandling i utviklingsprosjekter.

    Praktisk Anvendelse:

    • Delta i kodegjennomganger og sprintmøter for å dele innsikt og forbedringer.
  3. Utføre Arbeid Etter Oppdragsgivers Behov:

    • Tilpasse testing og unntaksbehandling for å møte spesifikke krav og behov fra oppdragsgivere.

    Praktisk Anvendelse:

    • Dokumentere testplaner og unntaksbehandlingsstrategier i henhold til kravspesifikasjoner.
  4. Etablere Fagnettverk og Samarbeide med Mennesker på Kryss av Fagfelt:

    • Bygge relasjoner og samarbeide med andre utviklere og testere for å forbedre kodekvaliteten.

    Praktisk Anvendelse:

    • Delta i utviklerforum og brukergrupper for å dele erfaringer og beste praksis.
  5. Utveksle Bransjerelaterte Synspunkter og Informasjon:

    • Dele kunnskap om debugging, testing og unntaksbehandling med kolleger og bransjekolleger.

    Praktisk Anvendelse:

    • Publisere artikler og holde presentasjoner på konferanser og workshops.
  6. Bygge Relasjoner, Både Internt, Eksternt og på Tvers av Fagfelt:

    • Samarbeide med sikkerhetseksperter, utviklere og testere for å sikre helhetlige løsninger.

    Praktisk Anvendelse:

    • Arbeide med tverrfaglige team for å integrere debugging, testing og unntaksbehandling i hele utviklingsprosessen.

Oppsummering

Debugging, testing og unntaksbehandling er viktige ferdigheter for enhver utvikler. De sikrer at applikasjoner fungerer som forventet, håndterer feil på en kontrollert måte, og opprettholder høy kvalitet og sikkerhet. Ved å oppnå læringsutbyttene relatert til disse ferdighetene, vil kandidater kunne utvikle mer robuste og pålitelige applikasjoner. Hvis du har flere spørsmål eller ønsker mer detaljert informasjon om et spesifikt emne innen debugging, testing eller unntaksbehandling, er du velkommen til å spørre!