python.sariq.dev
Search…
#37 KLASSNI TEKSHIRISH
Klasslarni ham tekshirib turish kerak.

KIRISH

Avvalgi darsimizda funksiyalarni tekshiruvchi testlar yozishni o'rgandik. Ushbu mavzuda esa klasslarni test qilishni o'rganamiz. Klass to'g'ri bo'lsa, undan yaratilgan obyektlar ham to'g'ri ishlaydi.
Keling boshlanishiga biror klass yaratamiz:
1
class Car:
2
"""(self,make,model,year,km=0,price=None)"""
3
def __init__(self,make,model,year,km=0,price=None):
4
self.make = make
5
self.model = model
6
self.year = year
7
self.price = price
8
self.__km = km
9
10
def set_price(self,price):
11
self.price = price
12
13
def add_km(self,km):
14
"""Mashinaning km ga yana km qo'shish"""
15
if km>=0:
16
self.__km += km
17
else:
18
raise ValueError("km manfiy bo'lishi mumkin emas")
19
20
def get_info(self):
21
info = f"{self.make.upper()} {self.model.title()}, "
22
info += f"{self.year}-yil, {self.__km}km yurgan."
23
if self.price:
24
info += f" Narhi: {self.price}"
25
return info
26
27
def get_km(self):
28
return self.__km
Copied!
Yuqoridagi klassimiz avtomobil haqida ma'lumotlarni saqlaydi. Klassimizning e'tibor qaratishimiz kerak bo'lgan jihatlari:
  • km va price (narh) argumentlariga standart qiymat berilgan
  • km parametri inkapsulasiyalangan (self.__km)
  • Avtomobil narhini set_price() metodi yordamida yangilash mumkin
  • add_km() metodi faqat musbat qiymat qabul qiladi. Agar manfiy qiymat uzatilsa raise operatori yordamida ValueError xatosini qaytaradi
  • get_info() metodidan qaytadigan qiymat avtomobil narhi bor yoki yo'qligiga qarab turli ko'rinishda bo'lishi mumkin
  • Avtomobil kilometrajini ko'rish uchun get_km() metodiga murojat qilamiz.

XUSUSIYATLARNI TEKSHIRISH

Klassdan obyekt yaratish jarayonida biz obyektning xususiyatlarini parametr ko'rinishida beramiz. Quyidagi testda aynan shu jarayon to'g'ri kechganini tekshiramiz:
1
import unittest
2
from cars import Car
3
​
4
class CarTest(unittest.TestCase):
5
"""Car klassini tekshirish uchun test"""
6
7
def test_create(self):
8
# avto1 obyektini km va narhini bermasdan yaratamiz
9
avto1 = Car("toyota","camry",2020)
10
# Qiymatlar mavjudligini assertIsNotNone metodi bilan tekshiramiz
11
self.assertIsNotNone(avto1.make)
12
self.assertIsNotNone(avto1.model)
13
self.assertIsNotNone(avto1.year)
14
# Qiymat mavjud emasligini assertIsNone metodi bilan tekshiramiz
15
self.assertIsNone(avto1.price)
16
# Qiymat tengligini assertEquals metodi bilan tekshiramiz
17
self.assertEqual(0,avto1.get_km())
18
# Yangi obyekt yaratamiz va narhini ham ko'rsatamiz
19
avto2 = Car("toyota","camry",2020,price=75000)
20
self.assertEqual(75000,avto2.price)
21
22
unittest.main()
Copied!
Testni bajaramiz va quyidagi natijani olamiz:
1
Ran 1 test in 0.001s
2
​
3
OK
Copied!
Testimizni tahlil qilamiz. Dastaval biz obyektimiz to'g'ri yaratilayotganini tekshrish uchun avto1 obyektini 3 ta prametr bilan yaratib oldik (make, model, year) va bu xususiyatlar bo'sh emasligini assertIsNotNone() metodi bilan tekshirdik.
avto1 obyektini yaratishda uning narhini ko'rsatmadik, demak bu xususiyat standart qiymat (None) ga teng bo'lishi kerak. Buni tekshirish uchun esa assertIsNone() metodiga murojat qildik. Vanihoyat, avtomobil kilometraji 0 ga teng ekanligini assertEquals() metodi yordamida test qildik.
Test so'ngida biz yana bir obyekt yaratdik (avto2) va bu safar avtomobil narhini ko'rsatganimiz uchun assertEquals() metodi yordamida bu qiymat to'g'ri saqlanganini tekshirib oldik.
Testlarni yozishni davom etamiz. Navbat obyektga tegishli turli metodlarga.
Test dasturlarni alohida faylga yozishni unutmang.

setUp() METODI

Yuqoridagi misolda bitta test davomida 2 ta obyekt yaratdik, va obyektning parametrlarini qo'lda yangidan kiritdik. Agar shu yo'sinda davom etadigan bo'lsak, turli testlar uchun har gal yangi obyekt yaratishimiz, va ularning har biriga xususiyatlarni qayta-qayta kiritishimiz talab qilinadi. Buning oldini olish uchun test klassimizning boshida setUp() metodini yaratib, bu metod ichida barcha kerakli qiymatlarni va obyektlarni saqlab qo'yishimiz va turli testlarda shu qiymatlarga murojat qilishimiz mumkin:
1
import unittest
2
from cars import Car
3
​
4
class CarTest(unittest.TestCase):
5
"""Car klassini tekshirish uchun test"""
6
def setUp(self):
7
make = "GM"
8
model = "Malibu"
9
year = 2020
10
self.price = 40000
11
self.km = 10000
12
self.avto1 = Car(make,model,year)
13
self.avto2 = Car(make,model,year,price=self.price)
14
15
def test_create(self):
16
# Qiymatlar mavjudligini assertIsNotNone metodi bilan tekshiramiz
17
self.assertIsNotNone(self.avto1.make)
18
self.assertIsNotNone(self.avto1.model)
19
self.assertIsNotNone(self.avto1.year)
20
# Qiymat mavjud emasligini assertIsNone metodi bilan tekshiramiz
21
self.assertIsNone(self.avto1.price)
22
# Qiymat tengligini assertEquals metodi bilan tekshiramiz
23
self.assertEqual(0,self.avto1.get_km())
24
# avto2 narhini tekshiramiz
25
self.assertEqual(self.price,self.avto2.price)
26
​
27
unittest.main()
Copied!
E'tibor bering, setUp() metodi ichida ba'zi o'zagruvchilar self yordamida berilgan (self.price,self.km, self.avto1, self,avto2). Bu o'zgaruvchilarga biz CarTest() klassining ichida istalgan joydan murojat qilishimiz mumkin. Shuning uchun ham, test_create() funksiyasi ichida biz yangi obyekt yaratmasdan, setUp() ichidagi avto1 va avto2 obyektlariga murojat qildik.

METODLARNI TEKSHIRISH

Obyektimiz bir nechta metodlardan iborat. Ularning har biri uchun alohida test yozamiz. Bu metodlarni CarTest ichida yozishni unutmang.
Osonidan boshlaymiz:
1
def test_set_price(self):
2
self.avto2.set_price(self.price)
3
self.assertEqual(self.price,self.avto2.price)
Copied!
Endi add_km() metodini tekshiraylik. Bu metodimiz faqatgina musbat qiymat qabul qilishi, manfiy qiymat uzatilganda ValueError xatosini qaytarishi kerak edi. Shuning uchun metodni test qilishda avval musbat, keyin esa manfiy qiymat berib ko'ramiz.
1
def test_add_km(self):
2
#1 Musbat qiymat berib ko'ramiz
3
self.avto1.add_km(self.km)
4
self.assertEqual(self.km,self.avto1.get_km())
5
#2 Manfiy qiymat berib ko'ramiz
6
new_km = -5000
7
try:
8
self.avto1.add_km(new_km)
9
except ValueError as error:
10
self.assertEqual(type(error), ValueError)
Copied!
Navbat get_info() metodiga. Bu metod ham obyektning xususiyatlaridan kelib chiqqan holda 2 hil qiymat qaytarishi mumkin, demak testimiz bu ikki holatni hisobga olishi kerak.
1
def test_get_info(self):
2
avto1_info = 'GM Malibu, 2020-yil, 0km yurgan.'
3
self.assertEqual(avto1_info,self.avto1.get_info())
4
# avto1 narhi va km o'zgartiramiz
5
self.avto1.set_price(50000)
6
self.avto1.add_km(20000)
7
avto1_info = 'GM Malibu, 2020-yil, 20000km yurgan. Narhi: 50000'
8
self.assertEqual(avto1_info,self.avto1.get_info())
Copied!
Yakuniy test dasturimiz quyidagi ko'rinishga ega bo'ldi:
1
import unittest
2
from cars import Car
3
​
4
class CarTest(unittest.TestCase):
5
"""Car klassini tekshirish uchun test"""
6
def setUp(self):
7
make = "GM"
8
model = "Malibu"
9
year = 2020
10
self.price = 40000
11
self.km = 10000
12
self.avto1 = Car(make,model,year)
13
self.avto2 = Car(make,model,year,price=self.price)
14
15
def test_create(self):
16
# Qiymatlar mavjudligini assertIsNotNone metodi bilan tekshiramiz
17
self.assertIsNotNone(self.avto1.make)
18
self.assertIsNotNone(self.avto1.model)
19
self.assertIsNotNone(self.avto1.year)
20
# Qiymat mavjud emasligini assertIsNone metodi bilan tekshiramiz
21
self.assertIsNone(self.avto1.price)
22
# Qiymat tengligini assertEquals metodi bilan tekshiramiz
23
self.assertEqual(0,self.avto1.get_km())
24
# avto2 narhini tekshiramiz
25
self.assertEqual(self.price,self.avto2.price)
26
27
def test_set_price(self):
28
self.avto2.set_price(self.price)
29
self.assertEqual(self.price,self.avto2.price)
30
31
def test_add_km(self):
32
# Musbat qiymat berib ko'ramiz
33
self.avto1.add_km(self.km)
34
self.assertEqual(self.km,self.avto1.get_km())
35
# Manfiy qiymat berib ko'ramiz
36
new_km = -5000
37
try:
38
self.avto1.add_km(new_km)
39
except ValueError as error:
40
self.assertEqual(type(error), ValueError)
41
42
def test_get_info(self):
43
avto1_info = 'GM Malibu, 2020-yil, 0km yurgan.'
44
self.assertEqual(avto1_info,self.avto1.get_info())
45
# avto1 narhi va km o'zgartiramiz
46
self.avto1.set_price(50000)
47
self.avto1.add_km(20000)
48
avto1_info = 'GM Malibu, 2020-yil, 20000km yurgan. Narhi: 50000'
49
self.assertEqual(avto1_info,self.avto1.get_info())
50
​
51
52
unittest.main()
Copied!
Testni bajaramiz va quyidagi natijani olamiz:
1
....
2
----------------------------------------------------------------------
3
Ran 4 tests in 0.002s
4
​
5
OK
Copied!

AMALIYOT

  • ​30-darsimizda Shaxs va Talaba klasslarini yaratgan edik. Shu ikki klassning xususiyatlari va metodlarini tekshiruvchi test dasturlar yozing.
  • Ikki klass uchun yagona test yoza olasizmi? (isInstance() funksiyasini eslang)

KODLAR

GitHub - anvarnarz/python-darslar: Dasturlash asoslari darslari
GitHub
Last modified 9mo ago