Tai mašinu versta tekstas, kuriame gali būti klaidų!
Dabar, kai sukūrėme klases ir dirbome su patvirtinimu, turime gerą pagrindą pradėti testavimą. Testavimas yra svarbi plėtros proceso dalis, ir tai padeda mums užtikrinti, kad mūsų kodas veikia kaip tikėtina.
Kaip galime būti tikri, kad kodas veikia taip, kaip turėtų, jei jo netestuojame?
Kas yra Unit Testing?
Unit Testing yra metodas, skirtas automatiškai ir sistemiškai testuoti nedideles kodo dalis. Python mes naudojame modulį pavadintą pytest rašydami ir vykdydami testus. “Unit” yra mažiausia testuojama programos dalis, dažnai viena funkcija arba metodas. Kai naudojame pytest, svarbu, kad mes laikytumės tinkamų pavadinimų konvencijų, kad pytest galėtų rasti mūsų testus, pavyzdžiui, pavadindami testų failus su test_ priedėliu, o testų funkcijas su test_ priedėliu.
Pavyzdys unit testo:
def test_add():
# Patikrinkite, ar 0.3 + 0.3 + 0.3 yra lygu 0.9
assert 0.3 + 0.3 + 0.3 == 0.9
Vykdomas įrašant pytest terminale.
Fun fact
Kodas aukščiau sugrius, nes .3+.3+.3 virsta 0.8999999999 Python!
Užduotis 1 – Įdiekite pytest
Įdiekite pytest savo virtualioje aplinkoje. Tai padarykite paleisdami šią komandą terminale:
pip install pytest
# Installerer pytest for testing
Užduotis 2 – Sukurkite testą
Sukurkite naują failą savo projekto kataloge, pavadinkite jį test_data.py. Šiame faile sukurkite testą Person klasei, kurią sukūrėte ankstesniame modulyje. Testas turi patikrinti, ar Person objektą galima sukurti su galiojančiomis reikšmėmis.
Pavyzdys, kaip testas gali atrodyti:
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"))
# Patikrina, ar vardo reikšmė teisinga
assert bob_kaare.name == "Bob Kåre"
# Patikrina, ar akių spalvos reikšmė teisinga
assert bob_kaare.eye_color == EyeColor.BLUE
Šio tipo testavimas vadinamas „laisvo kelio“ testavimu, nes testuojame, ar viskas veikia, kaip turėtų, kai pateikiame teisingas vertes, ir tai nėra labai naudinga.
Užduotis 3 – Testų patvirtinimas
Sukurkite daugiau testų test_person.py, kurie patikrintų, ar Email ir PhoneNumber patvirtinimas veikia taip, kaip turėtų. Patikrinkite tiek teisingas, tiek neteisingas vertes. Čia turite naudoti pytest funkciją, vadinamą raises, kuri patikrina, ar išmetama konkreti klaida.
import pytest
def test_exception():
with pytest.raises(KeyError):
my_dict = {"a": 1, "b": 2}
value = my_dict["c"] # Tai sukels KeyError
Tip
Galite sukurti tiek funkcijų, kiek norite, kol funkcijos pavadinimas prasideda nuo test_.
Løsning: Eksempel på en test for ugyldig e-post
from main import Email
import pytest
def test_invalid_email():
with pytest.raises(ValueError):
email = Email("not-an-email")
Kodėl tai daryti?
Turėdami gerus kodų testus, galime būti tikri, kad jie veikia taip, kaip turėtų, ir lengvai sužinoti, ar kas nors sugedo, jei atliekame pakeitimus kode. Tai ypač svarbu didesniuose projektuose, kur daugelis kūrėjų dirba kartu ir lengva padaryti klaidų.
Pavyzdžiui, naudodami programinę įrangą, tokią kaip Jest arba Selenium, galime automatiškai testuoti interneto svetaines ir taip užtikrinti, kad viskas veikia kaip turėtų po kiekvieno kodo pakeitimo. Norime žinoti, kad „vartotojo registracija“, „apmokėjimas“ ir „prisijungimas“ veikia kaip turėtų, tiesa?
Tenk over følgende scenarioer
Kas nutiktų (ar turėtų nutikti), jei..:
- Vartotojas bando užsiregistruoti el. paštu, kuris jau naudojamas?
- Vartotojo gimimo data yra ateityje?
- Vartotojas įveda vardą “jOHN dOE”?
Užduotis 4 – Automatinis Testavimas (CI)
Kai skelbiame kodą GitHub, galime nustatyti vadinamąjį GitHub Actions, kuris gali automatiškai vykdyti mūsų testus kiekvieną kartą, kai mes keičiame kodą. Tai vadinama nuolatinė integracija (CI) ir tai padeda mums užtikrinti, kad mūsų kodas visada veiktų taip, kaip turėtų.
Sukurkite failą savo projekto kataloge, pavadinkite jį .github/workflows/pytest.yml. Į šį failą įdėkite šį kodą:
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
# Įdiekite bet kokius kitus jūsų projekto priklausomumus
pip install -r requirements.txt
- name: Run tests with pytest
run: pytest
Jeigu ją įdiegėte teisingai, dabar GitHub repo jūsų turėtų būti naujas skirtukas pavadinimu „Actions“. Jame galėsite matyti, kad jūsų testai bus vykdomi automatiškai kiekvieną kartą, kai įvyks pakeitimas kode, ir būsite informuoti, jei kuris nors iš testų nepavyks (raudonas kryželis ir el. paštu).
Merknad om filstruktur
Jūsų failų struktūra nulems, ar veiks GitHub Actions, ar ne. Įsitikinkite, kad .github aplankas yra jūsų projekto šaknies kataloge, taip pat ir tests aplankas, kuriame yra jūsų testų failai.
Galite pakeisti pytest.yml failą, kad jis nukreiptų į teisingą aplanką.
Tokie Actions failai taip pat gali būti naudojami jūsų kodo testavimui naudojant kelias Python versijas arba operacines sistemas, jie taip pat gali būti naudojami automatiniam programinės įrangos kūrimui ir paskelbimui, pvz., paskelbti tinklapį arba atnaujinti programėlę App Store arba Google Play.
Code Coverage
Yra ir toks dalykas kaip „Code Coverage“, kuris gali padėti jums pamatyti, kiek jūsų kodo iš tikrųjų yra testuojama. Tai gali būti naudinga norint sužinoti, ar turite pakankamai testų, ar yra kodo dalių, kurios visai nėra testuojamos.
Kai kurios darbo vietos reikalauja, kad tam tikras procentas jūsų kodo būtų padengtas testais prieš jį įdiegiant, siekiant užtikrinti, kad kodas būtų patikimas ir veiktų taip, kaip turėtų.

