1-bo‘lim
Testlash nima va u qayerdan paydo bo'lgan
"«Menda ishlaydi» nima uchun dalil emas, testlashni kim o'ylab topgan, xUnit oilasi qanday tug'ilgan va nima uchun testlar ko'pincha yozilmay qoladi."
Ushbu bo‘lim mundarijasi
Dasturchi kodini yozib bo'ldi, uni bir marta ishga tushirdi, natija to'g'ri chiqdi va u: "ishlayapti" dedi.
Bu jumla aslida nimani bildiradi? Faqat bitta narsani: bitta kirish uchun kod bir marta to'g'ri natija berdi. Boshqa kirishlar haqida u hech narsa demaydi. Ertaga qo'shiladigan o'zgarish haqida ham hech narsa demaydi.
Test - "ishlayapti" degan gapni dalilga aylantiradigan narsa.
Test nima #
Test - bu oddiy kod. Sirli hech narsasi yo'q. U sizning funksiyangizni chaqiradi va natijasi kutilganidek ekanini tekshiradi:
| Qo'lda tekshirish | Test bilan tekshirish |
|---|---|
| Dasturni ochasiz | Bitta buyruq yozasiz |
| Ma'lumot kiritasiz | Ma'lumot kodda yozilgan |
| Ekranga qaraysiz | Kompyuter solishtiradi |
| Bir marta bajarasiz | Har o'zgarishdan keyin qayta ishlaydi |
| Bir necha daqiqa | Bir necha soniya |
| Charchaganda o'tkazib yuborasiz | Hech qachon o'tkazib yubormaydi |
Eng muhim farq - oxirgi qatorda. Qo'lda tekshirish takrorlanmaydi. Test esa yozilgandan keyin har kuni, yillar davomida ishlaydi.
Testlashni kim o'ylab topgan #
Testlash g'oyasi dasturlashning o'zi bilan deyarli bir vaqtda paydo bo'lgan.
Alan Turing (1912-1954)
Birinchi bo'lib savolni bergan odam. 1949-yil 24-iyunda Kembrijdagi EDSAC kompyuterining ochilish konferensiyasida u "Checking a Large Routine" ma'ruzasini o'qidi. Ma'ruza shunday savol bilan boshlangan: dasturning to'g'riligiga qanday ishonch hosil qilish mumkin? Turingning javobi - dasturchi kodning muhim nuqtalarida tasdiqlar (assertion) yozib qoldirishi kerak, keyin ularni tekshirish mumkin bo'ladi. Bugun biz `assert` deb yozadigan so'z aynan shu g'oyadan qolgan.
Yigirma yil o'tib, boshqa bir olim teskari tomondan ogohlantirdi.
1969-yil oktabrda Rimda o'tgan NATO konferensiyasida Edsger Dijkstra mashhur jumlani aytdi: test xatoning borligini ko'rsatadi, yo'qligini emas.
Bu darslikdagi eng muhim jumla. Barcha testlar o'tishi - kodda xato yo'q degani emas. Bu faqat siz tekshirgan hollarda xato yo'q degani.
Shuning uchun keyingi bo'limlarda ko'p vaqtni *qanday qilib ko'proq holni tekshirish* masalasiga ajratamiz: parametrli testlar, xossaviy testlash, chegara qiymatlari.
Glenford Myers (1946-)
Testlashni fanga aylantirgan odam. Amerikalik informatika olimi va tadbirkor. 1979-yilda chiqqan "The Art of Software Testing" kitobi 26 yil davomida qayta nashr etilib turdi. Myers testlashning ta'rifini teskari tomondan berdi: testlash - dasturni xato topish maqsadida ishga tushirish. Demak muvaffaqiyatli test - o'tgan test emas, balki xatoni topgan test.
Myersning bu ta'rifi bugun ham amalda foydali. Agar siz test yozayotganda o'zingizdan "bu qayerda sinishi mumkin?" deb so'rasangiz - siz kuchli test yozasiz. Agar "bu ishlashini qanday ko'rsataman?" deb so'rasangiz - siz foydasiz test yozasiz.
Kent Beck (1961-)
Bugungi test vositalarining otasi. 1989-yilda Smalltalk tili uchun SUnit nomli kichik kutubxona yozdi - u "Simple Smalltalk Testing: With Patterns" maqolasida tasvirlangan. 1997-yilda Erix Gamma bilan birga Syurixdan Atlantadagi OOPSLA konferensiyasiga uchayotganda, samolyotda JUnit ni yozdi. Keyinchalik u Ekstremal dasturlash (XP) va TDD usulini ommalashtirdi - bu haqda 10-bo'limda gaplashamiz.
SUnit - Smalltalk uchun unit testlar kutubxonasi. Undan JUnit
(Java), NUnit (.NET), PyUnit (Python) va o'nlab boshqalari nusxa
olindi. Ularning hammasi bir xil tuzilishga ega bo'lgani uchun oila
xUnit deb ataladi - bu yerdagi x til nomining o'rni.
Python ning standart kutubxonasidagi unittest moduli - o'sha PyUnit.
Rasmiy hujjatda hanuzgacha Kent Beckning maqolasiga havola turibdi.
Biz ishlatadigan pytest esa boshqa yo'ldan kelgan: u 2004-yil atrofida
Holger Krekel yozgan py kutubxonasining bir qismi - py.test - sifatida
tug'ilgan. Ya'ni nomdagi py - kutubxona nomi, test esa uning qismi.
2010-yilda u mustaqil paketga ajratildi.
Nima uchun testlar yozilmay qoladi #
Testning foydasini hamma tan oladi, lekin loyihalarning katta qismida test yo'q. Sabablari odatda quyidagilar - va ularning har biriga javob bor:
| "Sabab" | Aslida nima bo'layapti |
|---|---|
| "Vaqt yo'q" | Qo'lda tekshirishga ketgan vaqt hisobga olinmagan |
| "Kod juda oddiy" | Oddiy kod o'zgarganda buziladi - test o'sha paytda kerak |
| "Keyinroq yozaman" | Keyin kod test yozib bo'lmaydigan shaklda bo'ladi |
| "Test o'zi xato bo'lsa-chi?" | Test va kod bir vaqtda bir xil xato qilishi kam uchraydi |
| "Bizda tester bor" | Tester chiqarishdan oldin topadi, test esa - yozish paytida |
| "Talablar o'zgarib turibdi" | O'zgarish testsiz kodni buzadi, test buni darhol ko'rsatadi |
Oxirgi ikkitasi eng muhim. Test kechroq emas, erta topadi - va xatoni qanchalik erta topsangiz, uni tuzatish shunchalik arzon.
Dasturda xato topildi deylik. Odatiy yo'l: kodni ochasiz, tuzatasiz, qo'lda tekshirasiz.
Yaxshiroq yo'l: avval o'sha xatoni ko'rsatadigan test yozasiz. Test yiqiladi - demak siz xatoni to'g'ri tushundingiz. Keyin kodni tuzatasiz - test o'tadi. Endi shu xato hech qachon qaytib kelmaydi, chunki uni poyloqchi kutib turadi.
Bu usul eng kam kuch talab qiladi va eng ko'p foyda beradi. Loyihangizda testlarni shu yo'l bilan boshlashingiz mumkin.
Darslikda nima quramiz #
Nima bilish kerak #
| Talab | Izoh |
|---|---|
| Python asoslari | Funksiya, sinf, istisno - Python darsligi |
| Buyruq qatori | Papkaga o'tish, buyruq ishga tushirish |
| Git haqida tasavvur | Majburiy emas, 19-bo'limda kerak bo'ladi |
| SQL asoslari | Faqat 11-bo'lim uchun - SQL darsligi |
| Test tajribasi | Shart emas - noldan boshlaymiz |
Testlash qoidalari tilga bog'liq emas: piramida, fixture, dublyor, qoplama - bularning hammasi Java da ham, C# da ham, JavaScript da ham bor. Faqat yozilishi boshqacha.
pytest tanlangani - uning ortiqcha marosimi yo'qligi uchun. JUnit da eng
oddiy test uchun ham sinf yozish kerak; pytest da bitta funksiya va bitta
assert yetadi. Shu sababli e'tibor vositaga emas, fikrga qaratiladi.
Agar siz Java yoki C# da ishlasangiz, Dasturiy ta'minot muhandisligi darsligining 12-bo'limida o'sha tillardagi yozilishi ko'rsatilgan.
- Oxirgi yozgan dasturingizni eslang: uni qanday tekshirgansiz? Qadamlarni yozib chiqing.
- O'sha qadamlar necha daqiqa olganini hisoblang va 100 ga ko'paytiring - bir yildagi vaqt shu.
- Turingning 1949-yildagi savolini o'z so'zingiz bilan yozing.
- Dijkstraning jumlasini yozib qo'ying va nima uchun u muhimligini tushuntiring.
- Myersning "muvaffaqiyatli test" ta'rifini oddiy ta'rifdan nimasi bilan farq qilishini ayting.
- xUnit oilasidan uchta vositani toping va ular qaysi tillar uchun ekanini yozing.
- Yuqoridagi "sabablar" jadvalidan o'zingiz aytgan bittasini tanlang va javobini o'qing.
- Ishlayotgan loyihangizda oxirgi topilgan xatoni eslang: uni qanday test tutib qolardi?
- Shu xatoni ko'rsatadigan testni so'z bilan ta'riflang (kod yozish shart emas).
- Darslik oxirida qaysi loyihangizga test yozmoqchi ekaningizni bir jumlada yozing.
Xulosa #
- "Menda ishlaydi" - dalil emas: u faqat bitta kirish uchun bir martalik natija.
- Test - oddiy kod: u funksiyani chaqiradi va natijani kutilgani bilan solishtiradi.
- Qo'lda tekshirishdan asosiy farqi - test takrorlanadi va hech qachon o'tkazib yuborilmaydi.
- Alan Turing 1949-yilda EDSAC konferensiyasida dasturni tekshirish savolini birinchi bo'lib qo'ydi va tasdiqlar g'oyasini taklif qildi.
- Edsger Dijkstra 1969-yilda ogohlantirdi: test xatoning borligini ko'rsatadi, yo'qligini emas.
- Glenford Myers ning 1979-yildagi "The Art of Software Testing" kitobi sohaning birinchi klassikasi bo'ldi.
- Myers bo'yicha muvaffaqiyatli test - o'tgan test emas, xato topgan test.
- Kent Beck 1989-yilda SUnit ni, 1997-yilda Erix Gamma bilan samolyotda JUnit ni yozdi.
- SUnit dan nusxa olgan vositalar oilasi xUnit deb ataladi; Python dagi
unittest- o'sha oiladan. - pytest boshqa ildizdan - 2004-yildagi
pykutubxonasiningpy.testqismidan o'sib chiqqan. - Testlar yozilmay qolishining sabablari odatda vaqt emas, odat bilan bog'liq.
- Test yozishni boshlashning eng arzon yo'li - har bir nosozlikdan oldin uni ko'rsatadigan test yozish.
Keyingi bo'limda muhitni sozlaymiz va birinchi testni ishga tushiramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.