Bosh sahifa Wiki Async testing

Async testing

Async testing — natijasi keyinroq tayyor bo‘ladigan coroutine, promise, callback yoki event-driven kodni nazorat qilinadigan sharoitda tekshirish usullaridir. Oddiy test faqat funksiyaning qaytishini kutsa, asinxron test event loop, tasklar, timeout, cancellation va resurslarning yopilishini ham hisobga oladi.

Testning tugash chegarasi

Asinxron test runner test funksiyasini event loop ichida bajaradi va qaytarilgan awaitable yakunlanishini kutadi. Await unutib qoldirilsa, test muvaffaqiyatli ko‘rinishi mumkin, lekin coroutine umuman ishlamaydi. Shu sabab runner ogohlantirishlari va pending task tekshiruvi muhim hisoblanadi.

Python ekotizimida pytest uchun async plugin yoki unittest.IsolatedAsyncioTestCase ishlatilishi mumkin. Misol:

async def test_load_profile(client):
    profile = await client.load_profile(42)
    assert profile["id"] == 42

Test clientning real tarmoq xizmatiga bog‘lanishi shart emas. Fake transport yoki test server protokol javobini belgilangan tartibda beradi. Bu application mantiqini tashqi xizmatning tezligi va mavjudligidan ajratadi.

Vaqt va timeout

Real sleep testlarni sekin va beqaror qiladi. Virtual clock yoki controllable scheduler vaqtni oldinga siljitib, retry, debounce va expiration qoidalarini soniyalab kutmasdan tekshiradi. Fake clock faqat kutish APIlari unga bog‘langan bo‘lsa ishonchli natija beradi; operatsion tizimning real timeri aralashsa ikki vaqt manbai paydo bo‘ladi.

Har testning yuqori timeouti bo‘lishi deadlockni cheksiz kutishni to‘xtatadi. Biroq timeoutning o‘zi xatoning sababini bermaydi. Failure xabarida pending tasklar, stack holati va kutayotgan synchronization primitive ko‘rsatilsa diagnostika osonlashadi.

Parallel hodisalarni boshqarish

Concurrency xatolari faqat hodisalar ma’lum tartibda kelganda ko‘rinadi. Test sleep orqali taxminiy tartib yaratmasdan barrier, event yoki queue bilan aniq nuqtalarni boshqaradi. Masalan, ikki request bir xil cache missni ko‘rishi uchun ikkala task ham lookup bosqichiga yetgani tasdiqlanadi, keyin davom ettiriladi.

Tekshiriladigan holatlar quyidagilarni qamrab oladi:

  • task muvaffaqiyatli tugashi va qiymat qaytarishi;
  • exception callerga to‘g‘ri uzatilishi;
  • timeoutdan so‘ng cancellation bajarilishi;
  • bir task xatosi sibling tasklarga qanday ta’sir qilishi;
  • natija kech kelganda yopilgan resursga yozilmasligi.

Async mock va oqimlar

Async dependency uchun oddiy mock yetarli bo‘lmasligi mumkin. Mock chaqirilganda awaitable qaytarishi, async iterator bo‘lsa __aiter__, context manager bo‘lsa __aenter__ va __aexit__ xatti-harakatini taqlid qilishi kerak. Faqat return value tekshirish o‘rniga chaqiruv soni, argumentlar va cancellation signalining uzatilishi ham kuzatiladi.

Streaming kodda barcha elementni bitta ro‘yxatga yig‘ish backpressure xususiyatini yashiradi. Test producer tezligi, consumer talabi, buffer chegarasi va streamning normal yoki xato bilan yopilishini alohida tekshiradi. Cheksiz stream uchun bir necha element olingach subscription bekor qilinadi.

Izolyatsiya va tozalash

Test tugaganda ochiq socket, task, timer yoki executor qolmasligi kerak. Teardown har qanday assertion failure holatida ham bajariladi. Cancellation yuborishning o‘zi yetarli emas; taskning bekor bo‘lib yakunlanishi await qilinadi. Aks holda keyingi testga log, callback yoki shared state sizib o‘tadi.

Har test uchun yangi event loop ishlatish izolyatsiyani kuchaytiradi, ammo loopga bog‘langan global obyektlar qayta yaratilishi kerak. Parallel test bajarilishida port, vaqtinchalik katalog va database nomi kabi resurslar noyob ajratiladi. Shu qoidalar asinxron testni takrorlanuvchi va diagnostika qilinadigan qiladi.

Bog‘liq tushunchalar

Event loop, Coroutine, Promise, Timeout, Cancellation, Mock object, Concurrency testing