Bosh sahifa Wiki Python testing

Python testing

Python testing — Python dasturining kutilgan xatti-harakatini avtomatik tekshiruvchi testlarni yozish va bajarish amaliyotidir. Test ma’lum kirish va holatni tayyorlaydi, kodni ishga tushiradi, natija yoki exceptionni assertion bilan tekshiradi va resurslarni tozalaydi. Python standart kutubxonasida unittest, ekotizimda esa pytest keng qo‘llanadi.

Testning tuzilishi

Kichik test odatda arrange, act va assert bosqichlariga ajraladi. Arrange dependency va kirishni tayyorlaydi, act tekshirilayotgan amalni bir marta bajaradi, assert kuzatiladigan natijani tekshiradi. Bu qat’iy sintaksis emas, test maqsadini o‘qishni osonlashtiruvchi tuzilma.

def test_total_applies_discount():
    order = Order(items=[100, 50], discount=10)
    result = order.total()
    assert result == 140

Test implementation ichidagi vaqtinchalik local qiymatlarni emas, tashqi contractni tekshirsa refactoringga chidamli bo‘ladi. Bir test juda ko‘p mustaqil xatti-harakatni tekshirsa failure sababi noaniqlashadi.

unittest va pytest

unittest test case classlari, setUp, tearDown, assertion methodlari va mock modulini beradi. U Python bilan birga keladi. pytest oddiy assert, fixture, parametrization, marker va plugin tizimini taqdim etadi. Pytest ko‘plab unittest.TestCase testlarini ham yig‘ib bajara oladi.

Framework tanlovi testning mantiqiy sifatini o‘zi belgilamaydi. Muhim jihatlar izolyatsiya, aniq assertion, deterministic input va tushunarli failure xabaridir. Loyiha konfiguratsiyasida test katalogi, markerlar va warning siyosati bir xil belgilansa local hamda CI natijasi mos keladi.

Fixture va parametrization

Fixture testga vaqtinchalik katalog, database connection, client yoki sample object beradi. Fixture scope’i function, class, module yoki session bo‘lishi mumkin. Yoziladigan state function scope’da ajratilsa testlar bir-birining natijasiga bog‘lanmaydi. Qimmat read-only resurs kattaroq scope’da ulashilishi mumkin.

Parametrization bir xil contractni bir nechta input bilan bajaradi:

@pytest.mark.parametrize("text, expected", [
    ("12", 12),
    (" 7 ", 7),
])
def test_parse_number(text, expected):
    assert parse_number(text) == expected

Boundary qiymatlar, bo‘sh input, Unicode va noto‘g‘ri format alohida case sifatida beriladi. Juda katta parametr jadvali esa test nomini o‘qishni qiyinlashtiradi; case ID failure ma’nosini ko‘rsatadi.

Exception va mock

Kutilgan xato type va zarur bo‘lsa message yoki attribute bo‘yicha tekshiriladi. Faqat “har qanday exception chiqdi” deyish noto‘g‘ri joydagi xatoni ham muvaffaqiyat deb qabul qilishi mumkin. Exception chiqmagan yo‘l ham alohida test qilinadi.

Mock tashqi service, vaqt yoki nondeterministic dependency chegarasini nazorat qiladi. Python’da patch nom yaratilgan modulni emas, tekshirilayotgan modul qayerdan lookup qilayotganini nishonga oladi. Haddan ortiq ichki methodlarni mocklash testni implementationga bog‘laydi; interface yoki adapter chegarasini almashtirish barqarorroq.

Izolyatsiya va vaqt

Test real home katalog, global environment yoki umumiy database’ni o‘zgartirmaydi. Temporary path va transaction cleanup ishlatiladi. Random test seedni qayd etadi. Vaqtga bog‘liq kodga clock dependency berish sleep bilan kutishga qaraganda tez va takrorlanuvchi.

Async funksiya async test runner ichida await qilinadi. Test tugaganda background task, socket va event loop handle qolmasligi kerak. Thread yoki process ishlatilsa timeout va yakuniy join bajariladi.

Discovery, coverage va CI

Test discovery fayl va funksiya nomlash qoidalari bo‘yicha testlarni topadi. Collection paytidagi import side effect test boshlanmasdan failure berishi mumkin. pytest --collect-only kabi rejim topilgan testlar ro‘yxatini tekshirishga yordam beradi.

Coverage qaysi satr yoki branch bajarilganini o‘lchaydi, lekin assertion sifatini isbotlamaydi. Yuqori coverage noto‘g‘ri talabni tekshirayotgan testlar bilan ham hosil bo‘lishi mumkin. CI test, lint va type checkni toza muhitda ishga tushiradi; dependency versiyasi lock qilinsa natija qayta ishlab chiqariladi.

Bog‘liq tushunchalar

pytest, unittest, Fixture, Parametrized testing, Mock object, Test discovery, Code coverage