Barcha kurslar Yo'nalishlar Reyting Kirish Ro'yxatdan o'tish

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:

  1. Ishonch — o'zgarishdan keyin python -m unittest yashil bo'lsa, eski funksiyalar joyida.
  2. Hujjat — testlar funksiya qanday ishlashi kerakligining ishlaydigan namunasi.
  3. Yaxshi dizayn — testlab bo'ladigan kod, odatda, toza kod: kichik, return qiladigan, 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:

  1. Test klassi unittest.TestCasedan meros oladi — assert metodlari shundan keladi.
  2. Har test metodi nomi test_ bilan boshlanadi. Boshqa nomdagi metodni unittest ishga tushirmaydi — eng ko'p uchraydigan xato: oddiy_test deb nomlangan test "hech qachon yiqilmaydi", chunki umuman ishlamayapti.
  3. Bitta test — bitta aniq holat; nomi shu holatni aytsin (test_manfiy_sonlar).

Yiqilgan test qanday ko'rinadi

Funksiyani ataylab buzamiz (return a + breturn 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; metodlar test_ bilan boshlanadi.
  • assertEqual — asosiy vosita; xato kutilganda assertRaises.
  • setUp har testdan oldin ishlaydi — testlar mustaqil bo'ladi.
  • Yiqilgan test hisobotida kutilgan va kelgan qiymat aniq ko'rinadi.
  • Testlab bo'ladigan funksiya — print emas, return qiladigan funksiya.

Amaliyot

  1. ayir(a, b) funksiyasi va unga 3 test yozing: musbat, manfiy, nol holatlari. Ishga tushirib OK ko'ring.
  2. Funksiyani ataylab buzing va yiqilgan hisobotdagi har qatorni o'qib chiqing; keyin tuzating.
  3. Oldingi bo'limdagi tekshir(parol) funksiyangizga testlar yozing: qisqa parol, yetarli parol, bo'sh matn.
  4. int("abc") xato berishini assertRaises(ValueError) bilan testlang.
  5. O'z Talaba klassingiz uchun setUpli test klassi yozing — kamida uchta test, bittasi obyektni o'zgartirsin.
  6. (Qo'shimcha) Transliterator funksiyangizga test yozing: "shahar" → "шаҳар" holati; tartib buzilsa test yiqilishini tekshiring.

Bo'lim testi shu tamoyillarni so'raydi.

Kodni tekshirish — konspekt

Kodni tekshirish Maqola

unittest bilan funksiya va klasslarni test qilish — bir sahifada.

Eslatma yozish uchun saytga kiring.

Resurslar hozircha qo'shilmagan

O'qituvchi dars uchun qo'shimcha materiallarni qo'shganida shu yerda paydo bo'ladi.

Savol berish uchun saytga kiring.

Hozircha savollar yo'q

Bu dars yuzasidan birinchi savolni siz bering.