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!
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
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ä.
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”?
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.

