Django da tezkor test uslubi

Django da tezkor test uslubi

Django da tezkor test uslubi

Kod qaysi dasturlash tilida yozilmasin, u albatta test qilinishi kerak. Ayniqsa, Django freymvorkda har bir ficha (feature) uchun test yozish va uni doimo tekshirib borish kerak. Django veb-freymvorkda ishlaydiganlar har bir yozilgan test to’liq tamomlanishi oz vaqtni olmasligini yaxshi bilishadi. Agar loyihaning bazasida modellar uchun muntazam ravishda migratsiya (migration) qo’llanilsa, testlarning vaqt olishi ham shuncha sekinlashadi. Buning sababi django.test.TestCase dan foydalanib yozgan test uchun yaratilgan baza har bir testdan keyin o’chirib yuborilishidir. Agar test uchun bazani tezkor-xotirada (in-memory) saqlaydigan qilinmasa, diskka yoziladigan operatsiyalar ko’pligidan test davomiyligi juda uzoq vaqt oladi.

PostgreSQL ma’lumotlar bazasi Django da yaratiladigan loyihalar ichida eng mashhur ma’lumotlar bazasi hisoblangani bilan, uning har bir yozuvlarni (records) doim diskka yozishligi sabab SQLite ning tezkor-xotirada (in-memory) ishlashidagi tezlikni(!) bera olmaydi.

Demak, loyihaning asosiy qismi uchun PostgreSQL, test qismi uchun esa SQLite ishlatish qulayroq deb o’ylab ko’rishimiz ham mumkin. Lekin aynan yuqoridagi kabi xato o’ylash tufayli quyidagi jiddiy muammolar yuzaga keladi.

  1. Aynan PostgreSQL uchun yozilgan modellar SQLite orqali moslamalar (fixtures) yuklaganda tashqi-kalit (foreign-key) yaxlitligini (integrity) saqlay olmaydi.
  2. Albatta buning uchun boshqa baza ishlatsa ham bo’ladi. Masalan, MySQL ning tezkor-xotirada ishlaydigan bekendi bor, lekin unda tashqi kalitlarni (foreign-keys) saqlash, matn (text) / katta ob’ektli (blob) ustunlar (column) yaratish va tranzaktsiyalarni amalga oshirish mumkin emas.

Demak, Django da test uchun ketadigan vaqtni qisqartirishning eng samarali usuli bu — tezkor xotirada virtual disk (RAM drive) yaratib, uni PostgreSQL da aynan test baza uchun ishlatiladigan qilib sozlash.

Tezkor xotirada virtual disk yaratish

Demak, bizning loyihadagi testlar uchun 512MB «joy» etarli bo’ladi. OSX El Capitan operatsion tizimida 512MB lik tezkor xotiradan disk yaratamiz.

Virtual disk /Volumes/ramdrive direktoriyasiga ulandi

Virtual disk /Volumes/ramdrive direktoriyasiga ulandi

Benchmark

Virtual disk qanchalik tez ishlashini tekshirib ko’rish uchun uni SSD disk bilan taqqoslaymiz.

Dastlab kompyuterning o’zidagi SSD diskni benchmark qilib ko’ramiz. Buning uchun 128MB lik faylni qancha vaqtda yozishini tekshiramiz.django da tezkor test uslubi 65e61a71301b1

SSD diskka 128MB lik fayl yozish uchun 0.22 sekund vaqt sarflandi

Endi xuddi shu testni virtual diskda tekshirib ko’ramiz.

django da tezkor test uslubi 65e61a71b4902

Virtual diskka 128MB lik fayl yozish uchun 0.09 sekund vaqt sarflandi

Demak virtual disk SSD diskka nisbatan 2.5 marta tez ishlayapti. Bu yomon ko’rsatkich emas, ayniqsa katta loyihalarda 20 daqiqa sarflanadigan testlar uchun (2.5 marta tezlik hisobiga) 8 daqiqa sarflash eng yaxshi ko’rsatkich.

Bazani sozlash

Endi virtual diskni PostgreSQL bazasi uchun sozlaymiz. Buning uchun alohida bloguser yuzer yaratib unga blog bazasini biriktiramiz. Jadvallar uchun ramdisk deb nomlangan joyni ko’rsatamiz.

django da tezkor test uslubi 65e61a724923d

PostgreSQL bazasini sozlash

django da tezkor test uslubi 65e61a72d5ab8

Virtual diskni PostgreSQL bazasi ishlatayotganini tekshirib ko’rish

Loyihani sozlash

Biroz oldin aytganimdek, testlarni tekshirib ko’rish uchun Django freymvorkda oddiygina blog deb nomlangan loyiha yaratamiz. Loyiha uchun Python dasturlash tilining 3.5 versiyasiga moslab alohida maxsus virtual muhit (environment) yaratamiz.

django da tezkor test uslubi 65e61a7362698

Loyiha uchun alohida muhit yaratish

Kerakli modullarni pip orqali o’rnatamiz.

django da tezkor test uslubi 65e61a7428fc9

Django va psycopg2 modullarini o’rnatish

Modullar o’rnatilgandan so’ng django-admin buyrug’i yordamida loyihani va uning asosiy qism shablonini yaratib olamiz.

django da tezkor test uslubi 65e61a74be88f

Yangi loyiha yaratish

Loyiha sozlamasidan PostgreSQL bazasiga kerakli parametrlarni ko’rsatamiz va test buyrug’i uchun bazadan kerakli jadvalni ishlatish kerakligini ko’rsatamiz.

django da tezkor test uslubi 65e61a758123f

Loyihaning sozlama fayli settings.py

Asosiy qism deb nomlagan core appni loyihaga biriktiramiz.

Аппни лойиҳага бириктириш

Appni loyihaga biriktirish.

Dastlabki migratsiyani ishga tushiramiz.

django da tezkor test uslubi 65e61a7729e8b

Asosiy modellarni yozamiz.

django da tezkor test uslubi 65e61a77f0889

Modellar uchun migratsiya yaratamiz va ularni ishga tushiramiz.

django da tezkor test uslubi 65e61a78cbe3b

Model jadvallari bazaga tushganligini tekshirib ko’ramiz.

django da tezkor test uslubi 65e61a7974808

Test qilish

Loyiha uchun yozgan modellarimizni test qilamiz. Buning uchun biz model_mommy modulidan foydalanamiz.

django da tezkor test uslubi 65e61a7a3bbce

Har bir model uchun test yozamiz.

django da tezkor test uslubi 65e61a7aeb28c

Yozgan testimizni amalda tekshirib ko’ramiz va uning qancha vaqtda tugashiga e’tibor beramiz.

django da tezkor test uslubi 65e61a7ba5d89

Natija

Ko’rib turganimizdek testlarimiz SSD diskdagi testlarga qaraganda tez bajarilyapti.

Xulosa qilib aytganda, men bu blogpostda yozgan usul faqat va faqat katta loyihalar uchun qo’l keladi. Har bir bo’lim (unit) uchun yangi ficha (feature) yozib uni test qilganda, loyihadagi hamma kod tartib bilan test qilinishi kerak bo’ladi. Ba’zan dasturchilar test tugashini kutib tura olmay vaqtincha migratsiyani o’chirib uning o’rniga oldindan tayyorlangan moslamalar (fixtures) ni ishlatishni afzal ko’rishadi. Lekin, katta loyihalarda har bir modeldagi migratsiya yangi yoziladigan ficha yoki funktsiyaning to’liq ishlashini kafolatlaydi. Testlar esa puxta, har bir bo’lim/funktsiya/ko’rinish/modellarning hamma qismlari uchun yozilishi kerak deb o’ylayman.

Keyingi blogpostlarimda serversiz Telegram bot yaratish yoki kelayotgan vikend uchun birorta texnik muammoga topgan echimlarimni birini yoritmoqchiman. Juma ayyomi muborak!

Manba:

Umumiy Dasturlash
Django da tezkor test uslubi