Unueca Testado kaj Validigo

Skip to content

Ĉ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 Unua Testado?

Unua Testado (Unit Testing) estas metodo por aŭtomate kaj sisteme testi malgrandajn partojn de nia kodo. En Python ni uzas modulon nomatan pytest por skribi kaj ruli testojn. “Unuo” (unit) estas la plej malgranda testebla parto de aplikaĵo, ofte unuopa funkcio aŭ metodo. Kiam ni uzas pytest, estas grave, ke ni sekvu ĝustajn nomnombrajn konvenciojn por ke pytest povu trovi niajn testojn, kiel ekzemple nomante testdosierojn kun test_ antaŭe, kaj testfunkciojn kun test_ antaŭe.

Ekzemplo de unua 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

Rulata per skribi pytest en la terminalo.

Fun fakta

La kodo supre malsuksesos, ĉar .3+.3+.3 fariĝas 0.8999999999 en Python!

Easy Tasko 1 - Instalu pytest

Instalu pytest en via via vian virtualan medio. Vi faras tion per ruli la sekvan komandon en la terminalo:

pip install pytest
# Installerer pytest for testing
# Instalas pytest por testado

Easy 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():
    # Kreas novan person kun specifaj detaloj
    bob_kaare = Person(name="Bob Kåre",
                       eye_color=EyeColor.BLUE,
                       phone_number=PhoneNumber("12345678"),
                       email=Email("bob_kaare@example.com"))
    # Kontrolu ke la nomo estas ĝusta
    assert bob_kaare.name == "Bob Kåre"
    # Kontrolu ke okula koloro estas blua
    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.

Medium 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_.

Solvo: Ekzemplo de testo por nevalidiga retpoŝto
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”?

A software tester walks into a bar...

Hard 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).

Rimarknote pri dosierstrukturo

Via dosierstrukturo determinos ĉu GitHub Actions funkcias aŭ ne. Certigu, ke la .github dosierujo troviĝas en la radikdosierujo de via projekto, kaj tiel faru ankaŭ pri tests dosierujo kie viaj testdosieroj situas.

Vi povas eventuelmente ŝanĝi la pytest.yml dosieron por montri al la ĝusta dosierujo.

Similaj GitHub Actions-dosier povas ankaŭ esti uzataj por testi vian kodon sur pluraj versioj de Python aŭ operaciumoj; ili ankaŭ povas esti uzataj por aŭtomate konstrui kaj publikigi vian programaron, ekzemple publikigi retejon, aŭ ĝisdatigi aplikaĵon en 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.

Unit Test Meme