Yksikkötestaus ja validointi

Skip to content

Tämä on konekäännetty teksti, joka saattaa sisältää virheitä!

Nyt kun olemme luoneet luokat ja työskennelleet validoinnin kanssa, meillä on hyvä pohja aloittaa testaaminen. Testaus on tärkeä osa kehitysprosessia, ja se auttaa meitä varmistamaan, että koodimme toimii odotetusti.

Miten voimme olla varmoja, että koodi toimii kuten sen pitää, jos emme testaa sitä?

Mikä on Unit Testing?

Unit Testing on menetelmä koodimme pienten osien automaattiseen ja systemaattiseen testaamiseen. Pythonissa käytämme pytest-nimistä moduulia testien kirjoittamiseen ja suorittamiseen. “Unit” on sovelluksen pienin testattava osa, usein yksittäinen funktio tai metodi. Kun käytämme pytest:iä, on tärkeää noudattaa oikeita nimikkeistösääntöjä, jotta pytest löytää testimme, kuten nimeämällä testitiedostot test_-etuliitteellä ja testifunktiot test_-etuliitteellä.

Esimerkki unit testistä:

def test_add():
    # Testar addisjon
    assert 0.3 + 0.3 + 0.3 == 0.9

Suoritetaan kirjoittamalla pytest terminaaliin.

Fun fact

Yllä oleva koodi epäonnistuu, koska .3+.3+.3 muuttuu arvoksi 0.8999999999 Pythonissa!

Easy Tehtävä 1 – Asenna pytest

Asenna pytest virtuaaliympäristöösi. Tämä tehdään ajamalla seuraava komento terminaalissa:

pip install pytest
# Installerer pytest for testing
# Asentaa pytest:n testausta varten

Easy Tehtävä 2 – Luo testi

Luo uusi tiedosto projektikansioosi nimellä test_data.py. Tähän tiedostoon luo testi Person-luokalle, jonka loit edellisessä moduulissa. Testin tulee tarkistaa, että Person-olion voi luoda kelvollisilla arvoilla.

Esimerkki siitä, miltä testi voi näyttää:

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"))
    # Varmistaa, että nimi on asetettu oikein.
    assert bob_kaare.name == "Bob Kåre"
    # Varmistaa, että silmien väri on asetettu oikein.
    assert bob_kaare.eye_color == EyeColor.BLUE

Tämän tyyppistä testausta kutsutaan “onnistumispolku”-testaukseksi, koska testaamme, että kaikki toimii kuten pitää, kun annamme kelvollisia arvoja, eikä se ole kovin hyödyllistä.

Medium Tehtävä 3 – Testien validointi

Luo lisää testejä tiedostoon test_person.py, jotka tarkistavat, että Email- ja PhoneNumber-luokkien validointi toimii odotetusti. Testaa sekä kelvollisia että virheellisiä arvoja. Käytä tässä pytestin funktiota nimeltä raises, joka tarkistaa, että tietty virhe heitetään.

import pytest

def test_exception():
    with pytest.raises(KeyError):
        my_dict = {"a": 1, "b": 2}
        value = my_dict["c"]  # Tämä aiheuttaa KeyError-poikkeuksen

Tip

Voit luoda niin monta funktiota kuin haluat, kunhan funktion nimi alkaa merkillä test_.

Løsning: Esimerkki virheellisen sähköpostin testistä
from main import Email

import pytest

def test_invalid_email():
    with pytest.raises(ValueError):
        email = Email("not-an-email")

Miksi tehdä tämä?

Hyvien kooditestien avulla voimme olla varmoja, että koodi toimii odotetusti, ja voimme helposti selvittää, jos jokin on mennyt pieleen, kun teemme muutoksia koodiin. Tämä on erityisen tärkeää suuremmissa projekteissa, joissa monet kehittäjät työskentelevät yhdessä, ja virheiden tekeminen on helppoa.

Esimerkiksi Jest- tai Selenium-ohjelmistoilla voimme testata verkkosivuja automaattisesti ja varmistaa, että kaikki toimii odotetusti jokaisen koodimuutoksen jälkeen. Haluamme varmasti tietää, että “käyttäjärekisteröinti”, “maksu” ja “sisäänkirjautuminen” toimivat odotetusti, eikö niin?

Mieti seuraavia skenaarioita

Mitä tapahtuu (tai pitäisi tapahtua) jos..:

  • Käyttäjä yrittää rekisteröityä jo käytössä olevalla sähköpostiosoitteella?
  • Käyttäjällä on tuleva syntymäpäivä?
  • Käyttäjä kirjoittaa nimen “jOHN dOE”?

A software tester walks into a bar...

Hard Tehtävä 4 - Automaattinen Testaus (CI)

Kun julkaisemme koodia GitHubissa, voimme asettaa jotain nimeltä GitHub Actions, joka voi ajaa testimme automaattisesti joka kerta, kun teemme muutoksen koodiin. Tätä kutsutaan Continuous Integrationiksi (CI), ja se auttaa meitä varmistamaan, että koodimme toimii aina odotetusti.

Luo projektiisi tiedosto nimeltä .github/workflows/pytest.yml. Lisää tähän tiedostoon seuraava koodi:

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
        # Asenna kaikki muut projektisi tarvitsemat riippuvuudet
        pip install -r requirements.txt
    - name: Run tests with pytest
      run: pytest

Jos olet määrittänyt sen oikein, näet nyt uuden välilehden GitHub-repositoriossasi nimeltä “Actions”. Siellä voit nähdä, että testisi ajetaan automaattisesti aina kun teet muutoksen koodiin, ja saat ilmoituksen, jos jokin testeistä epäonnistuu (punainen risti ja sähköpostitse).

Merknad om filstruktur

Tiedostorakenteesi määrittää, toimiiko GitHub Actions vai ei. Varmista, että .github-kansio sijaitsee projektisi juurikansiossa, ja sama koskee tests-kansiota, jossa testitiedostosi sijaitsevat.

Voit halutessasi muokata pytest.yml-tiedostoa osoittaaksesi oikeaan kansioon.

Sellaiset Actions-tiedostot voidaan myös käyttää koodisi testaamiseen useilla Python-versioilla tai käyttöjärjestelmillä, niitä voidaan käyttää myös ohjelmistosi rakentamiseen ja julkaisuun automaattisesti, esimerkiksi verkkosivuston julkaisemiseen tai sovelluksen päivittämiseen App Storeen tai Google Playhin.

Code Coverage

On myös olemassa “Code Coverage”, joka voi auttaa sinua näkemään, kuinka paljon koodistasi todella testataan. Tämä voi olla hyödyllistä selvittääksesi, onko sinulla riittävästi testejä, vai onko osia koodistasi, joita ei testata lainkaan.

Jotkut työpaikat vaativat, että tietyllä prosenttiosuudella koodistasi on testikattavuus ennen kuin voit julkaista sen, varmistaakseen, että koodi on vakaa ja toimii odotetusti.

Unit Test Meme