Nega Test Driven Development (TDD) - bu kuchli kodlashning eng yaxshi usuli.

Birinchidan, birlik sinovlarini yozing, so'ng kodni yozing.

Rasmli kreditlar: Pexels.com

Bir necha yil oldin, "Test Driven Development" haqida eshitganimda, men unga shubha bilan qarardim.

"Birinchidan, test yozing, keyin kodni yozing" degan g'oya men uchun g'oyat xursand edi.

Nega bunday bo'lmaydi? Avval birlik sinovlarini yozing? Kim shunday yaramas ishni qilar ekan?

Ammo men 10 yil davomida professional dasturchi bo'lib ishladim va bu sohada nima sodir bo'lishini ko'rardim. Men biron bir narsadan voz kechishdan yaxshiroq narsani bilardim, ayniqsa ishlab chiquvchilar bu haqda juda ko'p gapirishganida.

Shunday qilib, menga asosiy namunani ko'rsatadigan do'stim bilan maslahatlashdim.

Ushbu asosiy misolda SUM usuli bilan LCL_SUM sinfi mavjud. Ushbu usulning vazifasi raqamlarni qo'shishdir. U raqamni import parametr sifatida oladi va natijani olish uchun uni o'ziga qo'shadi. Keling, ushbu usulni ishlab chiqarish usuli deb ataymiz.

Sinf uchun kod quyidagicha edi:

CLASS lcl_sum MA'LUMOT.
JAMOAT BO'LIMI.
USULLAR: YO'Q IMPORTING iv_1 TYPE i
Qaytariladigan qiymat (rv_sum) TYPE i.
ENDCLASS. "Lcl_sum TA'RIF
*
TANLASHNI BOSHLASH.
* Bu erda hali hech narsa yo'q
*
*
CLASS lcl_sum IMPLEMENTATION.
METOD SUM.
rv_sum = iv_1 * iv_1. "Qasddan xato qilish (men qo'shish o'rniga ko'paytiraman)
ENDMETHOD. “Summa
ENDCLASS. "Lcl_sum IMPLEMENTATION.

Sinov sinfini sozlash

Endi sinov sinfi sifatida ishlaydigan sinf yarating. SAP-da siz sinfni belgilashda TESTING kalit so'zini qo'shishingiz kerak edi. Ushbu qo'shimcha ushbu sinfni ishlab chiqarish kodidan ajratib turadi.

CLASS lcl_test sinov uchun aniqlash
JAMOAT BO'LIMI.
USULLAR: sinash uchun m_sum.
ENDCLASS. "Lcl_test DEFINITION
*
KLASS lcl_test Bajarish.
METOD m_sum.
ENDMETHOD. "M_sum
ENDCLASS. "Lcl_test amalga oshirish

Sinov usulini amalga oshirish

Ushbu sinov usulida nima qilish kerak - ishlab chiqarish kodini sinab ko'ring. Shunday qilib, SUM usulining LCL_SUM usulini sinab ko'rish uchun siz LCL_SUM-ga ob'ektga murojaatni yuborishingiz kerak, SUM usulini chaqirishingiz mumkin.

Dummy qiymatiga asoslanib, usul sizga natijani yuboradi - usuldan haqiqiy natija. Dummy qiymatiga asoslanib, kutilgan qiymat nimaga olib kelishini bilasiz. Masalan Agar siz 3 raqamini SUM usuliga o'tkazsangiz, u 3 ga qo'shilgan holda 6 ta natijani beradi.

Sinov ostidagi ishlab chiqarish kodi yoki usulidan haqiqiy natijani olganingizdan so'ng, natijalarni taqqoslashingiz kerak. Agar kutilgan haqiqiy vs mos kelmasa, tizim sizga kutilgan haqiqiy vs kutilmagan narsa noto'g'ri ekanligini bildirishi va tegishli xabarni ko'rsatishi kerak.

CLASS lcl_test IMPLEMENTATION.
METOD m_sum.
DATA: l_cl_sum uchun TYPE REF TO.
DATA: lv_result TYPE i.
*
OBJECT ob'ekti yaratish.
lv_result = o_cut-> yig'indisi (3).
*
cl_aunit_assert => tasdiqlash_ tengliklar (
EXP = 6
akt = lv_result
msg = 'Chiqarishda xatolik yuz berdi'
).
ENDMETHOD. "M_sum
ENDCLASS. "Lcl_test amalga oshirish

Sinov natijalari

Bu menga aytmoqdaki, ishlab chiqarish usulida biron bir noto'g'ri narsa bor.

Ha, agar siz SUM dasturini amalga oshirish usuliga diqqat bilan qarasangiz, menda yozish usuli mavjud - ko'paytirishni ishlatganman. Shunday qilib, men uni tuzatardim va uni muvaffaqiyatli bajarish uchun sinovni qayta ishga tushirdim.

Meni TDDga bog'lashdi. Flabbergasted bu to'g'ri so'z.

Ajablanarlisi shundaki, ishlab chiqish va sinovning juda qisqartirilgan tsikl vaqti edi.

Men uni yozishga yoki ishga tushirishga urinishdan oldin bir soatdan ko'proq vaqt davomida kod yozishga odatlangan edim. Ammo bu erda kod har 2 daqiqada yoki shunga o'xshash tarzda bajarila boshlandi va sinovdan o'tkazildi.

Shunday qilib, qisqacha aytganda, TDD qisqa rivojlanish tsikllari orqali amalga oshiriladi, "avval birlik birlik testlarini yozing, keyin kodni yozing, keyin refaktor, keyin takrorlang". Birlik testlari bu funktsiyalar kutilganidek ishlashini tekshiradigan avtomatlashtirilgan testlardir. Sizning eng birinchi birlik sinovingiz muvaffaqiyatsiz tugashi kerak, chunki u kod kod bazasiga ega bo'lishingizdan oldin yozilgan.

Siz sinov ishi kodiga biroz qo'shasiz. Siz ishlab chiqarish kodiga biroz qo'shasiz. Ikki kod oqimi bir vaqtning o'zida bir-birini to'ldiruvchi qismlarga o'sadi. Sinovlar ishlab chiqarish kodiga mos keladi, chunki antijism antijismga to'g'ri keladi.

Ushbu chora ishlab chiquvchilarga ushbu testga to'g'ri kelmaydigan keraksiz kodni yozishni oldini oladi.

Va butun birlashtirilgan yondoshish ishlab chiqaruvchiga katta foyda keltiradi.

Siz yomon kodni biron bir narsani buzmasdan tuzatasiz.

Yomon kodni ko'rganingizda, ko'zingizni yumasiz, Xudoga ibodat qilasiz va ikkita gapdan birini aytasiz.

· “Bu tartibsizlik. O'ylaymanki, uni qandaydir tuzatishim kerak ”.

· "Men unga tegmayapman."

Ikkala holatda ham qo'rquvning bir qismi mavjud. Aslida, noaniqlik.

Agar kodim mavjud funktsiyani buzsa nima bo'ladi?

TDD sizga ushbu noaniqlikni engishga yordam beradi.

Shuni ta'kidlash kerakki, TDD muhitida ishlab chiquvchilar kod yozilgandan keyin xatolarni bartaraf qilishning o'rniga, xatolarni oldini olish uchun ishlaydigan testlarga e'tibor berishadi. Bu TDDning eng kuchli afzalliklaridan biridir. Agar siz ishonadigan testlar to'plamiga ega bo'lsangiz, unda o'zgarishlar qilishdan qo'rqasiz. Yomon kodni ko'rganingizda, uni joyida tozalaysiz.

Sizning kodingiz qanchalik tiniq bo'lsa, yangi xususiyatlarni qo'shish yoki mavjud kod bazasini o'zgartirish uchun shuncha kam harakat qilish kerak.

TDD hujjatlarni rasmiylashtiradi.

Dik Brandon kuzatganida uni tirnoq ustiga urdi.

“Hujjatlar jinsiy aloqaga o'xshaydi; agar juda yaxshi bo'lsa, u juda yaxshi, va yomon bo'lganda, undan hech qanday yaxshisi yo'q. "

Hujjatlar dasturlashning kastor yog'i. Menejerlar bu dasturchilar uchun yaxshi va dasturchilar buni yomon ko'rishadi deb o'ylashadi!

Ko'lamning kengayishining asosiy sabablaridan biri aniq belgilangan talablarga ega hujjatlar yo'qligi. Ushbu muammoni test yordamida rivojlantirish mumkin.

TDD muhitida ishlab chiquvchilar kodning alohida segmentlarini sinab ko'rish uchun birlik testlarini yozadilar. Birlik testlari bajarilishi kerak bo'lgan aniq xususiyatlarni tavsiflovchi spetsifikatsiyalar sifatida xizmat qiladi. Shuning uchun, yaxshi belgilangan testlar ishlab chiquvchilarga ortiqcha kod yozishni oldini oladi.

Va bu birlik sinovlari hujjatlardir. Ular tizimning eng past darajadagi dizaynini tavsiflaydi. Ular aniq, aniq, tinglovchilar tushunadigan tilda yozilgan va shu qadar rasmiyki, ular ijro etadilar. Ular mavjud bo'lishi mumkin bo'lgan past darajadagi hujjatlarning eng yaxshi turi.

TDD yaxshiroq dizaynda yordam beradi

TDD-ning asosiy sharti shundaki, kodni yozishdan oldin siz o'zingizning test sinovlarini yozishingiz kerak.

Sinov kodi bilan bog'liq muammo shundaki, siz ushbu kodni izolyatsiya qilishingiz kerak. Agar funktsiya boshqa funktsiyalarni chaqirsa, funktsiyani sinab ko'rish ko'pincha qiyin. Ushbu testni yozish uchun siz funktsiyani qolgan barcha qismlardan ajratishning biron bir usulini topishingiz kerak. Boshqacha qilib aytganda, sinash zarurati sizni birinchi navbatda yaxshi dizayn haqida o'ylashga majbur qiladi.

Bu yanada yaxshi, dekou-dizaynni yaratadi, unda kod ishlab chiqilishi bilan siz narsalarni yaxshiroq nazorat qila olasiz.

Sinov varaqalarini yozish paytida dastlabki vaqt sarflanishi mumkin, ammo bu ko'p foyda keltiradi. Ishlab chiquvchilar avval kod satrlarini yozish uchun foydalanganliklarini, echimlarining ahamiyati yo'qligini anglab, keyin noldan kodlashni boshlaganliklarini tan olishadi.

Eskirgan kodlash amaliyotidan farqli o'laroq, TDD ishlab chiquvchilarga chizilgan taxtaga qaytib, engil, moslashuvchan arxitektura dizaynini ishlab chiqarishga e'tibor qaratish imkonini beradi.

Sinov voqealarini oldindan yozib qo'yishning haqiqati keyinchalik paydo bo'lishi mumkin bo'lgan har qanday xatolarni oldini oladi, shu bilan vaqtni, kuchni va og'riqni tejaydi.

Va nihoyat TDD kodlashning eng yaxshi amaliyotiga amal qiladi.

TDD DRY, KISS, YAGNI va SOLID kabi kodlashning yaxshi printsiplarini qo'llab-quvvatlaydi.

DRY (O'zingizni takrorlamang) tamoyili ishlab chiquvchilarga bir xil kodni bir xil tizimning turli qismlarida takrorlamaslik kerakligini anglatadi, shuning uchun uni ba'zan DIE printsipi deb ham atashadi (Duplication Is Evil). DRY ishlab chiquvchilarga tizim funktsiyalarini kapsülleme va izchil kodlar bazasini saqlash uchun ishlab chiquvchilarga sinflar va funktsiyalardan foydalanishni tavsiya qiladi.

KISS (sodda qilib saqlang, ahmoq!) Printsipi ishlab chiquvchilarga g'ildirakni ixtiro qilishni emas, balki oddiy va ravshan arxitekturani qurishni maslahat beradi. KISSning mohiyati ortiqcha ishlangan echimlardan qochishdir.

YAGNI (Sizga kerak bo'lmaydi) tamoyili oltin qoplamaga qarshi kurashadi. Oltin bilan qoplash zararsiz bo'lib tuyulishi mumkin, ayniqsa ishlab chiqaruvchi xaridorni xursand qilish uchun mavjud funktsional imkoniyatlarni oshirishga tayyor bo'lsa. Biroq, bu qo'shimcha rivojlanish vaqtiga olib keladi, bu esa loyihaning kechikishiga yoki mijozning noroziligiga sabab bo'lishi mumkin. YAGNI buni aniq aytadi: ishlab chiqaruvchi faqat tayinlangan vazifalarni bajarishi kerak va ortiqcha funktsiyani qo'shmaslik kerak.

SOLID bitta tamoyildan iborat: bitta javobgarlik, ochiq-yopiq, Liskovni almashtirish, interfeysni ajratish va qaramlikni inversiya. Qisqacha aytganda, SOLID ushbu printsiplarga amal qilish ilovalarni saqlash va sinovdan o'tkazishni osonlashtirishini ta'kidlaydi.

Xulosa qilib aytganda, TDD sodda va sodda kodni yaratishda yordam beradi, uni saqlash oson.

Robert Martin aniq aytganidek.

"Toza kod har doim kimgadir yozganga o'xshaydi."

Adabiyotlar

Ekstremal dasturlash: Kent Bek.

Agile Software Development: Robert Martin

Qayta ishlab chiqarish: Martin Fouller

Muallif haqida-:

Ravi Rajan - Hindistonning Mumbay shahrida joylashgan IT texnologiyalari bo'yicha global menejer. U shuningdek g'ayratli blogger, Xayku she'r yozuvchisi, arxeologiya ixlosmandlari va tarix maniakidir. Ravi bilan LinkedIn, Medium va Twitter-da ulaning.

Ushbu hikoya The Startup-da, Tadbirkorlikning O'rta Osiyodagi eng yirik nashrida chop etilgan, undan keyin +438,678 kishi.

Bizning eng yaxshi voqealarni olish uchun obuna bo'ling.