✦ Srednji nivo Pythona i OOP Kvalitet koda

L2 · Koncept 04 · Kvalitet koda i testiranje

Jedinično testiranje uz unittest
Testiraj kod pre nego što te greške iznenade.

Nauči da pišeš male automatske provere koje potvrđuju očekivano ponašanje pre nego što promena postane neprijatno iznenađenje.

Cilj učenjaPiši jednostavne unittest provere sa jasnim assertion proverama, pokreći ih lokalno i koristi uobičajene i rubne slučajeve da zaštitiš očekivano ponašanje.
01 Uči02 Radi lokalno03 Proveri razumevanje

Učenje kao gost

Učiš kao gost — sačuvaj svoj napredak!

Napravi besplatan nalog i uči uz Sloby AI mentora, proveru razumevanja i praćenje napretka.

Cela platforma je besplatna tokom 2026. Foundations ostaje zauvek besplatan.

Testovi automatski proveravaju očekivanja.

Debagovanje nam pomaže da pronađemo uzrok problema koji smo već primetili. Automatski testovi proveravaju ponašanje koje očekujemo i mogu nas upozoriti kada kasnija promena slučajno pokvari nešto što je ranije radilo.

# Manual check
print(izracunaj_popust(100, 10))

# Automatic check inside a test
self.assertEqual(izracunaj_popust(100, 10), 90)

Ručna provera traži da pročitaš i proceniš izlaz. Automatska assertion provera poredi stvarni rezultat sa očekivanim i javlja da li se podudaraju.

Testovi ne dokazuju da program nema nijednu grešku. Oni proveravaju konkretne slučajeve koje izabereš, zato je važno birati korisne primere.

↳

Jedinični test je mali: Jedinični test obično proverava jedan jasno izdvojen deo programa, kao što su funkcija ili metod, u situaciji koju možeš precizno da opišeš.

Tvoj prvi unittest
import unittest

def saberi(a: int, b: int) -> int:
    return a + b


class TestSabiranje(unittest.TestCase):
    def test_dva_pozitivna_broja(self):
        self.assertEqual(saberi(2, 3), 5)


if __name__ == "__main__":
    unittest.main()

Uvozimo standardnu biblioteku unittest. unittest.TestCase našoj test klasi daje assertion metode. Metod koji počinje sa test_ prepoznaje se kao test, a assertEqual poredi stvarni rezultat sa očekivanom vrednošću. unittest.main() je koristan kada ovaj fajl pokrećemo direktno, ali testovi mogu da se pokrenu i pomoću python -m unittest.

Odvoji implementaciju i testove
moj_projekat/
├── kalkulator.py
└── test_kalkulator.py

# kalkulator.py
def saberi(a: int, b: int) -> int:
    return a + b

# test_kalkulator.py
import unittest
from kalkulator import saberi

class TestKalkulator(unittest.TestCase):
    def test_sabiranje(self):
        self.assertEqual(saberi(4, 6), 10)

Odvajanje implementacije od njenih testova čuva fokus svakog fajla. Iz foldera projekta pokreni python -m unittest -v; na nekim sistemima koristi python3 -m unittest -v. Opcija -v prikazuje više detalja, a unittest obično pronalazi fajlove kao što je test_kalkulator.py i druge fajlove oblika test*.py.

Arrange → Act → Assert
def test_popust_deset_posto(self):
    # Arrange
    cena = 200
    popust = 10

    # Act
    rezultat = izracunaj_popust(cena, popust)

    # Assert
    self.assertEqual(rezultat, 180)

Arrange priprema ulazne podatke, Act izvršava ponašanje, a Assert poredi stvarni rezultat sa očekivanim. Ti komentari su korisni dok učiš, ali su jasno ime testa i jasno očekivanje često vredniji od mnogo komentara.

Tri osnovne assertion provere
self.assertEqual(saberi(2, 3), 5)
self.assertTrue(10 > 5)
self.assertFalse(10 < 5)

assertEqual proverava da li su dve vrednosti jednake. assertTrue proverava istinit izraz, a assertFalse neistinit izraz. Za konkretan očekivani broj ili tekst, assertEqual je obično najjasniji izbor. Sa assertRaises ćemo se upoznati u sledećoj lekciji o izuzecima.

Pokreni testove iz VS Code terminala
python -m unittest -v
python -m unittest discover -v

# Or, on some systems:
python3 -m unittest -v
python3 -m unittest discover -v

Pokreni komandu iz odgovarajućeg foldera projekta. Pronalaženje testova i njegov tačan izlaz mogu zavisiti od strukture fajlova i verzije Pythona, ali podrazumevani obrazac za test fajlove je test*.py.

Pažljivo pročitaj rezultat testa

  1. OK znači da je svaka izvršena assertion provera prošlaRezultat OK znači da je pokretač testova završio provere i da nijedna assertion provera nije pala.
  2. FAIL znači da assertion provera nije ispunjenaNa primer, self.assertEqual(10, 12) se normalno izvršava, ali pada zato što su vrednosti različite.
  3. ERROR znači da test nije mogao normalno da se završiNa primer, rezultat = 10 / 0 izaziva neočekivani izuzetak pre nego što kasnija assertion provera može da se izvrši. FAIL i ERROR su različiti tragovi, a ne dokaz da sam Python ne radi.
  4. Koristi uobičajene i rubne slučajeveZa funkciju za popust testiraj 0%, 10%, 100% i cenu 0. Rubni slučaj je granična situacija koju jedan običan primer može da propusti.
  5. Neka testovi štite od regresijaRegresija nastaje kada kasnija promena pokvari ponašanje koje je ranije radilo. Test može prijaviti FAIL, a zatim ti debagovanje pomaže da pronađeš i ispraviš uzrok. Ne menjaj očekivani rezultat samo da bi test prošao; prvo odluči kakvo je ponašanje ispravno.

Česte početničke greške pri testiranju

  • Testiranje samo jednog primeraJedan uspešan primer daje ograničeno poverenje. Dodaj uobičajene i rubne slučajeve koji su važni za funkciju.
  • Zaboravljanje prefiksa test_Metod bez očekivanog prefiksa test_ možda neće biti pronađen i pokrenut.
  • Pokretanje iz pogrešnog folderaProveri folder terminala i imena fajlova pre nego što zaključiš da unittest ne može da pronađe tvoje testove.
  • Menjanje očekivanja samo da bi rezultat bio OKIme testa treba da opiše šta test proverava. Istraži da li su implementacija ili očekivani rezultat pogrešni pre nego što promeniš bilo koji od njih.

Moji prvi automatski testovi

Lokalna vežba u VS Code-u

Preuzmi mali projekat kalkulatora popusta, pokreni njegove početne testove i iskoristi jedan namerni FAIL da uvežbaš pronalaženje i ispravljanje logičke greške.

Preuzmi ZIP projekta
Fajlovi projekta
unittest_prvi_testovi/
├── kalkulator.py
├── test_kalkulator.py
├── README_SR.md
└── README_EN.md

Početni projekat sadrži tri male funkcije za rad sa cenama i tri testa. Jedan FAIL testa je nameran; ostali početni testovi prolaze bez ERROR.

Radi kroz testove lokalno

  1. Otvori raspakovani folder u VS Code-uPročitaj odgovarajući README fajl, a zatim koristi ugrađeni terminal iz foldera unittest_prvi_testovi.
    python3 -m unittest -v
  2. Istraži namerni FAILUporedi stvarni rezultat popusta sa očekivanom vrednošću pre menjanja koda. Cilj je da popraviš logiku, a ne da oslabiš test.
↳

Pokreni ponovo nakon fokusirane izmene: python3 -m unittest -v Na sistemima gde se Python poziva kao <code>python</code>, koristi <code>python -m unittest -v</code>. Sačuvaj testove nakon ispravke da bi mogli da otkriju kasniju regresiju.

Navika pri testiranju koju vredi zadržati

  • Pročitaj FAIL pre menjanja kodaUporedi stvarne i očekivane vrednosti, pa odluči da li treba istražiti ponašanje ili očekivanje.

Kakav će biti rezultat pokretanja ovog testa?

Pretpostavi da unittest pronalazi i pokreće ovaj test metod.

import unittest


class TestBrojevi(unittest.TestCase):
    def test_sabiranje(self):
        self.assertEqual(10, 12)
Izaberi izlaz

Izgrađuj samopouzdanje samostalnim radom

Isplaniraj tri testa za funkciju kvadrat

Nemoj odmah pisati potpuno rešenje. Najpre odluči koji bi ulazi i očekivani rezultati pružili korisne dokaze.

Vaš ciljNapiši tri smislena testa za kvadrat: jedan za pozitivan broj, jedan za nulu i jedan za negativan broj. Za svaki test objasni očekivani rezultat.
def kvadrat(broj: int) -> int:
    return broj * broj

Radi u svom lokalnom VS Code folderu

Nagoveštaji korak po korak
  • Počni tako što ćeš zapisati ulaz i tačan očekivani izlaz za jedan pozitivan broj.
  • Zapitaj se šta vraća množenje nule nulom.
  • Kvadrat negativnog broja je korisna provera zato što se znak u rezultatu menja.

Pitaj Slobyja jedno vodeće pitanje o assertion proveri ili rubnom slučaju; nemoj tražiti da napiše sva tri završena testa umesto tebe.

Sloby, maskota Python AI Tutora

Tvoj mentor za učenje

Prijavite se da pitate Slobyja

Napravite besplatan nalog ili se prijavite za AI smernice tokom učenja.

Prijavite se da proverite svoje razumevanje

Napravite besplatan nalog ili se prijavite da biste dobili AI povratnu informaciju i sačuvali napredak u učenju.

Python AI Tutor · Uči razumevanjem, a ne samo pokretanjem koda.