Pytest — Python loyihalarida test yozish va ishga tushirish uchun ishlatiladigan test framework. U oddiy assert, fixture, parametrization, plugin, test discovery va batafsil failure report imkoniyatlari bilan tanilgan. Pytest unit, integration, API va boshqa test turlarida qo‘llanadi.
Oddiy function test yozish uchun maxsus class meros olish shart emas.
Test discovery
Pytest odatda:
test_*.py;*_test.py;test_*function;Test*class
patternlarini topadi.
Aniq qoidalar konfiguratsiyada o‘zgartirilishi mumkin.
Test class constructor talab qilmasligi kerak.
Oddiy assert
Pythonning tabiiy assertioni ishlatiladi:
def test_sum():
assert sum_values(2, 3) == 5
Pytest assertion rewriting orqali expected va actual qismlarni tahlil qilib, tushunarli diff beradi.
Fixture
Fixture setup va resursni testga parameter orqali uzatadi:
def test_profile(client):
...
client nomli fixture avtomatik topiladi.
Fixture boshqa fixturega bog‘lanishi mumkin.
Dependency injectionga yaqin model hosil bo‘ladi.
Fixture scope
Function scope izolyatsiya beradi.
Session scope qimmat resursni bir marta yaratadi.
Mutable shared state testlar o‘rtasida tozalanadi.
Yield fixture
Fixture yieldgacha setup, undan keyin teardown bajaradi.
Masalan:
resource yaratish
yield resource
resource yopish
Test yiqilsa ham teardown bajariladi.
Bir nechta cleanup uchun context manager ishlatilishi mumkin.
conftest.py
Directory bo‘yicha umumiy fixture va hooklar conftest.py ichida saqlanadi.
Testlar uni import qilmasdan fixture’dan foydalanadi.
Juda ko‘p yashirin fixture hierarchy’ni tushunishni qiyinlashtirishi mumkin.
Scope va nomlar aniq bo‘ladi.
Parametrization
Bitta test turli inputlar bilan qayta ishlaydi:
@pytest.mark.parametrize(
"value, expected",
[(1, 2), (2, 4)]
)
Har case alohida test natijasi sifatida ko‘rinadi.
Case ID failure reportni tushunarli qiladi.
Mark
Testlarga marker beriladi:
- slow;
- integration;
- database;
- smoke;
- platform.
Command bilan ma’lum marker tanlanadi.
Custom markerlar konfiguratsiyada ro‘yxatdan o‘tkaziladi.
Noto‘g‘ri yozilgan marker silent skip bo‘lmasligi kerak.
Exception
pytest.raises ma’lum exceptionni tekshiradi.
Context ichida aynan xato chiqarishi kerak bo‘lgan action bo‘ladi.
Exception message yoki attribute ham tekshirilishi mumkin.
Juda keng Exception turi noto‘g‘ri failure’ni qabul qiladi.
Approx
Floating-point qiymat uchun pytest.approx tolerance bilan equality beradi.
Absolute va relative tolerance sozlanadi.
Moliyaviy decimal hisobda floating point o‘rniga Decimal kerak bo‘lishi mumkin.
Approx business rounding qoidasi o‘rnini bosmaydi.
Monkeypatch
Test vaqtida:
vaqtincha o‘zgartiriladi.
Test tugagach asl holat avtomatik tiklanadi.
Global patch qaysi namespace’da ishlatilayotganini to‘g‘ri tanlash kerak.
tmp_path
Har testga unique temporary directory beradi.
File yaratish va o‘qish testlari real project directory’ni iflos qilmaydi.
Pathlib object qaytaradi.
Session darajasidagi temp factory ham mavjud.
capsys va caplog
capsys stdout va stderr’ni ushlaydi.
caplog logging recordlarini tekshiradi.
Faqat matn emas, level va logger nomi ham tekshirilishi mumkin.
Production logda sensitive data chiqmasligi alohida test qilinadi.
Skip va xfail
Skip test ayni environmentda bajarilmasligini bildiradi.
Xfail ma’lum bug yoki unsupported behavior sabab kutilgan failure’ni belgilaydi.
Xfail kutilmaganda o‘tsa XPASS bo‘ladi.
Doimiy xfail bug backlogda yo‘qolmasligi kerak.
Plugin
Pytest katta plugin ekotizimiga ega.
Misollar:
Plugin versionlari pytest va project bilan compatible bo‘lishi kerak.
Keraksiz plugin test startupini sekinlashtiradi.
Async test
Async plugin event loopni boshqaradi.
Test coroutine await bilan ishlaydi.
Loop scope va async fixture qoidalari plugin configurationiga bog‘liq.
Real sleep o‘rniga clock yoki event simulation ishlatilishi mumkin.
Parallel test
Plugin orqali testlar bir nechta processda bajariladi.
Har worker alohida database, port yoki temp data oladi.
Session fixture har workerda alohida yaratilishi mumkin.
Parallel run test isolation muammolarini yuzaga chiqaradi.
Pytest va unittest
unittest Python standard library ichida class-based xUnit modelini beradi.
Pytest oddiy function, fixture va kuchli introspection bilan sodda sintaksis taklif qiladi.
Pytest unittest testlarini ham topib ishga tushira olishi mumkin.
Configuration
Config quyidagi fayllardan birida bo‘lishi mumkin:
pyproject.toml;pytest.ini;tox.ini;setup.cfg.
Marker, path, option va warning policy belgilanadi.
CI command repositoryda standardlashtiriladi.
Fixture finalizer
request.addfinalizer kabi mexanizm yield’dan tashqari cleanup ro‘yxatini boshqarishi mumkin. Resurs qisman yaratilgan holatda ham faqat muvaffaqiyatli bosqichlar tozalanadi.
Indirect parametrization
Parametr qiymati testga to‘g‘ridan-to‘g‘ri emas, fixture setupiga berilishi mumkin. Masalan, turli database engine yoki user roli ayni testni boshqa environmentda ishga tushiradi.
Warning
Pytest warninglarni ko‘rsatadi, filterlaydi yoki errorga aylantiradi. Deprecated API warningini e’tiborsiz qoldirish keyingi dependency update’da build buzilishiga olib kelishi mumkin.
Collection hook
Plugin yoki conftest testlarni collection paytida belgilashi, skip qilishi yoki tartiblashi mumkin. Juda ko‘p custom hook test discovery’ni tushunishni qiyinlashtiradi.
Bog‘liq tushunchalar
Pytest, Python testing, Fixture, Parametrization, Marker, Monkeypatch, Test discovery, Exception testing, unittest, Code coverage, Test automation