Bosh sahifa Wiki Pytest

Pytest

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

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:

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