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."

🕑 8 daqiqa o‘qish 📄 1 217 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Test nima
  2. Testlashni kim o'ylab topgan
  3. Nima uchun testlar yozilmay qoladi
  4. Darslikda nima quramiz
  5. Nima bilish kerak
  6. Xulosa

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 tekshirishTest bilan tekshirish
Dasturni ochasizBitta buyruq yozasiz
Ma'lumot kiritasizMa'lumot kodda yozilgan
Ekranga qaraysizKompyuter solishtiradi
Bir marta bajarasizHar o'zgarishdan keyin qayta ishlaydi
Bir necha daqiqaBir necha soniya
Charchaganda o'tkazib yuborasizHech 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.

Dijkstra ogohlantirishi

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.

Nomlar qayerdan kelgan

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.

Testlash tarixidagi asosiy nuqtalar 1949 Turing tasdiqlar 1969 Dijkstra ogohlantirish 1979 Myers birinchi kitob 1989 SUnit Smalltalk 1997 JUnit Java 2001 unittest Python 2.1 2004 py.test py kutubxonasi 2010 pytest 2.0 mustaqil Bu darslikda pytest ishlatiladi - bugun Python dunyosidagi eng keng tarqalgan vosita Lekin qoidalarning deyarli hammasi JUnit, NUnit va boshqalarga ham tegishli
Yetmish yil ichida g'oya bir xil qoldi: kod o'zini o'zi tekshirsin

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.

Test yozishning eng foydali payti - nosozlikni tuzatishdan oldin

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 #

Yigirma bo'limdagi yo'l Asoslar 1-6 bo'lim Vositalar 7-10 bo'lim Katta testlar 11-14 bo'lim Amalda 15-20 bo'lim Har bo'limdagi kod haqiqatda ishga tushirilgan Chiqishlar Python 3.13 va pytest 9 dan olingan - vaqt ko'rsatkichlari sizda boshqacha bo'ladi
Birinchi assert'dan to'liq test to'plamigacha

Nima bilish kerak #

TalabIzoh
Python asoslariFunksiya, sinf, istisno - Python darsligi
Buyruq qatoriPapkaga o'tish, buyruq ishga tushirish
Git haqida tasavvurMajburiy emas, 19-bo'limda kerak bo'ladi
SQL asoslariFaqat 11-bo'lim uchun - SQL darsligi
Test tajribasiShart emas - noldan boshlaymiz
Nega aynan Python va pytest

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.

Amaliy topshiriq
  1. Oxirgi yozgan dasturingizni eslang: uni qanday tekshirgansiz? Qadamlarni yozib chiqing.
  2. O'sha qadamlar necha daqiqa olganini hisoblang va 100 ga ko'paytiring - bir yildagi vaqt shu.
  3. Turingning 1949-yildagi savolini o'z so'zingiz bilan yozing.
  4. Dijkstraning jumlasini yozib qo'ying va nima uchun u muhimligini tushuntiring.
  5. Myersning "muvaffaqiyatli test" ta'rifini oddiy ta'rifdan nimasi bilan farq qilishini ayting.
  6. xUnit oilasidan uchta vositani toping va ular qaysi tillar uchun ekanini yozing.
  7. Yuqoridagi "sabablar" jadvalidan o'zingiz aytgan bittasini tanlang va javobini o'qing.
  8. Ishlayotgan loyihangizda oxirgi topilgan xatoni eslang: uni qanday test tutib qolardi?
  9. Shu xatoni ko'rsatadigan testni so'z bilan ta'riflang (kod yozish shart emas).
  10. 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 py kutubxonasining py.test qismidan 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.

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.