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.
- Aynan PostgreSQL uchun yozilgan modellar SQLite orqali moslamalar (fixtures) yuklaganda tashqi-kalit (foreign-key) yaxlitligini (integrity) saqlay olmaydi.
- 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
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.
SSD diskka 128MB lik fayl yozish uchun 0.22 sekund vaqt sarflandi
Endi xuddi shu testni virtual diskda tekshirib ko’ramiz.
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.
PostgreSQL bazasini sozlash
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.
Loyiha uchun alohida muhit yaratish
Kerakli modullarni pip orqali o’rnatamiz.
Django va psycopg2 modullarini o’rnatish
Modullar o’rnatilgandan so’ng django-admin buyrug’i yordamida loyihani va uning asosiy qism shablonini yaratib olamiz.
Yangi loyiha yaratish
Loyiha sozlamasidan PostgreSQL bazasiga kerakli parametrlarni ko’rsatamiz va test buyrug’i uchun bazadan kerakli jadvalni ishlatish kerakligini ko’rsatamiz.
Loyihaning sozlama fayli settings.py
Asosiy qism deb nomlagan core appni loyihaga biriktiramiz.
Appni loyihaga biriktirish.
Dastlabki migratsiyani ishga tushiramiz.
Asosiy modellarni yozamiz.
Modellar uchun migratsiya yaratamiz va ularni ishga tushiramiz.
Model jadvallari bazaga tushganligini tekshirib ko’ramiz.
Test qilish
Loyiha uchun yozgan modellarimizni test qilamiz. Buning uchun biz model_mommy modulidan foydalanamiz.
Har bir model uchun test yozamiz.
Yozgan testimizni amalda tekshirib ko’ramiz va uning qancha vaqtda tugashiga e’tibor beramiz.
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