Node.js va JavaScript Testing Eng yaxshi amaliyotlar (2019)

Muhim eslatma: Ushbu maqola qo'shimcha 15 ta eng yaxshi amaliyotlar va jamoatchilik muhokamalari bilan GitHub-ning ombori bo'ldi

Qisqa kirish

Men mustaqil Node.js maslahatchisi sifatida shug'ullanaman va har yili 10+ loyihalarni ko'rib chiqaman va mening mijozlarim asosli ravishda testga e'tibor berishni so'rashadi. Bir necha oy oldin, men bu erda maydonda kuzatgan xatolarim va takrorlangan xatolarimni hujjatlashtira boshladim va birdan u eng yaxshi 30 tajribaga aylandi.

Quyidagi g'oyalar testlarning to'g'ri turlarini tanlash, ularni to'g'ri kodlash, ularning samaradorligini o'lchash va CI / CD quvurlariga to'g'ri joylashtirish kabi mavzularni qamrab oladi. Ba'zi misollar Jest, boshqalari Mocha yordamida tasvirlangan - bu maqola vositalar haqida kamroq va to'g'ri yondashuv va texnikalar haqida.

Mening ismim Yoni Goldberg, Node.JS mustaqil maslahatchisi va Node.jsning eng yaxshi amaliyotlarining hammuallifidir. Men AQSh, Evropa va Isroilda Node.js dasturlarini parvarish qilish bo'yicha mijozlar bilan ishlayman. Mening xizmatim qatorida testlarni rejalashtirish, testlarni ko'rib chiqish va CI / CD-ni sozlash mavjud. Tvitterda meni kuzatib boring ️

Bruno Scheufler tomonidan ko'rib chiqilgan va takomillashtirilgan

️ 0. Oltin qoida: Testlar o'lik bo'lib qolishi kerak - kun kabi aniq va ravshan

Siz ushbu tabassumdosh do'stingiz, oila a'zolaringiz bilan tanishmisiz yoki ehtimol yaxshi ishlaydigan qo'llarini ayamay ishlaydigan kino qahramoni bilan tanishmisiz, 24/7 unga kerak bo'lganda yordam berganda sizga ijobiy energiya bilan yordam berib, o'zi uchun unchalik ko'p bo'lmagan narsani taklif qiladi? Sinov kodi qanday yaratilishi kerak - oson, qimmatli va qiziqarli. Bunga iqtisodiy jihatdan samarali va katta daromad keltiradigan gilos terish usullari, vositalari va sinov maqsadlarini tanlash orqali erishish mumkin. Faqat kerak bo'lganda sinab ko'ring, uni chiniqtirishga harakat qiling, ba'zida egiluvchanlik va soddaligi uchun ba'zi sinovlarni va savdo ishonchliligini pasaytirishga to'g'ri keladi.

Sinovga an'anaviy dastur kodi sifatida qaralmaslik kerak - odatiy jamoaga asosiy dasturni baribir saqlab qolish qiyinlashadi (biz kod va sotadigan xususiyatlar), u qo'shimcha "loyiha" ga toqat qila olmaydi. Agar sinov qo'shimcha og'riq manbai bo'lib o'ssa - u tashlanadi yoki rivojlanishni sekinlashtiradi.

Shu ma'noda, sinov kodi sodda bo'lib qolishi kerak, minimal bog'liqliklar, mavhumliklar va bilvosita darajalari. Sinovga qarash va darhol maqsadni olish kerak. Quyidagi tavsiyalarning aksariyati ushbu printsipning hosilalari

*** qism: Sinov anatomiyasi ***

️ 1. Har bir test nomiga 3 qism qo'shing

Bajaring: Sinov hisobotida amaldagi ilovaning qayta ko'rib chiqilishi kod bilan mutlaqo tanish bo'lmagan odamlar uchun talablarga javob beradimi yoki yo'qligini aniqlab berishi kerak: sinovchi, DevOps muhandisi va kelajakda siz ikki yildan beri. Agar testlar talab darajasida va uchta qismdan iborat bo'lsa, bunga eng yaxshi natijaga erishish mumkin.

(1) Sinov nimada? Masalan, ProductsService.addNewProduct usuli

(2) Qanday vaziyatda va stsenariyda? Masalan, usulga hech qanday narx o'tkazilmaydi

(3) Kutilayotgan natija qanday? Masalan, yangi mahsulot tasdiqlanmagan

Aks holda: "Joylashtirish" deb nomlangan sinov muvaffaqiyatsiz tugadi. Bu sizga noto'g'ri ishlash nimani anglatishini aytadimi?

Buni to'g'ri bajarish: 3 qismdan iborat test nomi

️☺ Buni to'g'ri bajarish: sinov bayonnomasi talablar hujjatiga o'xshaydi

Har bir sinov holatida 3 qismni qo'shing, mahsulot tilida gapiring

️ 2. Mahsulot tilida taxminlarni tavsiflang: BDD uslubidagi tasdiqlardan foydalaning

Bajaring: Sinovlaringizni deklarativ uslubda kodlash o'quvchiga hatto bitta miya-protsessor tsiklini sarf qilmasdan zudlik bilan qo'lga kiritishga imkon beradi. Shartli mantiq bilan to'ldirilgan imperativ kodni yozganingizda, o'quvchi g'ayratli ruhiy kayfiyatga tashlanadi. Shu ma'noda, taxminlarni insonga o'xshash tilda, BDD deklarativ tarzida kuting yoki kerak bo'lmasdan foydalaning va maxsus koddan foydalanmang. Agar Chai & Jest kerakli tasdiqni o'z ichiga olmasa va u juda takrorlanadigan bo'lsa, Jest matcherini (Jest) uzaytirish yoki maxsus Chai plaginini yozishni o'ylab ko'ring.

Aks holda: Jamoa kamroq test yozadi va zerikarli bo'lganlarni .skip () bilan bezatadi.

Pat Patternga qarshi misol: o'quvchi test hikoyasini olish uchun shunchaki qisqa va imperativ koddan o'tishi kerak

Buni to'g'ri bajarish: Quyidagi deklarativ testdan o'tish - shabada

️ 3. Sinovga bag'ishlangan plaginlar bilan lenta

Do: ESLint plaginlari maxsus sinov kodlari namunalarini tekshirish va muammolarni aniqlash uchun maxsus yaratilgan. Masalan, eslint-plagin-mocha test global miqyosda yozilganida (ta'rif () so'zining o'g'li emas) yoki testlar o'tkazib yuborilganida barcha testlar o'tayotganligi haqidagi yolg'on ishonchga olib kelishi mumkinligi haqida ogohlantiradi. Xuddi shunday, eslint-plagin-jest, masalan, test umuman tasdiqlanmaganligi haqida ogohlantirishi mumkin (hech narsani tekshirib ko'rmaslik)

Aks holda: 90% kod qamrovini va 100% yashil sinovlarni ko'rsangiz, ko'pgina sinovlar hech narsaga tayyor emasligini va ko'plab sinov to'plamlarini o'tkazib yuborilganini anglamaguningizcha yuzingizni katta tabassumga aylantirasiz. Umid qilamanki, siz ushbu noto'g'ri kuzatuv asosida hech narsa qo'ymadingiz

Patternga qarshi misol: Sinov xatosi bilan to'lgan, xayriyatki, barchasi Linters tomonidan ko'rib chiqilgan

️ 4. Qora quti sinovlaridan o'ting: Faqat ommaviy usullarni sinab ko'ring

Bajaring: Ichki a'zolarni sinash deyarli katta xarajatlarni keltirib chiqaradi. Agar sizning kodingiz / APIingiz to'g'ri natijalarni taqdim etsa, haqiqatan ham keyingi 3 soatni sinov ichida sarflashingiz kerakmi? Har doim jamoat harakati tekshirilganda, xususiy amalga oshirish ham aniq sinovdan o'tkaziladi va sizning testlaringiz muayyan muammo (masalan, noto'g'ri natija) mavjud bo'lganda buziladi. Ushbu yondashuv shuningdek, xulq-atvor testi deb ham ataladi. Boshqa tomondan, siz ichki qismni sinab ko'rishingiz kerak (oq qutiga yondashish) - diqqat markazning tarkibiy qism natijasini rejalashtirishdan shaffof tafsilotlarga o'tadi va mayda kodni qayta ishlaydigan reaktorlar tufayli sizning testingiz buzilishi mumkin, ammo natijalar juda yaxshi - bu texnik xizmatni sezilarli darajada oshiradi. yuk

Aks holda: Sizning testingiz bo'rini qichqirayotgan bolaga o'xshaydi: baland ovozda ijobiy-ijobiy ovozlarni chiqaring (masalan, shaxsiy o'zgaruvchining nomi o'zgartirilganligi sababli test muvaffaqiyatsiz tugadi). Ajablanarlisi shundaki, odamlar tez orada CI bildirishnomalarini e'tiborsiz qoldira boshlaydilar, ammo biron bir kun haqiqiy xato e'tiborga olinmaydi ...

Patternga qarshi misol: Sinov sumkasi hech qanday sababsiz internirlanganlarni sinab ko'rmoqda

️️5. To'g'ri test sinovlarini tanlang: Stublar va josuslarning foydasiga masxara qilishdan saqlaning

Bajaring: Test dubllari zaruriy yomonlikdir, chunki ular ichki qismga biriktirilgan, ammo ba'zilari juda katta ahamiyatga ega (Bu erda test juftliklari haqida eslatmani o'qing: mocks vs stub vs spies). Biroq, turli xil texnikalar bir xilda tug'ilmadi: ularning ba'zilari, ayg'oqchilar va stublar, talablarni sinashga qaratilgan, ammo muqarrar yon ta'sir sifatida ular ichkariga ozgina tegib ketishadi. Aksincha, zarbalar ichki kiyimlarni sinashga qaratilgan - bu "Qora quti sinovidan o'ting" o'qiyotganida tushuntirilganidek juda katta xarajatlarni keltirib chiqaradi.

Sinov juftligini ishlatishdan oldin, juda oddiy savol bering: Men uni talablar hujjatida paydo bo'lgan yoki paydo bo'lishi mumkin bo'lgan funktsionallikni sinash uchun ishlatamanmi? Agar yo'q bo'lsa, bu oq qutining hidi.

Masalan, agar to'lov xizmati ishlamay qolganda sizning ilovangiz qanday ishlashini sinashni istasangiz, to'lov xizmatini to'xtatib qo'yishingiz va tekshirilayotgan birlik to'g'ri qiymatni qaytarishini ta'minlash uchun "No Response" qaytishini boshlashingiz mumkin. Bu bizning ma'lum bir stsenariy bo'yicha bizning xatti-harakatlarimiz / javoblarimiz / natijalarimizni tekshiradi. Siz xizmatni o'chirib qo'yganingizda elektron pochta xabarlari yuborilganligini ta'kidlash uchun josuslardan foydalanishingiz mumkin - bu yana talablar to'g'risidagi hujjatda paydo bo'lishi mumkin bo'lgan xatti-harakatlar tekshiruvi ("To'lovni saqlab qolishning iloji bo'lmasa, elektron pochta xabarini yuboring"). Agar siz To'lov xizmatini masxara qilsangiz va uning JavaScript-ning to'g'ri turlari bilan chaqirilganligiga ishonch hosil qilsangiz, u holda sizning testingiz ichki funktsiyalarga qaratiladi, bu esa dastur funktsiyasi bilan hech qanday aloqasi yo'q va tez-tez o'zgarib turadi.

Aks holda: har qanday kodni qayta ishlab chiqish, koddagi barcha xatolarni qidirish va tegishli ravishda yangilash. Sinovlar yordam beradigan do'stdan ko'ra yukga aylanadi

-Naqshga qarshi misol: moklar ichki qismga qaratilgan

Buni to'g'ri bajaring: josuslar talablarni sinashga qaratilgan, ammo yon ta'sir sifatida muqarrar ravishda ichki a'zolarga tegadi

️ 6. "Foo" qilmang, haqiqiy ma'lumotlarni kiriting

Do: Ko'pincha ishlab chiqarish xatolari juda aniq va hayratlanarli kiritish ostida aniqlanadi - sinov usuli qanchalik aniq bo'lsa, xatolarni barvaqt aniqlash imkoniyati shunchalik katta bo'ladi. Faker kabi maxsus kutubxonalardan foydalanib, ishlab chiqarish ma'lumotlarining xilma-xilligi va shakliga o'xshash soxta real ma'lumotlarni yaratish uchun foydalaning. Masalan, bunday kutubxonalar tasodifiy, ammo haqiqiy telefon raqamlari, foydalanuvchi nomlari, kredit kartalari, kompaniya nomlari va hattoki "lipsem ipsum" matnini yaratadi. Hatto haqiqiy ma'lumotlarni ishlab chiqarish muhitidan import qilishni va sinovlarda foydalanishni ham ko'rib chiqing. Uni keyingi bosqichga olib chiqmoqchimisiz? keyingi o'qga qarang (mulkka asoslangan test)

Aks holda: Agar siz "Foo" kabi sintetik kirishlardan foydalansangiz, sizning barcha ishlab chiqishlaringiz sinovlari soxta bo'lib ko'rinadi, ammo hacker "@ 3e2ddsf" kabi yoqimsiz simni kiritganda ishlab chiqarish qizilga aylanishi mumkin. ## '1 fdsfds. fds432 AAAA ”

-Patternga qarshi misol: haqiqiy bo'lmagan ma'lumotlar sababli o'tadigan sinov to'plami

RightTo'g'ri taqlid qilish: Tasodifiy real kiritish

7. Xususiyatlarga asoslangan testdan foydalanib ko'plab kirish birikmalarini sinab ko'ring

Do: Odatda har bir sinov uchun bir nechta kirish namunalarini tanlaymiz. Kiritish formati real dunyo ma'lumotlariga o'xshasa ham ("Not foo" o'qiga qarang), biz faqat bir nechta kirish birikmalarini (usul ('', true, 1), usul ("string", false ", 0) qamrab olamiz. ) Biroq, ishlab chiqarishda, 5 parametrli API deb nomlangan minglab turli xil ma'lumotlarga murojaat qilish mumkin, ulardan bittasi bizning jarayonimizni susaytirishi mumkin (Fuzz Testing-ga qarang). Agar siz har xil ma'lumotlarning avtomatik ravishda 1000 ta ma'lumotlarini yuboradigan va bizning kodimiz to'g'ri javobni qaytarib bermaydigan ma'lumotni topadigan bitta test yozsangiz nima bo'ladi? Mulkga asoslangan test - bu aynan shunday bajaradigan usul: sinov paytida sizning barcha mumkin bo'lgan birikmalaringizni kombinatsiyaga yuborib, bu xato topishning tezligini oshiradi. Masalan, berilgan usul - addNewProduct (id, nomi, isDiscount) - qo'llab-quvvatlanadigan kutubxonalar ushbu usulni ko'p sonli birikmalar (raqam, satr, buqa) (1, "iPhone", soxta), (2, "Galaxy") yordamida chaqiradi. ”, Rost). Js-valid yoki testcheck (ancha yaxshi hujjatlar) kabi kutubxonalardan foydalanib, o'zingizning sevimli test sinovi dasturidan (Mocha, Jest va hk) foydalangan holda mulkiy test sinovlarini o'tkazishingiz mumkin. Yangilanish: Nikolay Dubien quyidagi izohlarda ba'zi qo'shimcha funktsiyalarni taklif qiladigan va faol ravishda xizmat ko'rsatishni talab qiladigan tezkor tekshirishni taklif qiladi.

Aks holda: behush holda, siz faqat yaxshi ishlaydigan kod yo'llarini qamrab oladigan sinov kirishlarini tanlaysiz. Afsuski, bu xatolarni fosh qilish uchun vosita sifatida sinov samaradorligini pasaytiradi

☺ Buni to'g'ri amalga oshirish: "mocha-testcheck" yordamida ko'plab kirish ma'lumotlarini sinash

️ 8. Sinov davomida qoling: tashqi yordamchilar va abstraksiyalarni minimallashtiring

Bajaring: Hozirgi vaqtda men sodda va sodda sinovlarni taklif qilayotganim ravshan: Jamoa kodni tushunish uchun aqliy harakat talab qiladigan boshqa dasturiy ta'minot loyihasini ololmaydi. Maykl Link o'zining buyuk lavozimida buni quyidagicha izohlaydi:

Yaxshi ishlab chiqarish kodi yaxshi tasdiqlangan; yaxshi sinov kodi yaqqol ko'rinib turibdi ... Sinov yozayotganda, tanaffusni ko'radigan keyingi dasturchi haqida o'ylang. Ular sizning barcha test to'plamingizni o'qishni xohlamaydilar va ular sinov dasturlarining meros daraxtini to'liq o'qishni xohlamaydilar.

O'quvchiga testdan chiqmasdan butun voqeani bilib olishga imkon bering, idish-tovoq buyumlari, ilgaklar yoki biron bir tashqi ta'sirni sinab ko'ring. Juda ko'p takrorlash va nusxa ko'chirish kerakmi? OK, sinov bitta tashqi yordamchini qoldirishi va aniq bo'lishi mumkin. Ammo u uchta va to'rtta yordamchiga va ilgaklarga o'sganda, bu murakkab tuzilma asta-sekin shakllanishini anglatadi

Aks holda: To'satdan siz har bir sinov to'plamiga 4 ta yordamchini topdingiz, ulardan ikkitasi bazadan foydalanishda meros bo'lib, ko'plab o'rnatish va yirtib olish uchun kancalarmi? tabriklayman, siz shunchaki saqlash uchun yana bir qiyin loyihani yutib oldingiz, yaqin orada testlar to'plamiga qarshi test yozishingiz mumkin

-Patternga qarshi misol: farasingiz va bilvosita test tuzilishi. Sinov holatini tashqi qaramlikka o'tmasdan tushunasizmi?

Right Buni to'g'ri bajarish: Turli xil fayllardan o'tmasdan tushunishingiz mumkin bo'lgan sinov

️ 9. Global sinov anjomlari va urug'laridan saqlaning, har bir sinov uchun ma'lumotlar qo'shing

Bajaring: Oltin qoidaga binoan (0-o'q) har bir test birlashtirilishining oldini olish va test oqimi to'g'risida osonlikcha mulohaza yuritish uchun o'z DB qatorlarini qo'shish va harakat qilish kerak. Aslida, bu tez-tez natijalarni yaxshilash maqsadida testlarni boshlashdan oldin ma'lumotlar to'plamini to'ldiradigan sinovchilar tomonidan buziladi ("sinov moslamasi" deb ham nomlanadi). Ishlash haqiqatan ham to'g'ri tashvish bo'lsa-da, uni engillashtirish mumkin ("Komponentlarni sinash" o'qiga qarang), ammo sinovning murakkabligi ko'pincha og'riqni keltirib chiqaradigan qayg'u bo'lib, ko'pincha boshqa fikrlarni ham hisobga olishi kerak. Amalda, har bir sinov holatida aniqlangan MB ma'lumotlar yozuvini qo'shing va faqat shu yozuvlar asosida harakat qiling. Agar unumdorlik juda muhim bo'lsa - muvozanatli kompozitsion ma'lumot mutatsiyaga ega bo'lmagan (masalan, so'rovlar) yagona test to'plamini ekish shaklida paydo bo'lishi mumkin.

Aks holda: Bir nechta sinovlar muvaffaqiyatsiz tugadi, tarqatish bekor qilindi, bizning jamoamiz endi qimmatbaho vaqtni sarflamoqchi, bizda xato bormi? tekshirib ko'raylik-chi, yo'q - ikkita sinov bitta urug 'ma'lumotlarini mutatsiyaga uchraganga o'xshaydi

Pat Pattern Anti Namunasi: testlar mustaqil emas va global MB ma'lumotlarini uzatish uchun ba'zi global kancalarga tayanadi

«To'g'ri misolni bajarish»: Biz sinov davomida qolishimiz mumkin, har bir test o'z ma'lumotlari to'plamiga binoan ishlaydi

️ 10. Xatolarga duch kelmang, ularni kuting

Bajaring: Agar biron bir kirishda xato yuzaga kelgan deb ta'kidlamoqchi bo'lsangiz, nihoyat "catch-nihoyat" ni ishlatish va "tutib olish" yozuvi kiritilgan deb ta'kidlash to'g'ri bo'lishi mumkin. Natijada oddiy va sodda sinov niyatlari va natija kutishlarini yashiradigan noqulay va og'zaki sinov ishi (pastdagi misol).

Yana oqlangan alternativa bitta chiziqli bag'ishlangan Chai tasdiqlash: kutish (usul) .to.throw (yoki Jestda: kutish (usul) .toThrow ()). Istisno xato turini tavsiflaydigan xususiyatni o'z ichiga olishi kerak, aks holda faqat umumiy xato bo'lsa, ilova foydalanuvchiga umidsizlik xabarini etkazishdan ko'ra ko'proq ish qila olmaydi.

Aks holda: Sinov hisobotlarida (masalan, CI hisobotlarida) noto'g'ri bo'lgan narsalarni aniqlash qiyin bo'ladi

-Naqlga qarshi misol: urinish bilan xato borligini tasdiqlashga urinadigan uzoq sinov ishi

«To'g'ri namuna oling: osonlikcha tushunilishi mumkin bo'lgan odam o'qishi mumkin bo'lgan kutish, ehtimol hatto QA yoki texnik PM tomonidan ham.

️10. Sinovlaringizni belgilang

Bajaring: Turli xil testlar turli xil stsenariylarda bajarilishi kerak: tez tutun, IO-kam, testlar ishlab chiqaruvchi faylni saqlash yoki ishga tushirganda, to'liq sinov tugashi odatda yangi tortish so'rovi yuborilganda yuboriladi va hokazo. Sinovlarni #cold #api #sanity kabi kalit so'zlar bilan teglash orqali erishish mumkin, shunda siz sinov jihozi bilan bog'lanib, kerakli to'plamni ishga tushirishingiz mumkin. Masalan, Mocha bilan faqat aql-idrokka oid sinov guruhini chaqirishingiz shunday bo'ladi: mocha - grep 'sanity'

Aks holda: barcha testlarni, shu jumladan o'nlab ma'lumotlar bazasi so'rovlarini bajaradigan testlarni, har qanday ishlab chiqaruvchi kichik o'zgarishlarni amalga oshirganda juda sekin bo'lishi mumkin va ishlab chiquvchilarni testlarni o'tkazishdan saqlaydi

Buni to'g'ri bajarish: Testlarni "# sovuq-sinov" deb belgilash, sinov qatnashchisiga faqat tezkor testlarni bajarish imkonini beradi (Sovuq === tezkor testlar, ular IO qilmaydilar va tez-tez dasturchilar yozayotgan paytda ham bajarilishi mumkin).

11. Boshqa umumiy sinov gigienasi

Do: Ushbu post test tugmachasi bilan bog'liq yoki hech bo'lmaganda Node JS bilan taqqoslanishi mumkin bo'lgan sinovga qaratilgan. Ushbu o'q, ammo ma'lum bo'lgan ba'zi tugunlarga tegishli bo'lmagan maslahatlarni birlashtiradi

TDD tamoyillarini o'rganing va amal qiling - ular ko'pchilik uchun juda qadrlidir, ammo agar ular sizning uslubingizga mos kelmasa, siz qo'rqmaysiz, siz yagona emassiz. Kodni oldin testlarni qizil-yashil-refaktorli uslubda yozishni o'ylab ko'ring, xato topganda, har bir testning aniq bajarilishini tekshiring - kelajakda bu xatoni aniqlaydigan test yozishdan oldin har bir sinov kamida muvaffaqiyatsiz bo'lishiga yo'l qo'ying. Yashil rang berishdan oldin bir marta atrof-muhitga bog'liq bo'lmaslik kerak (yo'llar, OS va hk).

Aks holda: siz o'nlab yillar davomida to'plangan donolik marvaridlarini sog'inasiz

*** qism: Sinov turlari ***

️ 12. Sinov portfelingizni boyiting: birlik sinovlari va piramidani sinab ko'ring

Do: Sinov piramidasi, 10 yoshga to'lgan bo'lsa ham, uchta sinov turini taklif qiladigan va ko'pchilik ishlab chiquvchilarning sinov strategiyasiga ta'sir ko'rsatadigan ajoyib va ​​mos modeldir. Shu bilan birga, bir nechta bir nechta yangi sinov texnikasi paydo bo'ldi va ular sinov piramidasi soyalarida yashirinmoqda. So'nggi 10 yil ichida biz ko'rgan barcha keskin o'zgarishlarni hisobga olsak (Microservices, bulutsiz, serversiz), bitta eski modelning barcha turdagi * ilovalarga mos kelishi mumkinmi? sinov dunyosi yangi sinov usullarini kutib olishni o'ylamaydimi?

Meni xato qilmang, 2019 yilda sinov piramidasi, TDD va blok sinovlari hali ham kuchli texnik bo'lib, ehtimol ko'plab dasturlar uchun eng yaxshi mos keladi. Faqat boshqa har qanday model singari, foydali bo'lishiga qaramay, ba'zida noto'g'ri bo'lishi kerak. Masalan, ko'plab hodisalarni Kafka / RabbitMQ kabi xabarlar avtobusiga yuboradigan IOT dasturini ko'rib chiqing, ular keyinchalik ba'zi ma'lumotlar omboriga kirib boradi va keyinchalik ba'zi UI tahlilchilari tomonidan so'raladi. Biz haqiqatdan ham integratsiyaga asoslangan va mantiqqa to'g'ri kelmaydigan dastur uchun birlik testlarini yozishga sarflaydigan 50% byudjetimiz miqdorini sarflashimiz kerakmi? Ilova turlarining xilma-xilligi oshgani sayin (botlar, kripto, Alexa-ko'nikmalar) sinov piramidasi eng yaxshi mos kelmaydigan stsenariylarni topish imkoniyatiga ega bo'ladi.

Sinov portfelini boyitib, ko'proq sinov turlari bilan tanishish vaqti keldi (keyingi o'qlar kam g'oyalarni taklif qiladi), sinov piramidasi kabi aqliy modellar, ammo sinov turlarini siz duch kelayotgan real muammolarga mos keladigan ('Hey, bizning API buzildi, keling, iste'molchilar tomonidan tuzilgan shartnoma sinovlarini yozing! '), xavflarni tahlil qilish asosida portfelni yaratadigan investor kabi testlaringizni diversifikatsiya qiling - muammolar paydo bo'lishi mumkin bo'lgan joylarni baholang va ushbu potentsial xavf-xatarlarni yumshatish uchun ba'zi choralarni ko'ring.

Diqqat qilish kerak: dasturiy ta'minot dunyosida TDD argumenti odatda yolg'on-dixotomiya yuzini oladi, ba'zilari uni hamma joyda ishlatishni va'z qilishadi, boshqalari esa bu shaytondir deb o'ylashadi. Mutlaqo gapiradigan har bir kishi noto'g'ri:]

Aks holda: siz ajoyib ROI-ga ega vositalarni sog'inasiz, masalan, Fuzz, lint va mutatsiya kabi vositalar 10 daqiqada qiymat berishi mumkin

Right Buni to'g'ri amalga oshirish: Sindi Sridxaran o'zining "Testing Microservices - oqilona yo'l" nomli ajoyib posterida juda katta sinov portfelini taklif qiladi.

Masalan: YouTube: "Unit Sinovlaridan tashqari: 5 Shiny Node.JS Test turlari (2018)" (Yoni Goldberg)

Yoni Goldberg tomonidan 5 ta sinov usullari

️ 13. Komponentlarni sinovdan o'tkazish sizning eng yaxshi ishingiz bo'lishi mumkin

Bajaring: Har bir birlik sinovi ilovaning ozgina qismini qamrab oladi va uni to'liq qoplash juda qimmat, holbuki oxir-oqibat sinov juda ko'p joyni qamrab oladi, ammo u engil va sekinroq, nima uchun muvozanatli yondashuvni qo'llamang va testlarni yozing. birlik sinovlaridan kattaroq, ammo oxir-oqibat sinovdan kichikroqmi? Komponentlarni sinash - bu sinov olamining aqlga sig'maydigan qo'shig'i - ular ikkala dunyodan eng yaxshisini taqdim etadi: o'rtacha ishlash va TDD naqshini qo'llash imkoniyati + haqiqiy va ajoyib qamrov.

Komponent sinovlari Microservice-ning "birligi" ga qaratilgan, ular API-ga qarshi ishlaydi, Microservice-ning o'ziga tegishli bo'lgan narsani masxara qilmang (masalan, haqiqiy MB yoki hech bo'lmaganda ushbu MB ning xotirasida), ammo tashqi har qanday narsani to'xtating. boshqa Microservices-ga qo'ng'iroqlar kabi. Shunday qilib, biz joylashtirgan narsalarimizni sinab ko'ramiz, ilovani tashqaridan ichkariga qarab yaqinlashtiramiz va oqilona vaqtga katta ishonchni ta'minlaymiz.

Aks holda: tizimning atigi 20% qamrab olinganligingizni bilish uchun siz yozuv bloklarini tekshirishga ko'p kun sarflashingiz mumkin

☺ Buni to'g'ri bajarish: Supertest jarayoni Express API-ga (tez va ko'p qatlamlarni qamrab oladigan) yaqinlashishga imkon beradi.

️ 14. Yangi relizlar iste'molchilar tomonidan tuzilgan shartnomalardan foydalangan holda API-ni buzmasligiga ishonch hosil qiling

Bajaring: Shunday qilib, sizning Microservice-da bir nechta mijozlar mavjud va siz moslik sababli xizmatning bir nechta versiyasini ishlatasiz (barchangizni baxtli tutasiz). Keyin siz biron bir maydonni va "bom!" Ni o'zgartirasiz, bu sohaga ishongan muhim mijoz g'azablanadi. Bu integratsiya dunyosining Catch-22: server tomoni mijozning barcha kutganlarini inobatga olish juda qiyin - Boshqa tomondan, mijozlar sinovlarni o'tkaza olmaydi, chunki server chiqarilish sanasini boshqaradi. Iste'molchilar tomonidan tuzilgan shartnomalar va PACT asoslari ushbu jarayonni juda buzuvchi yondashuv bilan rasmiylashtirish uchun yaratilgan - server o'z sinov rejasini aniqlamaydi, balki mijoz… server sinovlarini aniqlaydi! PACT mijozlar kutganlarini qayd etib, "brokeri" ni umumiy joyga joylashtirishi mumkin, shuning uchun server buzilgan shartnomalarni aniqlash uchun PACT kutubxonasidan foydalangan holda kutishlarni amalga oshirishi va har bir qurilishda ishlashi mumkin - mijoz kutgan natijalar bajarilmaydi. Shunday qilib, barcha server-mijoz API mos kelmasligi tuzilish / CI vaqtida aniqlanadi va bu sizga katta ko'ngilsizlikni saqlashi mumkin

Aks holda: alternativa - bu qo'lda sinovdan o'tkazish yoki joylashtirishdan qo'rqish

Right Buni to'g'ri bajarish:

️ 15. O'rtoqlaringizni yakka holda sinab ko'ring

Bajaring: Ko'pchilik O'rta dasturlarni sinashdan qochishadi, chunki ular tizimning oz qismini tashkil etadi va jonli Express serverini talab qiladi. Ikkala sabab ham noto'g'ri - O'rta masofalar kichik, ammo so'rovlarning barchasiga yoki ko'pchiligiga ta'sir qiladi va osonlikcha {req, res} JS ob'ektlarini oladigan toza funktsiyalar sifatida sinovdan o'tkazilishi mumkin. O'rta dastur funktsiyasini sinab ko'rish uchun faqat uni chaqirib, (masalan, Sinon-dan foydalanib) funktsiyani to'g'ri bajarilishini ta'minlash uchun {req, res} ob'ektlari bilan o'zaro aloqada josuslik qilish kerak. Kutubxona node-mock-http buni yanada ko'proq talab qiladi va {req, res} ob'ektlarini o'zlarining xatti-harakatlariga josuslik qilish bilan birga keltirib chiqaradi. Masalan, res ob'ektida o'rnatilgan http holati kutilgan natijaga mos keladimi yoki yo'qligini aniqlashi mumkin (quyidagi misolga qarang).

Aks holda: Express dasturidagi xato === barcha yoki ko'p so'rovlarda xato

☺ Buni to'g'ri bajaring: O'rta dasturni izolyatsiya qilish orqali tarmoq qo'ng'iroqlari va butun Express mashinasini uyg'otmasdan sinab ko'rish

️ 16. Statik tahlil vositalaridan foydalangan holda o'lchov va refaktor

Bajaring: Statik tahlil vositalaridan foydalanish, kod sifatini yaxshilash va kodni ushlab turishning ob'ektiv usullarini taqdim etish orqali yordam beradi. Kodni hidlaganida, uni bekor qilish uchun siz o'zingizning CI tuzishingizga statik tahlil vositalarini qo'shishingiz mumkin. Oddiy nashrlarda sotiladigan asosiy savdo nuqtalari bu bir nechta fayllar kontekstida sifatni tekshirish (masalan, nusxalarni aniqlash), ilg'or tahlillarni bajarish (masalan, kodning murakkabligi) va kod muammolarining tarixi va rivojlanishini kuzatish. Siz foydalanishingiz mumkin bo'lgan vositalarning ikkita namunasi - Sonarqube (2600+ yulduzlar) va Code Climate (1500+ yulduzlar).

Kredit: Keyt Xolliday

Aks holda: kod sifati past bo'lsa, xatolar va ishlash har doim hech qanday yangi kutubxona yoki zamonaviy xususiyatlarni to'g'irlolmaydigan muammo bo'lib qoladi.

☺ Buni to'g'ri bajarish: CodeClimat, murakkab usullarni aniqlay oladigan tijorat vositasi:

️ 17. Tugun bilan bog'liq tartibsizlikka tayyorligingizni tekshiring

Bajaring: g'alati, dasturiy ta'minotga oid testlarning ko'pi faqat mantiq va ma'lumotlar haqida, lekin ba'zi yomon narsalar (va ularni yumshatish qiyin) infratuzilma muammolari. Masalan, siz protsess xotirangiz haddan tashqari yuklanganida yoki server / jarayon nobud bo'lganda nima sodir bo'lishini sinab ko'rganmisiz yoki API 50% sekinlashganda kuzatuv tizimingiz tushunadimi ?. Ushbu turdagi yomon narsalarni sinab ko'rish va yumshatish uchun - betartiblik muhandisligi Netflix tomonidan tug'ilgan. Uning maqsadi xaotik muammolarga nisbatan bizning ilova dasturimizning barqarorligini sinash uchun xabardorlik, ramkalar va vositalarni taqdim etishga qaratilgan. Masalan, uning mashhur vositalaridan biri bo'lgan betartiblik maymun, bizning xizmatimiz hali ham foydalanuvchilarga xizmat qilishini va bitta serverga ishonmasliklarini ta'minlash uchun tasodifiy ravishda serverlarni o'ldiradi (Kubernetes versiyasi ham bor, podlarni o'ldiradigan kub-maymun ham bor). Ushbu vositalarning barchasi hosting / platforma darajasida ishlaydi, ammo agar siz Node protsedurangiz noto'g'ri xatolarni, tekshirilmagan va'da rad qilinishini, v8 xotira 1,7 Gb maksimal yuklangan bo'lsa yoki yo'qligini tekshirib ko'rish kabi toza Node tartibsizligini sinab ko'rishni va yaratishni xohlasangiz nima bo'ladi? voqealar ketma-ketligi tez-tez bloklanib qolsa, sizning UX qoniqarli holatda qoladimi? Men yozganman, tugun bilan bog'liq tartibsiz xatti-harakatlarning barcha turlarini ta'minlaydigan tugun-xaos (alfa).

Aks holda: Bu erda hech qanday qochish bo'lmaydi, Merfining qonuni sizning ishlab chiqarishingizga rahm-shafqat qilmasdan zarba beradi

Right To'g'ri taqlid qiling: Node-xaos har qanday Node.js-ni yaratishi mumkin, shunda siz o'zingizning ilovangizni xaosga qanchalik mosligini sinab ko'rishingiz mumkin.

*** bo'lim: Sinov samaradorligini o'lchash ***

️ 18. Ishonch hosil qilish uchun etarlicha qamrab oling, ~ 80% bu omadli raqamga o'xshaydi

Do: Sinovdan maqsad - tez harakat qilish uchun etarli ishonchga ega bo'lish, shubhasiz, qancha ko'p kodni sinab ko'rish, jamoaga shunchalik ishonch hosil qilishidir. Qoplash bu testlar tomonidan qancha kod satrlariga (va filiallar, iboralar va hk) erishilganlik o'lchovidir. Xo'sh, qancha pul etarli? Tuzatishning to'g'riligi to'g'risida hech qanday ma'lumotga ega bo'lish uchun 10-30% juda past, boshqa tomondan 100% juda qimmat va sizning e'tiboringizni kritik yo'llardan kodning ekzotik burchaklariga yo'naltirishi mumkin. Uzoq javob shundaki, bu dastur turiga bog'liq ko'plab omillarga bog'liq - agar siz Airbus A380 ning yangi avlodini yaratmoqchi bo'lsangiz, 100% shart, chunki multfilmlar veb-saytida 50% ortiqcha bo'lishi mumkin. Garchi sinov ishtiyoqiga ega bo'lganlarning aksariyati to'g'ri qamrov chegarasi kontekstual deb da'vo qilsalar ham, ularning aksariyati, 80% raqamini, qoida tariqasida, deyishadi (Fowler: "80 yoki 90-yillarda"), bu dasturlarning ko'pini qondirishi kerak. .

Amalga oshirish bo'yicha maslahatlar: Siz doimiy integratsiyangizni (CI) qamrov chegarasi (Jest link) ga sozlashni va ushbu standartga mos kelmaydigan qurilishni to'xtatishni xohlashingiz mumkin (har bir komponent uchun pol qiymatini sozlash mumkin, quyida keltirilgan kod misoliga qarang). . Buning ustiga, (agar yangi kiritilgan kod kamroq qamrab olinsa) qamrab olishni kamaytirishni aniqlashni o'ylab ko'ring - bu ishlab chiquvchilarni sinovdan o'tgan kod miqdorini oshirishga yoki hech bo'lmaganda saqlashga majbur qiladi. Bularning barchasi, qamrov faqat bitta o'lchovga asoslangan, miqdoriy asosga asoslangan o'lchov, bu sizning testingizning mustahkamligini aniqlash uchun etarli emas. Keyingi o'qlarda ko'rsatilgandek, bu ham aldanishi mumkin

Aks holda: ishonch va raqamlar bir-biriga yaqinlashadi, aslida siz tizimning ko'p qismini sinab ko'rganingizni bilmasdan - qo'rquv ham bo'ladi. va qo'rquv sizni susaytiradi

☺ Masalan: Oddiy qamrov to'g'risidagi hisobot

Istanbul qamrovi to'g'risidagi hisobot

☺ Buni to'g'ri bajarish: har bir komponent uchun qamrovni sozlash (Jest-dan foydalangan holda)

Kontekstni yoritish

️ 19. Tekshirilmagan joylar va boshqa g'alati narsalarni aniqlash uchun qamrov hisobotini tekshiring

Bajaring: Ba'zi muammolar shunchaki radar ostida yashirinadi va an'anaviy vositalardan foydalanib topish juda qiyin. Bu haqiqatan ham xato emas, ammo ta'sir qilishi mumkin bo'lgan ajablantiradigan amaliy harakatlar. Masalan, ko'pincha ba'zi kod sohalari hech qachon yoki kamdan-kam hollarda chaqirilmaydi - siz "PricingCalculator" klassi har doim mahsulot narxini belgilaydi deb o'ylagansiz, ammo bizda 10000 ta mahsulot mavjud bo'lsa-da va ko'plab savdo-sotiq mavjud bo'lsa ham, kod hech qachon ishlatilmaydi ... Kodni qamrab olish. hisobotlar ilova sizning fikringizcha qanday bo'lishini bilishingizga yordam beradi. Bundan tashqari, kodning qaysi turlari sinovdan o'tkazilmaganligini ham ta'kidlash mumkin - 80% kod sinovdan o'tganligi tanqidiy qismlar qamrab olingan yoki qilinmaganligini aytmaydi. Hisobotlarni yaratish juda oson - shunchaki dasturni ishlab chiqarishda boshqaring yoki sinov paytida qamrovni kuzatib boring va so'ngra har bir kod zonasi qanchalik tez-tez chaqirilishini ta'kidlaydigan rangli hisobotlarni ko'ring. Agar siz ushbu ma'lumotlarga qarashga vaqt ajratsangiz, sizda ba'zi topchalarni topishingiz mumkin

Aks holda: Agar kodingizning qaysi qismlari sinovdan o'tkazilmaganligini bilmasangiz, muammolar qaerdan kelib chiqishini bilmaysiz

-Patternga qarshi misol: Ushbu qamrov to'g'risidagi hisobotda nima noto'g'ri? haqiqiy hayot stsenariysi asosida biz QA-da dasturlardan foydalanishni kuzatdik va qiziqarli kirish naqshlarini aniqladik (Maslahat: tizimga kirishda muvaffaqiyatsizliklar soni mutanosib emas, aniq bir narsa noto'g'ri. Nihoyat, ba'zi oldingi xatolarga duch kelmoqda. orqaga kirish API)

️ 20. Mutatsion test yordamida mantiqiy qamrovni o'lchang

Do: An'anaviy qamrov o'lchovi ko'pincha yolg'on: Bu sizga 100% kod qamrovini ko'rsatishi mumkin, ammo sizning biron bir vazifangiz, hatto bittasi ham to'g'ri javobni qaytarib bermaydi. Qanaqasiga? u shunchaki testning qaysi qatoriga kirganligini o'lchaydi, lekin testlar biron bir narsani sinab ko'rmaganligini tekshirmaydi - to'g'ri javob berilganligi. Kimdir biznesga ketayotgan va pasportdagi muhrlarini ko'rsatgan odam kabi - bu hech qanday ish bajarilganini isbotlamaydi, faqatgina u bir nechta aeroport va mehmonxonalarni ziyorat qilgan.

Mutatsiyalarga asoslangan test shunchaki KO'RILMANGA emas, aslida tekshirilgan kod miqdorini aniqlash orqali yordam beradi. Stryker - bu mutatsion sinov uchun JavaScript kutubxonasi va uni amalga oshirish juda yaxshi:

(1) kodni ataylab o'zgartiradi va "xatolarni keltirib chiqaradi". Masalan, newOrder.price === 0 kodi yangiOrder.price! = 0 bo'ladi. Ushbu "xatolar" mutatsiyalar deyiladi

(2) testlarni o'tkazadi, agar barchasi muvaffaqiyatli bo'lsa, bizda muammo bo'ladi - testlar xatolarni aniqlash maqsadiga xizmat qilmadi, mutatsiyalar «omon qoldi» deb nomlanadi. Agar sinovlar muvaffaqiyatsiz tugagan bo'lsa, unda mutatsiyalar yo'q qilindi.

Mutatsiyalarning hammasi yoki ko'plari o'ldirilganini bilish an'anaviy yoritishga qaraganda ancha yuqori ishonchni beradi va sozlash vaqti o'xshashdir

Aks holda: 85% qamrov sizning sinovingiz 85% kodingizda xatolarni aniqlaydi degan fikrga ishonasiz

Pat Patternga qarshi misol: 100% qamrov, 0% sinov

Buni to'g'ri bajarish: Stryker hisobotlari, mutatsiyani tekshirish vositasi, tekshirilmagan kod miqdorini aniqlaydi va hisoblaydi (Mutatsiyalar).

Stryker hisoboti - Mutatsiyalarning aksariyati yoki aksariyati o'ldirilganini bilish an'anaviy yoritishga qaraganda ancha yuqori ishonch beradi va sozlash vaqti o'xshash

*** bo'lim: SI va boshqa sifat choralari ***

️ 21. O'zingizning laynerlaringizni boyitib, astarlanish muammolari mavjud bo'lgan abortlaringizni qiling

Bajaring: Linters - bu bepul tushlik, 5 minutlik sozlash bilan siz kodni himoya qiladigan va yozishda muhim muammoga duch keladigan avtomatik uchuvchi olasiz. Kosmetika to'g'risida astarli kunlar tugadi (yarim nuqta yo'q!). Hozirgi vaqtda Linters noto'g'ri tashlangan xatolar va ma'lumotni yo'qotish kabi jiddiy muammolarga duch kelishi mumkin. Asosiy qoidalar to'plamining ustiga (masalan, ESLint standarti yoki Airbnb uslubi), eslint-plagin-chai-umid kabi maxsus ixtisoslashtirilgan Linters-ni qo'shing, ular sinovlarni tasdiqlamasdan topishi mumkin, eslint-plagin-va'da hech qanday muammosiz va'dalarni topishi mumkin (sizning kod hech qachon davom etmaydi), eslint-plagin-xavfsizlik DOS hujumlari uchun ishlatilishi mumkin bo'lgan regex istaklarini topishi mumkin va eslint-plugin-you-dont-need-lodash-altcore, kod yordamchi kutubxona usullaridan foydalanganda ogohlantirishi mumkin. Lodash._map (V) kabi V8 asosiy usullarining bir qismi.

Aks holda: Yomg'irli kunni o'ylab ko'ring, unda sizning ishlab chiqarishingiz qulab tushadi, ammo loglarda xatolar stekining izlari ko'rinmaydi. Nima bo'ldi? Sizning kodingiz xato qilmagan narsani otib yubordi va stak izi yo'qoldi, bu sizning boshingizni g'isht devoriga urish uchun yaxshi sababdir. 5 daqiqali liniyani sozlash ushbu TYPO-ni aniqlab, kuningizni tejashga yordam beradi

Patternga qarshi misol: Noto'g'ri xato ob'ekti noto'g'ri yuborilgan, bu xato uchun izlar ko'rinmaydi. Yaxshiyamki, ESLint navbatdagi ishlab chiqarish xatosini tuzatmoqda

Noto'g'ri Error ob'ekti noto'g'ri yuborilgan, bu xato uchun stack-izlar paydo bo'lmaydi. Yaxshiyamki, ESLint navbatdagi ishlab chiqarish xatosini tuzatmoqda

️ 22. Mahalliy developer-CI bilan aloqa doirasini qisqartiring

Qiladimi: CI-ni porloq sifatli tekshiruvlar yordamida tekshirish, linting, zaifliklarni tekshirish va boshqalar. Ishlab chiquvchilarga ushbu quvur liniyasini tezkor ravishda so'rash va fikrlar doirasini qisqartirishda yordam berish. Nima uchun? Samarali sinov jarayoni ko'p va iterativ tsikllarni tashkil etadi: (1) sinab ko'rishlar -> (2) geribildirim -> (3) refaktor. Fikr-mulohaza qanchalik tez bo'lsa, ishlab chiqaruvchi har bir modulni bajarishi va natijalarni mukammal darajada oshirishi mumkin. O'zgarishlar natijasida, agar takroriy takroriy takroriy xayollarni bir kunda yig'ish mumkin bo'lsa, jamoa boshqa mavzu / vazifa / modulga o'tishi mumkin va ushbu modulni takomillashtirish uchun tayyor bo'lmasligi mumkin.

Amalda, ba'zi CI sotuvchilari (masalan: CircleCI load CLI) quvur liniyasini mahalliy ravishda ishga tushirishga imkon beradi. Wallaby kabi ba'zi bir tijorat vositalari ishlab chiqaruvchi prototipi (hech qanday aloqasi yo'q) sifatida juda qimmatli va sinov tushunchalarini taqdim etadi. Shu bilan bir qatorda, siz barcha sifat buyruqlarini (masalan, test, lint, zaifliklar) bajaradigan pack.json-ga npm-skriptni qo'shishingiz mumkin - agar moslamalar parallel ravishda ulanadigan bo'lsa va asboblardan biri muvaffaqiyatsiz bo'lsa, chiqish kodi nolga teng bo'lmaydi. Endi dasturchi faqat bitta buyruqni chaqirishi kerak - masalan. "Npm ish sifati" - tezkor aloqa uchun. Githook yordamida sifat tekshiruvi amalga oshirilmasa, majburiyatni bekor qilish haqida ham o'ylab ko'ring (husky yordam berishi mumkin)

Aks holda: Sifat natijalari koddan bir kun keyin paydo bo'lganda, sinov rasmiy rivojlanishdan keyin emas, balki rivojlanishning ravshan qismiga aylanmaydi

Example To'g'ri bajaring: npm kodlarni sifatini tekshirishni bajaradigan npm-skriptlar, barchasi parallel ravishda ishlaydi yoki dasturchi yangi kodni bosmoqchi bo'lganda.

️ 23. Haqiqiy ishlab chiqarish oynasida e2e sinovini o'tkazing

Bajaring: End-end (e2e) sinovini o'tkazish har bir CI quvurining asosiy vazifasidir - barcha tegishli bulut xizmatlarini o'z ichiga olgan bir xil efemer ishlab chiqarish oynasini yaratish zerikarli va qimmat bo'lishi mumkin. Eng yaxshi murosani topish - bu sizning o'yiningiz: Docker-compose yagona oddiy matnli fayl yordamida bir xil konteyner bilan alohida izolyatsiyalangan dokerlangan muhitni yaratishga imkon beradi, ammo qo'llab-quvvatlash texnologiyasi (masalan, tarmoq, tarqatish modeli) real dunyo ishlab chiqarishlaridan farq qiladi. Siz uni haqiqiy AWS xizmatlarining stublari bilan ishlash uchun 'AWS Local' bilan birlashtirishingiz mumkin. Agar siz serversiz va AWS SAM singari serversiz bir nechta ramkalarga kirsangiz, Faas kodining mahalliy chaqirilishini ta'minlaydi.

Kubernetes ulkan ekotizimi ko'plab yangi vositalar tez-tez ishga tushirilayotganiga qaramay, mahalliy va CI-aks ettirish uchun standart qulay vositani rasmiylashtirishi kerak. Bitta yondashuv - Minikube va MicroK8 kabi vositalardan foydalangan holda "minimallashtirilgan-Kubernetes" ni ishlatishdir, ular haqiqiy narsaga o'xshaydi, ammo ular kam xarajat qiladi. Boshqa yondashuv uzoqdagi "haqiqiy Kubernetes" ni sinab ko'rishdir, ba'zi CI provayderlari (masalan, Codefresh) Kubernetes atrof-muhitiga integratsiyalashgan va CI quvur liniyasini haqiqiy narsadan boshqarishni osonlashtiradi, boshqalari esa uzoq Kubernetesga qarshi skript yozishga imkon beradi.

Aks holda: ishlab chiqarish va sinov uchun turli xil texnologiyalardan foydalanish ikkita joylashtirish modelini qo'llab-quvvatlashni talab qiladi va ishlab chiquvchilar va ishchilar guruhini ajratib turadi

Masalan: Kubernetes tezligini klasterini yaratadigan CI quvur liniyasi (Kredit: Dinamik muhit Kubernetes)

joylashtirmoq:
bosqich: tarqatish
rasm: registry.gitlab.com/gitlab-examples/kubernetes-deploy
skript:
- ./configureCluster.sh $ KUBE_CA_PEM_FILE $ KUBE_URL $ KUBE_TOKEN
- kubectl ns $ NAMESPACE yaratish
- kubectl maxfiy ravishda yaratish - $ NAMESPACE docker-registri gitlab-registri --docker-server = "$ CI_REGISTRY" --docker-username = "$ CI_REGISTRY_USER" --docker-password = "$ CI_REGISTRY_PASSWORD" --docker-email = "$ GITLAB_USER_EMAIL"
- mkdir .shunos
- echo "$ CI_BUILD_REF_NAME- $ CI_BUILD_REF"
- "s / TAG / $ CI_BUILD_REF_NAME - $ CI_BUILD_REF / g" andozalar / bitimlar.yaml | tee ".tashkil etilgan / imkoniyatlar.yaml"
- kubectl qo'llaniladi - Nom bo'shlig'i $ NAMESPACE -f .Generated / deal.yaml
- kubectl apply --namespace $ NAMESPACE -f andozalari / my-sock-shop.yaml
muhit:
nomi: uchun-test

️ 24. Sinovlarni parallel ravishda bajaring

Bajaring: To'g'ri bajarilganingizda, sinab ko'rish - bu tezkor fikr-mulohazalarni ta'minlaydigan 24/7 do'stingizdir. Amalda, bitta ipda 500 protsessorga ulangan birlik sinovini o'tkazish juda ko'p vaqt talab qilishi mumkin. Yaxshiyamki, zamonaviy sinov yuguruvchilari va CI platformalari (masalan, Jest, AVA va Mocha kengaytmalari) sinovni bir nechta jarayonlarga parallellashtirishi va aloqa vaqtida sezilarli yaxshilanishga erishishi mumkin. Ba'zi CI sotuvchilari, shuningdek, sinovlarni konteynerlar (!) Bo'yicha parallel ravishda o'tkazadilar, bu esa aloqa doirasini yanada qisqartiradi. Bir nechta jarayonlarda mahalliy bo'ladimi yoki bir nechta kompyuterlardan foydalangan holda bulutli CLI-da - parallel ravishda talablar sinovlarni avtonom saqlashga imkon beradi, chunki har biri turli xil jarayonlarda ishlashi mumkin.

Aks holda: yangi kodni terganingizdan keyin 1 soat o'tgach, test natijalarini olish, chunki siz keyingi funktsiyalarni allaqachon kodlab qo'ygansiz, sinovni ahamiyatsiz qilish uchun ajoyib retseptdir

Buni to'g'ri bajaring: Mocha parallel va Jest parallel ravishda sinab ko'rish tufayli an'anaviy Mocha-dan osongina ustun keladi (Kredit: JavaScript test-yuguruvchilarining mezonlari)

️ 25. Litsenziya va plagiatni tekshirishdan foydalanib, huquqiy masalalardan uzoqroq turing

Do: litsenziyalash va plagiat bilan bog'liq muammolar, ehtimol sizning asosiy tashvishingiz emas, lekin nega bu qutini 10 daqiqada ham belgilab qo'ymaysiz? Litsenziyani tekshirish va plagiat tekshiruvi (tekin reja bilan) kabi npm to'plamlarni osongina o'zingizning CI quvur tarmog'iga solib qo'yish mumkin va Stackoverflow-dan nusxa ko'chirilgan va ba'zi mualliflik huquqlarini buzgan cheklovchi litsenziyalar yoki kodlar bilan bog'liqlikni tekshirish mumkin.

Aks holda: ishlab chiqaruvchilar beixtiyor litsenziyaga ega paketlardan foydalanishlari yoki tijorat kodini nusxalashlari va huquqiy muammolarga duch kelishlari mumkin

Buni to'g'ri bajarish:

// litsenziyatingizni tekshiruvchisini CI muhitingizda yoki mahalliy sharoitda o'rnating
npm install -g litsenziyani tekshirish xizmati
// undan barcha litsenziyalarni skanerlashini so'rang va agar ruxsat etilmagan litsenziyani topsa 0 dan boshqa chiqish kodi bilan muvaffaqiyatsiz bo'ladi. CI tizimi ushbu nosozlikni sezishi va tuzilishini to'xtatishi kerak
litsenziya tekshiruvi - qisqacha ma'lumot --failOn BSD

️26. Zaif bog'liqliklarni doimiy tekshirib turing

Do: hatto eng mashhur, masalan, Express kabi qaramliklar ham ma'lum zaifliklarga ega. Bu npm auditi kabi jamoat vositalaridan yoki snyk (masalan, bepul hamjamiyat versiyasini taklif qilish) kabi tijorat vositalaridan foydalangan holda osonlikcha qondirilishi mumkin. Har ikkalasini ham har bir qurishda CI-dan foydalanish mumkin

Aks holda: Kodni maxsus vositalarsiz zaiflikdan toza saqlash uchun yangi tahdidlar haqidagi Internet nashrlarini doimiy ravishda kuzatib borish talab etiladi. Juda zerikarli

Masalan: NPM audit natijalari

️ 27. qaramlik yangilanishlarini avtomatlashtirish

Do: ip va npm-pack-lock.json-ning so'nggi kiritilishi jiddiy sinovni keltirib chiqardi (do'zaxga boradigan yo'l yaxshi niyat bilan qurilgan) - endi odatdagidek, paketlar endi yangilanmaydi. Hatto "npm o'rnatish" va "npm yangilanishi" bilan ko'plab yangi dasturlarni ishlaydigan jamoa ham yangi yangiliklarga ega bo'lmaydi. Bu, eng yaxshi holatda, pastki paketlarga bog'liq paketlarning versiyalariga yoki yomon kodlarga olib keladi. Endi jamoalar pack.json-ni qo'lda yangilash yoki ncu kabi vositalarni qo'lda ishlatish uchun ishlab chiquvchilarga yaxshi niyat va xotiraga ishonishadi. Eng ishonchli usul, eng ishonchli versiyani olish jarayonini avtomatlashtirish bo'lishi mumkin, garchi kumush o'qli echimlar mavjud emas, ammo avtomatlashtirishning ikkita yo'li mavjud: (1) CI eskirgan qaramlikka ega bo'lgan inshootlarni muvaffaqiyatsiz tugatishi mumkin - "npm" kabi vositalardan foydalanish. eskirgan 'yoki' npm-check-updates (ncu) '. Buni amalga oshirish ishlab chiquvchilarga qaramlikni yangilashga majbur qiladi. (2) Kodni skanerlaydigan va avtomatik ravishda yangilangan bog'liqlik bilan tortib olish so'rovlarini yuboradigan tijorat vositalaridan foydalaning. Bog'lanishni yangilash siyosati qanday bo'lishi kerakligi haqida qolgan bitta savol: har bir yamoqdagi yangilanish juda ko'p qo'shimcha xarajatlarni keltirib chiqaradi, yiriklar chiqarilgandan so'ng to'g'ri yangilanish barqaror bo'lmagan versiyaga ishora qilishi mumkin (ko'plab paketlar ozod qilingan kundan boshlab zaif deb topildi, qarang) eslint-ko'lamli voqea). Samarali yangilanish siyosati ba'zi "o'tish davri" ga yo'l qo'yishi mumkin - mahalliy nusxani eskirgan deb hisoblashdan oldin kodni @latest va versiyalardan bir muncha vaqt orqada qolishiga yo'l qo'ying (masalan, mahalliy versiya - 1.3.1 va saqlash versiyasi - 1.3.8).

Aks holda: Sizning mahsulotingiz muallifi tomonidan xavfli deb aniq belgilangan paketlarni ishlatadi

Masalan: ncu-ni qo'lda yoki CI quvur liniyasida kod so'nggi versiyalardan qay darajada orqada qolayotganligini aniqlash uchun ishlatilishi mumkin.

️ 28. Boshqa tugunlarga aloqador bo'lmagan ma'lumotlarga oid maslahatlar

Do: Ushbu post test tugmachasi bilan bog'liq yoki hech bo'lmaganda Node JS bilan taqqoslanishi mumkin bo'lgan sinovga qaratilgan. Ushbu o'q, ammo ma'lum bo'lgan ba'zi tugunlarga tegishli bo'lmagan maslahatlarni birlashtiradi

  1. Deklarativ sintaksisdan foydalaning. Bu ko'p sotuvchilar uchun yagona variant, ammo Jenkinsning eski versiyalari kod yoki UI-dan foydalanishga imkon beradi
  2. Docker-ning mahalliy qo'llab-quvvatlovchisiga murojaat qiling
  3. Erta muvaffaqiyatsiz, oldin tezkor sinovlarni o'tkazing. Bir necha tezkor tekshiruvlarni (masalan, linting, blok sinovlari) birlashtiradigan va tutunni o'chirib qo'yadigan 'tutun sinovi' bosqichini / bosqichini yarating.
  4. Barcha qurilgan artefaktlarni, shu jumladan sinov hisobotlarini, qamrab olish hisobotlarini, mutatsion hisobotlarini, jurnallarni va boshqalarni osongina kesib o'ting.
  5. Har bir voqea uchun bir nechta quvur liniyalari / ishlarni yarating, ular orasidagi qadamlarni takrorlang. Masalan, tarmoq filiallari uchun ish joyini va bosh PR uchun boshqasini sozlang. Birgalikda ishlatiladigan qadamlar yordamida har bir takrorlash mantig'iga ruxsat bering (ko'p sotuvchilar kodni qayta ishlatish uchun ba'zi mexanizmlarni taqdim etadilar)
  6. Hech qachon ish deklaratsiyasiga sirlarni kiritmang, ularni maxfiy do'kondan yoki ish konfiguratsiyasidan oling
  7. Versiyani aniqlang yoki hech bo'lmaganda dasturchi buni amalga oshirganligiga ishonch hosil qiling
  8. Faqatgina bir marta quring va bitta artefakt (masalan, Docker tasviri) bo'yicha barcha tekshiruvlarni bajaring.
  9. Efemer muhitida quriladigan oromgohda siljimaydigan sinov. Faqat node_modullarni keshlash istisno bo'lishi mumkin

Aks holda: siz yillar davomida donolikni sog'inasiz

️ 29. Matritsani yarating: NI-ning bir nechta versiyasidan foydalanib, bir xil CI bosqichlarini bajaring

Bajaring: Sifatni tekshirish serendipitite haqida, muammolarni erta aniqlashda ko'proq foyda keltiradi. Qayta foydalanish mumkin bo'lgan paketlarni ishlab chiqishda yoki turli xil konfiguratsiyada va tugun versiyalarida ko'p mijozlarni ishlab chiqarishda CI barcha konfiguratsiyalar bo'yicha sinovlarni o'tkazishi kerak. Masalan, biz ba'zi mijozlar uchun mySQL-ni va boshqalar uchun Postgres-ni ishlatamiz deb faraz qilsak - ba'zi CI sotuvchilari 8, 9 va 10-sonli MySQL, Postgres va Node-ning ko'p versiyalariga qarshi sinash uchun kostyumni ishlatishga imkon beradigan "Matrix" funktsiyasini qo'llab-quvvatlamoqdalar. Bu faqat konfiguratsiyadan foydalanib, hech qanday qo'shimcha kuch sarflanmasdan amalga oshiriladi (agar siz sinov yoki boshqa sifatni tekshirgan bo'lsangiz). Matritsani qo'llab-quvvatlamaydigan boshqa CI-larda bunga ruxsat berish uchun kengaytma yoki tweaks bo'lishi mumkin

Aks holda: Demak, yozuv testini o'tkazish orqali shunchaki konfiguratsiya muammolari tufayli xatolarga yo'l qo'yamizmi?

☺ Masalan: Travis (CI sotuvchisi) dan foydalanib, bir nechta tugun versiyalari orqali bir xil testni o'tkazish uchun

tili: node_js
node_js:
  - "7"
  - "6"
  - "5"
  - "4"
o'rnatish:
  - npm o'rnatish
skript:
  - npm yugurish testi

Rahmat. Sizga yoqishi mumkin bo'lgan boshqa maqolalar

  • Tekshirish ro'yxati: Node.js ishlab chiqarishning eng yaxshi amaliyotlari (2018 yil avgust)
  • 2019 yilda Node.js-ni yaxshiroq ishlab chiquvchisi bo'lishning 19 usuli
  • Node.js xavfsizlikning eng yaxshi amaliyotlari (sentyabr 2018)
  • YouTube: sinovning ilg'or va yorqin 5 usuli
  • Node.js eng yaxshi amaliyotlar - mustahkam Node ilovasi uchun 79 ta eng yaxshi amaliyotlar

More Ko'proq narsani xohlaysizmi? meni Twitter-da kuzatib boring

O'zingizning sinovga oid maslahatingiz bormi? PR bu erda va men ushbu maqolani yangilab qo'yganingizga aminman