Ĉi tio estas maŝine tradukita teksto kiu povas enhavi erarojn!
Nun, kiam ni kreis klasojn kaj laboris pri validigo, ni havas bonan bazon por komenci kun testado. Testado estas grava parto de la evoluproceso, kaj ĝi helpas nin certigi, ke nia kodo funkcias kiel atendite.
Kiel ni povas esti certaj, ke la kodo funkcias kiel ĝi devas, se ni ne testas ĝin?
Kio estas Unutestado?
Unutestado estas metodo por aŭtomate kaj sisteme testi etajn partojn de nia kodo. En Python ni uzas modulon nomitan pytest por skribi kaj ruli testojn. “Unuo” estas la plej malgranda testebla parto de aplikaĵo, ofte ununura funkcio aŭ metodo. Kiam ni uzas pytest, estas grave ke ni sekvu ĝustajn nomkonvenciojn por ke pytest povu trovi niajn testojn, kiel nomigi testdosierojn per test_ antaŭe, kaj testfunkciojn per test_ antaŭe.
Ekzemplo de unit testo:
def test_add():
# Kontroller at addisjon fungerer som forventet.
# Kontrolu ke aldono funkcias kiel atendite.
assert 0.3 + 0.3 + 0.3 == 0.9
Ekzekutita per skribi pytest en la terminalo.
Fun fact
La kodo super malsukĉos, ĉar .3+.3+.3 fariĝas 0.8999999999 en Python!
Tasko 1 - Instalu pytest
Instalu pytest en via virtuala medio. Vi faras tion per ekzekutado de la sekva komando en la terminalo:
pip install pytest
# Installerer pytest for testing
# Instalas pytest por testado
Tasko 2 - Kreu teston
Kreu novan dosieron en via projekta dosierujo nomatan test_data.py. En ĉi tiu dosiero, vi devas krei teston por la Person klaso, kiun vi kreis en la antaŭa modulo. La testo devas kontroli, ke Person povas esti kreita kun validaj valoroj.
Ekzemplo de kiel la testo povas aspekti:
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"))
# Kontroller at navnet er riktig.
assert bob_kaare.name == "Bob Kåre"
# Kontroller at øyenfargen er riktig.
assert bob_kaare.eye_color == EyeColor.BLUE
Ĉiutipa testo estas nomata “feliĉa vojo”-testado, ĉar ni testas, ke ĉio funkcias kiel ĝi devas kiam ni donas validajn valorojn, kaj ĝi ne estas aparte utila.
Tasko 3 - Testo de Validigo
Kreiu pli da testoj en test_person.py kiuj kontrolas ke la validigo en Email kaj PhoneNumber funkcias kiel ĝi devas. Testu kaj validajn kaj invalidajn valorojn. Vi devas uzi funkcion en pytest nomatan raises, kiu kontrolas ke certa eraro estas ĵetata.
import pytest
def test_exception():
with pytest.raises(KeyError):
my_dict = {"a": 1, "b": 2}
value = my_dict["c"] # Ĉi tio "levos" KeyError
Tip
Vi povas krei tiom da funkcioj kiom vi volas, kondiĉe ke la funkcionomo komenciĝas per 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")
Kialo fari tion ĉi?
Per havi bonajn testojn por nia kodo, ni povas esti certaj, ke ĝi funkcias kiel ĝi devas, kaj ni povas facile eltrovi, ĉu io iris erare se ni faras ŝanĝojn en la kodo. Ĉi tio estas aparte grava en pli grandaj projektoj, kie multaj programistoj laboras kune, kaj estas facile fari erarojn.
Per ekzemple uzi programaron kiel Jest aŭ Selenium, oni povas testi retejojn aŭtomate, kaj tiel certigi, ke ĉio funkcias kiel ĝi devas post ĉiu ŝanĝo en la kodo. Ni ja ŝatus scii, ke “uzantregistriĝo”, “pagado” kaj “eniro” funkcias kiel ili devas, ĉu ne?
Pensu pri la jenaj scenaroj
Kio okazas (aŭ devus okazi) se..:
- Uzanto provas registriĝi per retpoŝto, kiu jam estas uzata?
- Uzanto havas naskiĝdaton en la estonteco?
- Uzanto, kiu enigas la nomon “jOHN dOE”?
Tasko 4 - Aŭtomata Testado (CI)
Kiam ni publikigas kodon en GitHub, ni povas starigi ion nomitan GitHub Actions kiu povas ruli niajn testojn aŭtomate ĉiufoje kiam ni faras ŝanĝon en la kodo. Ĉi tio estas nomata Kontinua Integrado (CI), kaj ĝi helpas nin certigi, ke nia kodo ĉiam funkcias kiel ĝi devas.
Kreu dosieron en via projekta dosierujo nomatan .github/workflows/pytest.yml. En ĉi tiu dosiero, vi devas aldoni la sekvan kodon:
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
# Instalu ajnajn aliajn dependaĵojn, kiujn via projekto bezonas
pip install -r requirements.txt
- name: Run tests with pytest
run: pytest
Se vi vi ĝuste enmetis ĝin, vi nun vidos novan langeton en via GitHub-deponejo nomatan “Actions”. Tie vi povos vidi, ke viaj testoj estas aŭtomate rulataj ĉiufoje kiam vi faras ŝanĝon en la kodo, kaj vi ricevos sciigojn se iu el la testoj fiaskas (ruĝa kruco kaj per retpoŝto).
Merknad om filstruktur
Via dosierstrukturo determinos ĉu GitHub Actions funkcios aŭ ne. Certigu, ke la dosierujo .github situas en la radikdosierujo de via projekto, kaj la sama validas por dosierujo tests kie viaj testdosieroj situas.
Vi eble povas ŝanĝi la dosieron pytest.yml por montri al la ĝusta dosierujo.
Tiaj Ag-dosieroj ankaŭ povas esti uzataj por testi vian kodon sur pluraj versioj de Python aŭ operacisistemoj, ili ankaŭ povas esti uzataj por konstrui kaj eldoni vian programaron aŭtomate, ekz. eldoni retpaĝon, aŭ ĝisdatigi aplikaĵon en la App Store aŭ Google Play.
Code Coverage
Ekzistas ankaŭ io nomata “Code Coverage”, kiu povas helpi vin vidi kiom da via kodo estas fakte testata. Ĉi tio povas esti utila por trovi ĉu vi havas sufiĉe da testoj, aŭ ĉu estas partoj de via kodo kiuj tute ne estas testataj.
Kelkaj laborejoj postulas, ke vi havas certan procentaĵon de via kodo kovrita de testoj antaŭ ol vi povas deploji ĝin, por certigi, ke la kodo estas robosta kaj funkcias kiel ĝi devas.

