# 36 FUNKSIYANI TEKSHIRISH
Dasturni tekshiruvchi dastur yozamiz
Last updated
Dasturni tekshiruvchi dastur yozamiz
Last updated
Dastur davomida yangi funksiya yoki klass yozar ekanmiz, ularni to'g'ri ishlashini ham tekshirishimiz tabiiy. Kodni tekshirish, kelajakda dasturimiz xato ishlashining oldini oladi. Odatda, funksiya va klasslarni tekshirish uchun alohida test dasturlar yozishimiz mumkin. Bunday dasturlar funksiyaga turli parametrlar orqali murojat qilib, undan qaytgan qiymatlar to'g'ri yoki xato ekanini tekshiradi.
Pythonda bu jarayonni osonlashtirish uchun maxsus unittest
moduli mavjud. unittest
yordamida alohida funksiya, obyekt yoki butun boshli modulni ham tekshirshimiz mumkin. Lekin, tavsiya qilingan usuli bu testni dastavval kichik qismlardan boshlab, kengaytirib borish.
Boshlanishiga biror sodda funksiya yozamiz. Quyidagi funksiya foydalanuvchi ismi va familiyasini qabul qiladi, va ism familiyani jamlab qaytaradi:
Funksiyani tekshiramiz:
Keling endi shu funksiyamizni tekshirish uchun dastur yozamiz. Bu yerda ikki narsaga ahamiyat beramiz: avvalo funksiyamizni alohida modulda saqlaymiz (name.py
), ikkinchidan test dasturimizni ham alohida modulda yozamiz va unga ham tushunarli nom beramiz (masalan, name_test.py
).
Test faylimizning (name_test.py
) tarkibi quyidagicha bo'ladi:
Dasturni tahlil qilamiz:
Dastavval unittest modulini chaqiramiz (import unittest
)
Keyingi qatorda name.py
modulimizdan tekshirmoqchi bo'lgan funksiyamizni ham yuklab olamiz (get_full_name
).
4-qatorda test klassini yaratamiz, bu klassunittest.TestCase
klassidan meros oladi. Bu klass berilgan parametrlar uchun funksiyadan qaytgan qiymatlarni tekshirishga mo'ljallangan. Klassimizga o'zimiz istagan, tushunarli nom beramiz (NameTest
).
Klassimiz ichida test_toliq_ism
metodini yaratdik. Bu metod get_full_name
funksiyasidan qaytgan qiymatni biz avvaldan bergan qiymatga teng yoki yo'q ekanini tekshiradi. Buning uchun esa maxsus .assertEqual()
metodidan foydalandik. E'tibor bering, test medotlarning nomi har doim test
so'zi bilan boshlanishi kerak.
assertEqual()
metodi ikki qiymat qabul qiladi va ularning teng ekanligini tekshiradi (assert ingliz tilidan tasdiqlash deb tarjima qilinadi). Agar get_full_name('alijon','valiyev')
funksiyamiz to'g'ri ishlasa, funksiyadan 'Alijon Valiyev'
qiymati qaytishi kerak. assertEqual()
metodi aynan shuni tekshirishga mo'ljallangan.
So'nggi qatorda unittest klassinini chaqiramiz, bu esa o'z navbatida biz yuqorida yozgan testni chaqiradi.
name_test.py
dasturimizni bajaramiz va quyidagi natijani olamiz:
Natijadan bitta test bajarilganini va va bu test muvaffaqiyatli o'tganini (OK
) ko'rishimiz mumkin.
Keling endi dars boshida yaratilgan get_full_name
funksiyamizga o'zgartirish kiritamiz:
Bu safar funksiyamiz otasining ismini ham qabul qiladi, lekin bu argument ixtiyoriy.
Testimizga ham o'zgartirish kiritamiz. Bu safar ikki hil ism uchun ikkita alohida test bajaramiz:
Testni bajaramiz, va quyidagi natijani olamiz:
Bu safar funksiyamiz 1 ta testdan yiqildi (failures=1
). Biz kutgan natija (Hasan Olimovich Husanov) va funksiya qaytargan natija (hasan olimovich husanov) bir hil emas. Ya'ni, ism familiya va otasining ismi katta harflar bilan yozlishi kerak edi, lekin natija unday emas. Demak funksiyamizda xato bor. Xatoni to'g'rilaymiz:
Testni qaytadan chaqiramiz:
Bu safar funksiyamiz ikki testdan ham muvaffaqiyatli o'tdi.
Yuqorida matn qaytaruvchi funksiyani tekshirishni ko'rdik. Keling endi sonlar bilan ishlashni ko'ramiz. Misol tariqasida yangi circle.py
modulini yaratamiz va uning ichida doiraning yuzini ( ) va perimetrini ( ) hisoblaydigan funksiyalar yozamiz:
E'tibor bering, ikki funksiya ham, agar foydalanuvchi aniq qiymat bermasa, ning qiymatini standart argument sifatida 3.14159
ga teng deb qabul qilayapti. Ushbu funksiyalarni tekshirish uchun alohida circle_test.py
test dasturini yozamiz. Matnlardan farqli ravishda, sonlarni taqqoslash uchun assertAlmostEqual()
metodidan foydalanamiz. Bu metod, ikki sonni nuqtadan keyin 7 xonagacha aniqlikda tekshiradi:
Bu yerda e'tibor qiling, biz har bir funksiya uchun 2 tadan test yozdik. Testni bajaramiz va quyidagi natijani olamiz:
Agar funksiya mantiqiy qiymat qaytarsa, bunday funksiyalarni assertTrue()
va assertFalse()
metodlari yordamida tekshirishimiz mumkin.
Quyidagi funksiyamiz kiritilgan son tub yoki yo'q ekanini tekshiradi:
Funksiyani alohida tubSonmi.py
fayliga saqlaymiz. Funksiyani tekshirish uchun tubSon_test.py
dasturini yozamiz:
Test davomida tubSonmi()
funksiyasini bir nechta tub (7, 193, 547
) va tub bo'lmagan (6, 265, 489
) sonlar bilan chaqirdik. Bunda assertTrue()
metodi funksiyamiz haqiqatdan ham True
qiymatini qaytarishini, assertFalse()
metodi esa funksiyamiz False
qiymat qaytarishini tekshiradi.
TestCase
klassi tarkibidagi boshqa taqqoslash metodlari ham mavjud:
Metod
Nimani taqqoslaydi?
a == b
a != b
x
ning qiymati True
x
ning qiymati False
a
bu b
a
bu b
emas
x
ning qiymati None
x
ning qiymati None
emas
a
b
ning ichida
a
b
ning ichida emas
a
b
ning vorisi
a
b
ning vorisi emas
Quyidagi funksiyalarni yarating, va ularning har biri uchun test dasturlarini yozing:
Uchta son qabul qilib, ulardan eng kattasini qaytaruvchi funksiya
Matnlardan iborat ro'yxat qabul qilib, ro'yxatdagi har bir matnning birinchi harfini katta harfga o'zgatiruvchi funksiya
Berilgan sonlar ro'yxatidan juft sonlarni ajratib oluvchi funksiya
Berilgan son Fibonachchi ketma-ketligida uchraydimi (True
) yoki yo'q (False
) qaytaruvchi funksiya yozing.