Bu bo'limda kod to'g'riligini avtomatik tekshirish o'rganildi: unittest moduli bilan funksiyalarni va klasslarni testlash.
Nega test yozamiz
Dastur o'sgani sari har o'zgarish eski joylarni bilinmasdan buzishi mumkin. Qo'lda hamma stsenariyni qayta tekshirib chiqish real emas; avtomatik testlar esa bir buyruq bilan butun dasturni sinaydi va qaysi joy buzilganini aniq aytadi.
Testlar uch narsani beradi:
- Ishonch — o'zgarishdan keyin
python -m unittestyashil bo'lsa, eski funksiyalar joyida. - Hujjat — testlar funksiya qanday ishlashi kerakligining ishlaydigan namunasi.
- Yaxshi dizayn — testlab bo'ladigan kod, odatda, toza kod: kichik,
returnqiladigan, bitta vazifali funksiyalar.
Jiddiy loyihalarda testsiz kod qabul qilinmaydi — Ochiq Kurs saytining o'zi ham har o'zgarishda avtomatik testlardan o'tadi.
Birinchi test
Tekshiriladigan funksiya alohida faylda bo'lsin:
# hisob.py faylida:
# def qosh(a, b):
# return a + b
import unittest
from hisob import qosh
class QoshTest(unittest.TestCase):
def test_oddiy(self):
self.assertEqual(qosh(2, 3), 5)
def test_manfiy(self):
self.assertEqual(qosh(-1, 1), 0)
def test_nol(self):
self.assertEqual(qosh(0, 0), 0)
if __name__ == "__main__":
unittest.main()
Natija:
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Uch qoida:
- Test klassi
unittest.TestCasedan meros oladi — assert metodlari shundan keladi. - Har test metodi nomi
test_bilan boshlanadi. Boshqa nomdagi metodni unittest ishga tushirmaydi — eng ko'p uchraydigan xato:oddiy_testdeb nomlangan test "hech qachon yiqilmaydi", chunki umuman ishlamayapti. - Bitta test — bitta aniq holat; nomi shu holatni aytsin (
test_manfiy_sonlar).
Yiqilgan test qanday ko'rinadi
Funksiyani ataylab buzamiz (return a + b → return a * b):
F..
======================================================================
FAIL: test_oddiy (test_hisob.QoshTest.test_oddiy)
----------------------------------------------------------------------
AssertionError: 6 != 5
Hisobot aniq: qaysi test (test_oddiy), nima bo'ldi (6 != 5 — funksiya 6 qaytardi, 5 kutilgandi). Yiqilgan test — yomon xabar emas, ishlayotgan himoya.
Assert metodlari
| Metod | Tekshiradi |
|---|---|
assertEqual(a, b) |
a == b |
assertNotEqual(a, b) |
a != b |
assertTrue(x) / assertFalse(x) |
x rost / yolg'on |
assertIn(a, b) |
a bning ichida |
assertRaises(Xato) |
Kod aynan shu xatoni beradi |
"Xato chiqishi kerak" holat ham testlanadi — assertRaises kontekst bilan:
def test_matn_qoshib_bolmaydi(self):
with self.assertRaises(TypeError):
qosh("a", 5)
Bu test qosh("a", 5) TypeError berGANDA o'tadi — himoya mavjudligini tasdiqlaydi.
Klasslarni testlash: setUp
Har testda bir xil obyekt kerak bo'lsa, tayyorlash kodini setUpga chiqaring — u har bir testdan oldin qaytadan ishlaydi, shuning uchun testlar bir-biriga ta'sir qilmaydi:
from talaba import Talaba
class TalabaTest(unittest.TestCase):
def setUp(self):
self.t = Talaba("Ali", [90, 85, 95])
def test_ism(self):
self.assertEqual(self.t.ism, "Ali")
def test_ortacha(self):
self.assertEqual(self.t.ortacha(), 90)
def test_ball_qoshish(self):
self.t.ball_qosh(100)
self.assertIn(100, self.t.ballar)
test_ball_qoshish obyektni o'zgartirdi — lekin keyingi test baribir "toza" Talaba("Ali", ...) bilan boshlanadi, chunki setUp qayta ishladi.
Tipik xato — setUp o'rniga klass darajasida bitta obyekt yaratish: testlar bir-birining "iflos" holatini ko'rib, tartibiga qarab goh o'tadi, goh yiqiladi.
Eslab qoling
- Test klassi
unittest.TestCasedan voris; metodlartest_bilan boshlanadi. assertEqual— asosiy vosita; xato kutilgandaassertRaises.setUphar testdan oldin ishlaydi — testlar mustaqil bo'ladi.- Yiqilgan test hisobotida kutilgan va kelgan qiymat aniq ko'rinadi.
- Testlab bo'ladigan funksiya —
printemas,returnqiladigan funksiya.
Amaliyot
ayir(a, b)funksiyasi va unga 3 test yozing: musbat, manfiy, nol holatlari. Ishga tushiribOKko'ring.- Funksiyani ataylab buzing va yiqilgan hisobotdagi har qatorni o'qib chiqing; keyin tuzating.
- Oldingi bo'limdagi
tekshir(parol)funksiyangizga testlar yozing: qisqa parol, yetarli parol, bo'sh matn. int("abc")xato berishiniassertRaises(ValueError)bilan testlang.- O'z
Talabaklassingiz uchunsetUpli test klassi yozing — kamida uchta test, bittasi obyektni o'zgartirsin. - (Qo'shimcha) Transliterator funksiyangizga test yozing: "shahar" → "шаҳар" holati; tartib buzilsa test yiqilishini tekshiring.
Bo'lim testi shu tamoyillarni so'raydi.