Node.js ve JavaScript Testlerinin En İyi Uygulamaları (2019)

Önemli Not: Bu makale ek 15 en iyi uygulama ve topluluk tartışmaları ile GitHub deposu oldu.

Kısa Tanıtım

Bağımsız bir Node.js danışmanı olarak, her yıl 10+ projeye katılıyorum ve inceliyorum ve müşterilerim haklı olarak test etmeye odaklanmak istiyorlar. Birkaç ay önce, bu alanda gözlemlediğim içgörüleri ve tekrarlayan hataları belgelemeye başladım ve aniden 30 test en iyi uygulamasına geçti.

Aşağıdaki fikirler, doğru test türlerini seçmek, doğru şekilde kodlamak, etkinliğini ölçmek ve doğru şekilde bir CI / CD boru hattında barındırmak gibi konuları kapsar. Bazı örnekler Jest, bazıları Mocha olan diğerleri kullanılarak gösterilmektedir - bu yazı daha az takım yapmak ve doğru yaklaşım ve teknikler hakkında daha fazladır.

Benim adım Yoni Goldberg, bağımsız bir Node.JS danışmanı ve Node.js en iyi uygulamalarının ortak yazarı. ABD, Avrupa ve İsrail'deki müşterilerle Node.js uygulamalarını parlatma konusunda çalışıyorum. Hizmetim arasında ayrıca test planlama, test incelemesi ve CI / CD kurulumu bulunmaktadır. Beni Twitter'da takip edin ️

Değerlendiren ve geliştiren Bruno Scheufler improved

0.️ 0. Altın Kural: Testler ölü kalabilmeli ve gün boyu temiz kalmalıdır

Bu gülen arkadaşa, aile üyesine veya belki de iyi çalışan ellerinden her zaman faydalanabileceğiniz bir film karakterine aşina mısın, 7/24 pozitif enerjiye ihtiyaç duyduğunuzda kendinize çok az şey sormak için yardım mı istiyorsunuz? Bu şekilde bir test kodu tasarlanmalıdır - kolay, değerli ve eğlenceli. Bu, seçmeli olarak kiraz toplama teknikleri, araçları ve uygun maliyetli ve harika yatırım getirisi sağlayan test hedefleri ile sağlanabilir. Sadece gerektiği kadar test yapın, çevikliği korumak için çaba gösterin, bazen çeviklik ve basitlik için bazı testleri ve ticaret güvenilirliğini düşürmeye değer.

Testler geleneksel bir uygulama kodu olarak değerlendirilmemelidir - tipik bir takıma, ana uygulamasını sürdürmekle (kodladığımız ve sattığımız özellikler) yine de zorlanır, ek karmaşık "projeye" tahammül edemez. Testler ek bir ağrı kaynağı olarak büyürse - terkedilecek veya gelişimi yavaşlatacak.

Bu anlamda, test kodu minimum düzeyde bağımlılık, soyutlama ve dolaylı olarak, basit kalmalı. Bir teste bakmalı ve hemen niyetini almalı. Aşağıdaki tavsiyelerin çoğu bu ilkenin türevleridir

*** Bölüm : Test Anatomisi ***

️ 1. Her test adına 3 parça ekleyin.

Yapın: Bir test raporu, mevcut uygulama revizyonunun, mutlaka kodu aşina olmayan kişilerin gereksinimlerini karşılayıp karşılamadığını söylemelidir: test cihazı, dağıtmakta olan DevOps mühendisi ve bundan iki yıl sonra geleceğiniz. Bu, testler gereksinimler düzeyinde konuşuyorsa ve 3 parça içeriyorsa, en iyi şekilde başarılabilir:

(1) Ne test ediliyor? Örneğin, ProductsService.addNewProduct yöntemi

(2) Hangi şartlar ve senaryoda? Örneğin, yönteme hiçbir fiyat iletilmez

(3) Beklenen sonuç nedir? Örneğin, yeni ürün onaylanmadı

Aksi halde: Bir dağıtım henüz başarısız oldu, “Ürün ekle” adlı bir test başarısız oldu. Bu size tam olarak neyin yanlış olduğunu gösteriyor mu?

Doğru Yapıyor Örnek: 3 bölümden oluşan bir test adı

️☺ Doğru Yapıyor Örnek: Test raporu şartlar belgesine benziyor

Her test senaryosuna 3 bölüm ekleyin, ürün dilini konuşun

2.️ 2. Bir ürün dilinde beklentileri tanımlayın: BDD tarzı iddiaları kullanın

Yapın: Testlerinizi bildirimsel bir stilde kodlamak, okuyucunun tek bir beyin-CPU döngüsünü bile harcamadan anında ele geçirmesini sağlar. Koşullu mantıkla doldurulmuş bir emir kodu yazdığınızda, okuyucu zahmetli bir zihinsel duruma atılır. Bu anlamda, beklentiyi insan kodlu bir dilde, özel kod kullanmamayı ve beklemeyi kullanarak bildirmeli BDD tarzında kodlayın. Chai ve Jest, istenen iddiayı içermiyorsa ve tekrar edilebilirse, Jest eşleştiricisini (Jest) genişletmeyi veya özel bir Chai eklentisi yazmayı düşünün

Aksi takdirde: Takım daha az test yazacak ve can sıkıcı olanları .skip () ile süsleyecektir.

Pattern Anti Pattern Örneği: Okuyucu çok kısa değil ve sadece test hikayesini almak için zorunlu kodu gözden geçirmeli

Doğru Yapıyor Örnek: Aşağıdaki bildirim testine göz atmak bir esintidir

3.️ 3. Test amaçlı eklentiler

Yap: Test kod kalıplarını incelemek ve sorunları keşfetmek için özel olarak bir dizi ESLint eklentisi oluşturuldu. Örneğin, eslint-plugin-mocha, küresel düzeyde bir test yazıldığında (bir açıklama () ifadesinin oğlu değil) veya tüm testlerin geçtiğine dair yanlış bir inanca neden olabilecek testler atlandığında uyarır. Benzer şekilde, eslint-plugin-jest, örneğin, bir testin hiç bir iddiası olmadığı zaman uyarabilir (hiçbir şeyi kontrol etmeden)

Aksi taktirde:% 90 kod kapsamı ve% 100 yeşil testler görmek yüzünüzde sadece bir çok testin hiçbir şey için iddia etmediğini ve birçok test süitinin atlandığını fark edene kadar yüzünüzde büyük bir gülümsemeye neden olacaktır. Umarım, bu yanlış gözlemi temel alan hiçbir şey konuşmadınız

Pattern Anti Pattern Örneği: Neyse ki hepsi Linters tarafından yakalanan, hatalarla dolu bir test durumu

4.️ 4. Kara kutu testine yapış: Sadece genel yöntemleri test et

Yapın: İç kısımları test etmek, neredeyse hiçbir şey için büyük ek yük getirir. Kodunuz / API’niz doğru sonuçları veriyorsa, önümüzdeki 3 saatinizi şirket içinde nasıl çalıştığını NASIL test ederek yatırmalı ve bu hassas testlere devam etmeli? Bir kamu davranışı kontrol edildiğinde, özel uygulama da dolaylı olarak test edilir ve testleriniz yalnızca belirli bir sorun olduğunda (örneğin yanlış çıktı) bozulur. Bu yaklaşım aynı zamanda davranışsal test olarak da adlandırılır. Öte yandan, iç kısımları test etmeniz gerekir (beyaz kutu yaklaşımı) - odak noktanız, bileşen sonucunu planlamaktan nittritli ayrıntılara doğru kaydırılır ve sonuçlar iyi olmasına rağmen, küçük kod yeniden yapılandırıcıları nedeniyle testiniz bozulabilir - bu, bakımı önemli ölçüde arttırır. sorumluluk

Wise Aksi taktirde, testiniz kurt ağlayan çocuk gibi davranır: yüksek-yanlış-pozitif çığlıklar atmak (örneğin, özel bir değişken adı değiştiği için bir test başarısız). Şaşırtıcı olmayan bir şekilde, insanlar bir gün gerçek bir böcek göz ardı edilinceye kadar CI bildirimlerini görmezden gelmeye başlayacak…

Pattern Anti Patern Örneği: Bir test vakası, hiçbir dahili nedenden ötürü iç kısımları test ediyor

️️5. Doğru test çiftlerini seçin: Taslaklar ve casusların lehine alaycılardan kaçının

Yapın: Test çiftleri gerekli bir kötülüktür çünkü uygulama içindekilerle birleştiler, ancak bazıları muazzam bir değer sağlar (Burada test çiftleri hakkında bir hatırlatıcı okuyun: ataklar ve saplamalar vs casuslar). Bununla birlikte, çeşitli teknikler eşit doğmadılar: bazıları casuslar ve taslaklar, gereksinimleri test etmeye odaklanmış, ancak kaçınılmaz bir yan etki olarak, iç kısımlara da hafifçe değiyorlar. Aksine, alaylar, iç kısımları test etmeye odaklanmıştır - bu, “Kara kutu testine yapışıyor” mermisinde açıklandığı gibi büyük bir ek yük getirir.

Test çiftlerini kullanmadan önce çok basit bir soru sorun: Bunu, gereksinimler belgesinde görünen veya görünebilecek olan işlevleri test etmek için kullanıyor muyum? Hayır ise, beyaz kutu testi kokusu var.

Örneğin, ödeme servisi düştüğünde uygulamanızın makul şekilde ne yaptığını test etmek istiyorsanız, ödeme servisini saplayabilir ve test edilen birimin doğru değeri döndürmesini sağlamak için bazı “Yanıt Yok” iadelerini tetikleyebilirsiniz. Bu, uygulama senaryomuzu / yanıtımızı / sonucumuzu belirli senaryolar altında kontrol eder. Ayrıca, bu hizmet düştüğünde bir e-postanın gönderildiğini iddia etmek için bir casus kullanabilirsiniz - bu da yine bir gereksinimler belgesinde görünmesi muhtemel bir davranış kontrolüdür (“Ödeme kaydedilemiyorsa bir e-posta gönder”). Kapak tarafında, Ödeme servisiyle alay edip doğru JavaScript türleriyle çağrıldığından emin olursanız - o zaman testiniz, uygulama işlevselliği ile hiçbir ilgisi olmayan ve sık sık değişmesi muhtemel olan dahili şeylere odaklanır.

Aksi takdirde: Herhangi bir kodun yeniden düzenlenmesi, koddaki tüm dalgaları aramayı ve buna göre güncellemeyi zorunlu kılar. Testler yardımcı bir arkadaş olmaktan ziyade bir yük haline geldi

Anti-patern örneği: Dahili ağlara odaklanmak

Doğru Yapıyor Örnek: casuslar gereksinimleri sınamaya odaklanmış ancak yan etki kaçınılmaz olarak içsellere dokunuyor

6.️ 6. “Foo” yapmayın, gerçekçi girdi verisini kullanın

Yapın: Genellikle üretim hataları çok özel ve şaşırtıcı bir girdi altında ortaya çıkar - test girişi ne kadar gerçekçi olursa, böcekleri erken yakalamak için o kadar büyük olasılıklar olur. Üretim verilerinin çeşitliliğine ve biçimine benzeyen sahte gerçek veriler üretmek için Faker gibi özel kütüphaneler kullanın. Örneğin, bu tür kütüphaneler rastgele fakat gerçekçi telefon numaraları, kullanıcı adları, kredi kartı, şirket adları ve hatta “lorem ipsum” metni üretecektir. Üretim ortamınızdan gerçek verileri almayı ve testlerinizde kullanmayı düşünün. Bir sonraki seviyeye almak ister misiniz? Bir sonraki madde işaretine bakın (özellik tabanlı test)

Aksi taktirde: “Foo” gibi sentetik girdiler kullandığınızda tüm geliştirme testleriniz yeşil renkte görünecek, ancak bir bilgisayar korsanı “@ 3e2ddsf” gibi kötü bir dizeye girdiğinde üretim kırmızıya dönebilir. ## ’1 fdsfds. fds432 AAAA ”

-Anti-Pattern Örneği: Gerçekçi olmayan verilerden geçen bir test paketi

☺Doing It Right Örnek: Gerçekçi girdiyi randomize etme

7. Özellik tabanlı testi kullanarak birçok giriş kombinasyonunu test edin

Yapın: Genellikle her test için birkaç giriş örneği seçeriz. Giriş formatı gerçek dünyadaki verilere benzese bile (bakınız 'Foo yapma' mermi), sadece birkaç giriş kombinasyonunu kapsar (yöntem ('', doğru, 1), yöntem (“string”, false ”, 0) Ancak, üretimde 5 parametreli bir API binlerce farklı permütasyon ile çağrılabilir, bunlardan biri işlemlerimizi durdurabilir (bkz. Fuzz Testleri). Otomatik olarak farklı girişlerin 1000 permütasyonunu gönderen ve kodumuzun hangi giriş için doğru cevabı veremediğini tespit eden tek bir test yazabilirseniz? Özellik temelli test, tam olarak bunu yapan bir tekniktir: Test edilen ünitenize tüm olası giriş kombinasyonlarını test ederek bir hata bulma hükmünü artırır. Örneğin, bir yöntem verildiğinde - addNewProduct (id, name, isDiscount) - destekleyici kitaplıklar bu yöntemi (1, “iPhone”, false), (2, “Galaxy” gibi birçok (sayı, string, boolean) birleşimi ile çağırır. ", doğru). Js-doğrulama veya testcheck (çok daha iyi belgeler) gibi kütüphaneleri kullanarak en sevdiğiniz test çalıştırıcınızı (Mocha, Jest, vb.) Kullanarak özellik tabanlı testler yapabilirsiniz. Güncelleme: Nicolas Dubien, bazı ek özellikler sunan ve aynı zamanda aktif bir şekilde korunacak gibi görünen hızlı check-out işlemini yapmak için aşağıdaki yorumlarda bulundu.

Aksi halde: Bilinçsiz olarak, yalnızca iyi çalışan kod yollarını kapsayan test girişlerini seçersiniz. Ne yazık ki, bu hataların açığa çıkması için bir araç olarak testlerin verimliliğini azaltır

☺ Doğru Yapma Örneği: “mocha-testcheck” ile birçok giriş izinlerini test etme

8.️ 8. Testte kalın: Dış yardımcıları ve soyutlamaları en aza indirin

“Yapın: Şimdiye kadar, muhtemelen basit ve basit testler için savunuculuk yapıyorum: Ekip kodu anlamak için zihinsel bir çaba gerektiren başka bir yazılım projesine parası yetmiyor. Michael Lync, büyük yazısında bunu şöyle açıklıyor:

İyi üretim kodu iyi faktörlüdür; iyi bir test kodu açık… Bir test yazdığınızda, test aralığını görecek bir sonraki geliştiriciyi düşünün. Test grubunuzun tamamını okumak istemiyorlar ve kesinlikle bir kalıtım testi yardımcı programları ağacını okumak istemiyorlar.

Okuyucunun testten çıkmadan tüm hikayeyi edinmesine izin verin, kullanımları, kancaları veya bir test durumu üzerindeki dış etkileri en aza indirin. Çok fazla tekrar ve kopya yapıştırma? Tamam, bir test bir dış yardımcı ile bırakılabilir ve açık kalabilir. Ancak üç ve dört yardımcı ve kancaya doğru büyüdüğünde, karmaşık bir yapının yavaşça oluştuğunu ima eder.

Aksi halde: Test paketi başına 4 yardımcı ile aniden kendinizi 2'si temel kullanım alanlarından, birçok kurulumdan ve yırtma kancalarından mi buldun? kutlama, daha yeni bir başka zorlu projeyi kazandınız, kısa zamanda test takımınıza karşı testler yazabilirsiniz.

Anti-Patern Örneği: Fantezi ve dolaylı test yapısı. Dış bağımlılıklara gitmeden test durumunu anlıyor musunuz?

☺ Doğru Yapma Örnek: Farklı dosyalar arasında dolaşmadan anlayabileceğiniz bir test

9.️ 9. Global test fikstürlerinden ve tohumlarından kaçının, test başına veri ekleyin

Yapın: Altın kuralına göre (madde işareti 0), her testin eşleşmeyi önlemek ve test akışıyla ilgili kolay bir nedeni olması için kendi DB satırlarını eklemeli ve hareket etmelidir. Gerçekte, bu durum performans iyileştirme uğruna testleri çalıştırmadan önce (“test fikstürü” olarak da bilinir) DB'yi veri ekleyen test uzmanları tarafından ihlal edilir. Performans gerçekten geçerli bir endişe olsa da - hafifletilebilir (bakınız “Bileşen testi” mermisi), ancak test karmaşıklığı çoğu zaman diğer düşünceleri yönetmesi gereken çok acı verici bir üzüntüdür. Pratik olarak, her test senaryosuna açıkça ihtiyaç duyduğu DB kayıtlarını ekleyin ve yalnızca bu kayıtlara göre işlem yapın. Performans kritik bir endişe haline gelirse - veride mutasyona uğramamış tek test grubunun tohumlanması şeklinde dengeli bir uzlaşma olabilir (örneğin, sorgular)

Wise Aksi halde: Birkaç test başarısız olur, bir dağıtım iptal edilir, ekibimiz şimdi değerli zaman geçirecek, bir böcek mi yaşıyoruz? Araştıralım, oh hayır - iki tohum aynı tohum verilerini değiştiriyor gibi görünüyor

Pattern Anti Pattern Örneği: testler bağımsız değildir ve global DB verilerini beslemek için bazı küresel kancalara güvenir

☺ Doğru Yapma Örnek: Testin içinde kalabiliriz, her test kendi veri kümesi üzerinde hareket eder

10. Hata yapmayın, bekleyin

Yap: Bazı girdilerin bir hata tetiklediğini iddia etmeye çalışırken, try-catch-finally kullanmak ve catch yan tümcesinin girildiğini iddia etmek doğru görünebilir. Sonuç, basit test amacını ve sonuç beklentilerini gizleyen garip ve ayrıntılı bir test durumudur (aşağıdaki örnek)

Daha şık bir alternatif, tek satırlık özel Chai iddiasını kullanmaktır: bekliyor (yöntem) .to.row (veya Jest: bekliyor (yöntem) .toThrow ()). İstisnayı, hata türünü söyleyen bir özellik içerdiğinden emin olmak kesinlikle zorunludur, aksi halde, uygulamanın kullanıcıya hayal kırıklığı yaratan bir mesaj göstermekten çok yapamayacağı genel bir hata verildiğinde

Aksi takdirde, test raporlarından (örneğin CI raporları) neyin yanlış gittiğini anlamak zor olacaktır.

Anti-patern Örneği: try-catch ile hatanın varlığını iddia etmeye çalışan uzun bir test durumu

☺ Doğru Yapma Örneği: Kolaylıkla anlaşılabilecek, belki QA veya teknik PM tarafından bile anlaşılabilecek insanca okunabilir bir beklenti.

️10. Testlerinizi etiketleyin

Yapın: Farklı testler farklı senaryolarda yapılmalıdır: hızlı duman, IO'suz, geliştirici bir dosyayı kaydettiğinde veya gönderdiğinde testler yapılmalı, genellikle yeni bir çekme isteği gönderildiğinde baştan sona tam testler vb. Testleri #cold #api #sanity gibi anahtar kelimelerle etiketleyerek elde edilebilir, böylece test kablo demeti ile aşınabilir ve istediğiniz alt seti çağırabilirsiniz. Örneğin, bu sadece Mocha: akıl sağlığı test grubunu nasıl çağırırsınız: mocha - grep ‘akıl sağlığı '

Aksi taktirde: Bir geliştiricinin küçük bir değişiklik yaptığı herhangi bir zamanda, onlarca DB sorgusu yapan testler de dahil olmak üzere tüm testleri yapmak son derece yavaş olabilir ve geliştiricileri testleri çalıştırmadan uzak tutar

Doğru Yapma Örnek: Testleri "# cold-test" olarak etiketlemek, test çalıştırıcısının yalnızca hızlı testler yapmasına izin verir (Cold === G / Ç yapmayan hızlı testler ve geliştirici yazarken bile sık sık gerçekleştirilebilir)

11. Diğer genel iyi test hijyeni

Yap: Bu gönderi, Node JS ile ilgili olan veya en azından örneklendirilebilecek test önerileri üzerine odaklanmıştır. Bununla birlikte, bu madde, iyi bilinen ve Düğümle ilgili olmayan birkaç ipucunu gruplar.

TDD prensiplerini öğrenin ve uygulayın - birçokları için son derece değerlidir, ancak tarzınıza uymuyorsa bunlardan korkmazsınız, yalnızca siz değilsiniz. Testleri koddan önce kırmızı-yeşil-refactor tarzında yazmayı düşünün, bir hata bulduğunuzda her testin bir şeyi tam olarak kontrol etmesini sağlayın - gelecekte bu hatayı algılayacak bir test yazmadan önce her testin başarısız olmasına izin verin yeşile dönmeden önce, çevreye bağımlılıktan kaçının (yollar, işletim sistemleri vb.)

Wise Aksi takdirde: Yıllarca toplanan bilgelik incilerini özleyeceksin

*** Bölüm : Test Türleri ***

12.️ 12. Test portföyünüzü zenginleştirin: Birim testlerin ve piramidin ötesine bakın

Yap: Test piramidi, 10 yaşında olmasına rağmen, üç test türü öneren ve çoğu geliştiricinin test stratejisini etkileyen harika ve alakalı bir modeldir. Aynı zamanda, bir avuç dolusu fazla sayıda yeni test tekniği ortaya çıktı ve test piramidinin gölgelerinde saklanıyor. Son 10 yılda gördüğümüz tüm dramatik değişiklikler göz önüne alındığında (Mikroservisler, bulut, sunucusuz), oldukça eski bir modelin tüm * uygulama türlerine * uygun olması mümkün mü? Test dünyası yeni test teknikleriyle karşılaşmayı düşünmüyor mu?

Beni yanlış anlama, 2019'da test piramidi, TDD ve ünite testleri hala güçlü bir teknik ve muhtemelen birçok uygulama için en uygun olanı. Sadece diğer tüm modellerde olduğu gibi, kullanışlılığına rağmen bazen yanlış olması gerekir. Örneğin, birçok olayı Kafka / RabbitMQ gibi bir mesaj veri yoluna alan ve daha sonra bazı veri ambarlarına akan ve sonunda bazı analitik kullanıcı arayüzleri tarafından sorgulanan bir IOT uygulamasını düşünün. Test bütçemizin% 50'sini, entegrasyon odaklı ve neredeyse hiç mantığı olmayan bir uygulama için birim testleri yazmaya harcamalı mıyız? Uygulama türlerinin çeşitliliği arttıkça (botlar, kripto, Alexa becerileri) test piramidinin en iyi uymadığı senaryoları bulma şansı artar.

Test portföyünüzü zenginleştirme ve daha fazla test türünü tanıma zamanı (sonraki mermiler birkaç fikir öneriyor), test piramidi gibi akıl modelleri, aynı zamanda karşılaştığınız gerçek dünya sorunlarıyla test türlerini eşleştirin ('Merhaba, API'mız kırıldı, tüketici güdümlü sözleşme testi yazalım! '), testlerinizi risk analizine dayalı bir portföy oluşturan bir yatırımcı gibi çeşitlendirin - sorunların ortaya çıkabileceği yerleri değerlendirin ve bu potansiyel riskleri azaltmak için bazı önleme önlemlerini eşleştirin

Dikkatli bir kelime: Yazılım dünyasındaki TDD argümanı tipik bir yanlış-dikotomi yüze bürünüyor, bazıları onu her yerde kullanmak için vaaz veriyor, bazıları onun şeytan olduğunu düşünüyor. Mutlak olarak konuşan herkes yanlıştır:]

Wise Aksi takdirde: Bazı Fuzz, tiftik ve mutasyon gibi inanılmaz yatırım getirisine sahip bazı araçları kaçıracaksınız ve mutasyon 10 dakikada değer sağlayabilir

☺ Doğru Yapma Örnek: Cindy Sridharan, “Test Microservices - aklı başında” adlı muhteşem yazısında zengin bir test portföyü önerdi

Örnek: YouTube: “Birim Testlerinin Ötesinde: 5 Parlak Düğüm.JS Test Türleri (2018)” (Yoni Goldberg)

Yoni Goldberg'den 5 parlak test tekniği

13.️ 13. Bileşen testi sizin en iyi işiniz olabilir

Yapın: Her birim testi uygulamanın küçük bir bölümünü kapsar ve bütünün kapsanması pahalıdır, uçtan uca testler çok fazla zemini kaplar ancak lapa lapa ve yavaştır, neden dengeli bir yaklaşım uygulamıyor ve testler yazıyor? ünite testlerinden daha büyük ancak uçtan uca testten daha küçüktür? Bileşen testi, test dünyasının ünlü şarkısıdır - her iki dünyanın da en iyisini sunarlar: makul performans ve TDD kalıplarını uygulama olanağı + gerçekçi ve mükemmel kapsama.

Bileşen testleri, Microservice 'ünitesine' odaklanır, API'ye karşı çalışırlar, Microservice'in kendisine ait hiçbir şeyle dalga geçmezler (örneğin gerçek DB veya en azından bu DB'nin bellekteki sürümü) diğer Microservices'a yapılan aramalar gibi. Bunu yaparak, ne yaydığımızı test ederiz, uygulamaya dışarıdan içeriye doğru yaklaşır ve makul bir sürede büyük bir güven kazanırız.

Wise Aksi taktirde, yalnızca% 20 sistem kapsama alanına sahip olduğunuzu bulmak için birim testleri yazmak için uzun günler geçirebilirsiniz.

☺ Doğru Yapma Örnek: Supertest, Express API'ye işlem sırasında yaklaşmayı sağlar (hızlı ve birçok katmanı kapsar).

14.️ 14. Yeni sürümlerin, tüketici odaklı sözleşmeler kullanarak API'yi bozmadığından emin olun

Yapın: Yani, Microservice'inizde birden fazla müşteri var ve uyumluluk nedenleriyle (herkesi mutlu etmek için) hizmetin birden çok sürümünü çalıştırıyorsunuz. O zaman biraz tarlayı değiştirip ‘‘ ’!’, Bu alana güvenen bazı önemli müşteriler sinirli. Bu, entegrasyon dünyasının Catch-22'sidir: Sunucu tarafının tüm çoklu müşteri beklentilerini göz önünde bulundurması çok zordur - Diğer taraftan, istemciler herhangi bir test yapamazlar çünkü sunucu yayınlanma tarihlerini kontrol eder. Tüketici odaklı sözleşmeler ve PACT çerçevesi bu süreci çok yıkıcı bir yaklaşımla resmileştirmek için doğdu - sunucu kendi test planını tanımlamıyor, müşteri… sunucunun testlerini tanımlıyor! PACT, müşteri beklentilerini kaydedebilir ve “komisyoncu” olarak paylaşılan bir yere koyabilir, böylece sunucu beklentileri çekebilir ve kırılmış sözleşmeleri (karşılanmayan bir müşteri beklentisi) tespit etmek için PACT kitaplığını kullanarak her yapıyı çalıştırabilir. Bunu yaparak, tüm sunucu-istemci API uyumsuzlukları build / CI sırasında erken yakalanır ve size büyük bir hayal kırıklığı kazandırabilir

Wise Aksi takdirde: Alternatifler manuel test veya dağıtım korkusunu tüketiyor

☺ Doğru Yapıyor Örnek:

15.️ 15. Orta katmanlarınızı yalıtımlı olarak test edin.

Yapın: Çoğu, Middleware testinden kaçınıyor, çünkü bunlar sistemin küçük bir bölümünü temsil ediyor ve canlı bir Express sunucusu gerektiriyor. Her iki neden de yanlış - Middlewares küçük ancak isteklerin tümünü veya çoğunu etkiler ve {req, res} JS nesnelerini alan saf işlevler olarak kolayca test edilebilir. Bir ara katman fonksiyonunu test etmek için, bir kişinin onu çağırması ve fonksiyonun doğru eylemi gerçekleştirmesini sağlamak için {req, res} nesneleriyle etkileşime girmesi gerekir (örneğin Sinon kullanarak). Node-mock-http kütüphanesi daha da ileri götürür ve {req, res} nesnelerini davranışlarını gözetleme ile birlikte etkiler. Örneğin, res nesnesinde ayarlanmış olan http durumunun beklenti ile eşleşip eşleşmediğini gösterebilir (Aşağıdaki örneğe bakınız).

Wise Aksi halde: Express middleware içindeki bir hata === tüm veya çoğu isteklerde bir hata

☺ Doğru Yapma Örnek: Arayüz yazılımını ağ araması yapmadan ve tüm Express makinesini uyandırmadan tecrit ederek test etme

16.️ 16. Statik analiz araçlarını kullanarak ölçüm ve refaktör

Yapın: Statik analiz araçlarını kullanmak, kod kalitesini iyileştirmek ve kodunuzu sürdürülebilir tutmak için nesnel yollar sağlayarak yardımcı olur. Kod kokularını bulduğunda iptal etmek için CI derlemenize statik analiz araçları ekleyebilirsiniz. Düz astarlama üzerindeki ana satış noktaları, kaliteyi birden fazla dosya bağlamında (örneğin kopyaları tespit etmek) kontrol etmek, gelişmiş analizler yapmak (örneğin, kod karmaşıklığı) ve kod sorunlarının tarihçesini ve ilerlemesini takip etme yeteneğidir. Kullanabileceğiniz iki araç örneği Sonarqube (2.600+ yıldız) ve Code Climate (1.500+ yıldız)

Kredi: Keith Holliday

Aksi takdirde: Düşük kod kalitesiyle, hatalar ve performans her zaman parlak yeni bir kitaplığın veya son teknoloji özelliklerin düzeltemeyeceği bir sorun olacaktır.

☺ Doğru Yapma Örnek: CodeClimat, karmaşık yöntemleri tanımlayabilen ticari bir araç:

17.️ 17. Düğüm ile ilgili kaos için hazır olduğunuzu kontrol edin

Yapın: Tuhaf bir şekilde, çoğu yazılım testi yalnızca mantık ve verilerle ilgilidir, ancak gerçekleşen en kötü şeylerden bazıları (ve hafifletilmesi gerçekten zordur) altyapı sorunlarıdır. Örneğin, işlem belleğiniz aşırı yüklendiğinde veya sunucu / işlem öldüğünde ya da API% 50 yavaşladığında izleme sisteminiz fark etti mi, hiç test ettiniz mi? Bu tür kötü şeyleri test etmek ve azaltmak için - Kaos mühendisliği Netflix tarafından doğdu. Kaotik konular için bizim uygulama esnekliğimizi test etmek için farkındalık, çerçeveler ve araçlar sağlamayı amaçlamaktadır. Örneğin, ünlü araçlarından biri olan kaos maymunu, hizmetlerimizin hala kullanıcılara hizmet verebilmesi için tek bir sunucuya güvenmemesini sağlamak için rasgele sunucuları öldürür (ayrıca, baklaları öldüren bir Kubernetes sürümü, kube-maymun da vardır). Tüm bu araçlar barındırma / platform düzeyinde çalışır, ancak Düğüm işleminizin yakalanmayan hatalarla nasıl başa çıktığını, işlenmemiş söz reddini, v8 belleğin 1.7 GB'a izin verilen maksimum değerle aşırı yüklenip yüklenmediğini kontrol etmek gibi ya da test etmek istiyorsanız olay döngüsü sık sık engellendiğinde UX'iniz tatmin edici kalıyor mu? Bunu ele almak için, Düğümle ilgili her tür kaotik eylemi sağlayan, düğüm-kaosu (alfa) yazdım.

Aksi halde: Buradan kaçış yok, Murphy’nin yasası prodüksiyonunuzu merhametsizce vuracak

☺ Doğru Yapın Örnek: Node-chaos her tür Node.js şakasını oluşturabilir, böylece uygulamanızın kaos için ne kadar esnek olduğunu test edebilirsiniz.

*** Bölüm : Test Etkinliğini Ölçme ***

18.️ 18. Kendine güvenmek için yeterli kapsama alın, ~% 80 şanslı sayılar gibi görünüyor

Yapın: Testin amacı hızlı hareket etmek için yeterince güven sağlamaktır, açıkçası kod ne kadar fazla test edilirse takımın o kadar güvende olduğu da test edilir. Kapsam, testlerle kaç kod satırına (ve dallara, tablolara vb.) Ulaşıldığının bir ölçüsüdür. Peki, bu ne kadar yeter? % 10–30, yapı doğruluğu hakkında herhangi bir fikir sahibi olmak için çok düşük, diğer taraftan% 100 çok pahalı ve odak noktanızı kritik yollardan kodun egzotik köşelerine kaydırabilir. Uzun cevap, uygulamanın türü gibi birçok faktöre bağlı olduğudur - eğer bir sonraki nesil Airbus A380 modelini% 100'den fazla bir zorunluluktur, bir çizgi film web sitesi% 50 çok fazla olabilir. Test meraklılarının çoğu, hak kapsamı eşiğinin içeriğe dayalı olduğunu iddia etmelerine rağmen, çoğu, çoğu uygulamanın çoğunu yerine getirmesi gereken bir kuralın baş parmağı olarak% 80’den (Fowler: “üst 80’lerde veya 90’larda”) bahseder. .

Uygulama ipuçları: Sürekli entegrasyonunuzu (CI) bir kapsama eşiğine (Jest bağlantısı) sahip olacak şekilde yapılandırmak ve bu standarda uymayan bir yapıyı durdurmak isteyebilirsiniz (ayrıca bileşen başına eşiği yapılandırmak da mümkündür, aşağıdaki kod örneğine bakın) . Bunun üzerine, derleme kapsamı düşüşünün (yeni işlenen bir kodun kapsamı daha az olduğunda) tespit etmeyi düşünün - bu, geliştiricilerin test kodunu artırmaya veya en azından korumasına neden olur. Bunların hepsi, kapsama, testinizin sağlamlığını söylemek için yeterli olmayan, yalnızca bir ölçü, nicel temelli bir ölçüdür. Ayrıca sonraki mermilerde gösterildiği gibi kandırabilirsin

Aksi taktirde: Güven ve sayılar, sistemin çoğunu test ettiğinizi bilmeden, el ele gider - ayrıca biraz korku olacaktır. ve korku sizi yavaşlatacak

☺ Örnek: Tipik bir kapsama raporu

İstanbul kapsama raporu

☺ Doğru Yapma Örnek: Her bileşen için kapsama alanı ayarlama (Jest kullanarak)

İçerik kapsamı

19. Test edilmemiş alanları ve diğer tuhaflıkları tespit etmek için teminat raporlarını inceleyin

Yap: Bazı konular radarın hemen altına gizlice giriyor ve geleneksel araçları kullanarak bulmak gerçekten zor. Bunlar gerçekten böcek değil, ciddi bir etkiye sahip olabilecek şaşırtıcı uygulama davranışlarıdır. Örneğin, çoğu zaman bazı kod alanları hiçbir zaman ya da nadiren çağrılmaz - 'PricingCalculator' sınıfının her zaman ürün fiyatını belirlediğini düşündünüz, ancak DB'de 10000 ürün olmasına ve çok sayıda satış olmasına rağmen aslında hiç çalıştırılmadığını düşündünüz ... Kod kapsamı raporlar, uygulamanın inandığınız gibi davranıp davranmadığını fark etmenize yardımcı olur. Bunun dışında, hangi kod türlerinin test edilmediğinin de altını çizebilir - kodun% 80'inin test edildiğinin bildirilmesi kritik parçaların kapsanıp kapsanmadığını söylemez. Rapor oluşturmak kolaydır - uygulamanızı yalnızca üretimde veya kapsam takibi ile test ederken çalıştırın ve ardından her bir kod alanının ne sıklıkta kullanıldığını vurgulayan renkli raporları görün. Bu verilere göz atmak için zaman ayırırsanız, bazı sonuçlara ulaşabilirsiniz.

Aksi halde: Kodunuzun hangi bölümlerinin test edilmeden bırakıldığını bilmiyorsanız, sorunların nereden gelebileceğini bilmiyorsunuz.

Pattern Anti-Pattern Örneği: Bu kapsama raporunda yanlış olan ne? QA'daki uygulama kullanımımızı takip ettiğimiz ve ilginç giriş kalıplarını bulduğumuz gerçek dünya senaryosuna dayanarak (İpucu: giriş başarısızlıklarının oranı orantılı değildir, bir şeyler açıkça yanlıştır. arka uç giriş API'si)

20. Mutasyon testini kullanarak mantıksal kapsamı ölçün

Yapın: Geleneksel Kapsama metriği genellikle yalan söyler: Size% 100 kod kapsamı gösterebilir, ancak işlevlerinizden hiçbiri bile değil, doğru yanıtı verir. Nasıl olur? yalnızca testin hangi kod satırlarını ziyaret ettiğini ölçmektedir, ancak testlerin doğru bir yanıt için iddia edilen herhangi bir şeyi gerçekten test edip etmediğini kontrol etmemektedir. İş için seyahat eden ve pasaport damgalarını gösteren biri gibi - bu, yapılan hiçbir işi kanıtlamaz, yalnızca birkaç havaalanını ve oteli ziyaret ettiğini gösterir.

Mutasyona dayalı testler, yalnızca TAVSİYE EDİLMEMİŞ olan TEST EDİLEN kod miktarını ölçerek yardımcı olmak için burada. Stryker, mutasyon testi için bir JavaScript kütüphanesidir ve uygulaması gerçekten temizdir:

(1) kasıtlı olarak kodu ve “bitkilerdeki böcekleri” değiştirir. Örneğin, newOrder.price === 0 kodu newOrder.price! = 0 olur. Bu "böcek" mutasyonlar denir

(2) testleri gerçekleştirir, eğer başarılı olursa o zaman bir sorunumuz var demektir - testler böcekleri bulma amacına hizmet etmedi, mutasyonlar hayatta kalmaya devam ediyor. Testler başarısız olursa, o zaman harika, mutasyonlar öldürüldü.

Mutasyonların hepsinin veya çoğunun öldürüldüğünü bilmek, geleneksel kapsamdan çok daha fazla güven verir ve kurulum süresi benzerdir.

Wise Aksi takdirde,% 85’in kapsamının, testinizin kodunuzun% 85’inde hataları algılayacağı anlamına geldiğine inanmaktan alıkoyacaksınız.

Anti Desen Örneği:% 100 koruma,% 0 test

Doğru Yapma Örnek: Mutasyon testi için bir araç olan Stryker raporlar, test edilmemiş kod miktarını algılar ve sayar (Mutasyonlar)

Stryker raporu - Mutasyonların hepsinin veya çoğunun öldürüldüğünü bilmek, geleneksel kapsamdan çok daha fazla güven verir ve kurulum süresi benzerdir

*** Bölüm : CI ve Diğer Kalite Önlemleri ***

21.️ 21. Astarlarınızı zenginleştirin ve astarlama sorunları olan yapıları iptal edin

Yapın: Linerler ücretsiz bir öğle yemeğidir, 5 dakikalık bir kurulumla, kodunuzu koruyan ve yazarken önemli bir konuyu yakalayan ücretsiz bir otomatik pilotluk alırsınız. Astarın kozmetikle ilgili olduğu günler geride kaldı (noktalı virgül yok!). Günümüzde, Linters doğru atılmayan ve bilgi kaybedilen hatalar gibi ciddi sorunları yakalayabilir. Temel kurallar kümenizin (ESLint standardı veya Airbnb stili gibi) üstüne, iddialar olmadan testleri keşfedebilen eslint-plugin-chai-wait gibi bazı uzmanlaşan Bağlantıları dahil etmeyi düşünün; kod asla devam etmeyecektir), DOS saldırıları için kullanılabilecek istekli regex ifadelerini keşfedebilen eslint-plugin-güvenliği ve kod, yardımcı program kütüphanesi yöntemlerini kullandığında eslint-plugin-you-dont-need-lodash-undercore'yu endişe edebilir Lodash._map (…) gibi V8 çekirdek yöntemlerinin bir parçası olan

Aksi takdirde, üretiminizin düşmeye devam ettiği yağmurlu bir gün düşünün, ancak günlükler hata yığını izlemesini göstermez. Ne oldu? Kodunuz yanlışlıkla hata yapmayan bir nesneyi attı ve yığın izi kayboldu, kafanızı bir tuğla duvara çarpmanızın iyi bir nedeni. 5 dakikalık bir linter kurulumu bu TYPO'yu tespit edebilir ve gününüzü kurtarır

Pattern Anti Pattern Örneği: Yanlış Error nesnesi yanlışlıkla atıldı, bu hata için yığın izi görünmeyecek. Neyse ki, ESLint bir sonraki üretim hatasını yakaladı

Yanlış Hata nesnesi yanlışlıkla atıldı, bu hata için yığın izi görünmüyor. Neyse ki, ESLint bir sonraki üretim hatasını yakaladı

22.️ 22. Yerel geliştirici-CI ile geribildirim döngüsünü kısaltın

Yapın: Test, çizgilendirme, güvenlik açıkları kontrolü vb. Gibi parlak kalite denetimlerinde bir CI kullanmak? Geliştiricilerin anında geri bildirim istemek ve geri bildirim döngüsünü kısaltmak için bu boru hattını yerel olarak da çalıştırmasına yardımcı olun. Neden? Verimli bir test süreci birçok ve yinelemeli döngüden oluşur: (1) deneyler -> (2) geribildirim -> (3) refaktör. Geribildirim ne kadar hızlı olursa, bir geliştiricinin modül başına gerçekleştirebileceği iyileştirme yinelemeleri o kadar fazla olur ve sonuçları mükemmelleştirir. Kapakta, geri bildirim geç geldiğinde daha az iyileştirme tekrarlaması tek bir güne paketlenebilirdi, takım zaten başka bir konuya / göreve / modüle ilerleyebilir ve bu modülü iyileştirmek için çalışmayabilir.

Pratik olarak, bazı CI satıcıları (Örnek: CircleCI load CLI) boru hattının yerel olarak çalıştırılmasına izin verir. Wallaby gibi bazı ticari araçlar, geliştirici prototipi olarak çok değerli ve test öngörüleri sağlar (üyelik yok). Alternatif olarak, tüm kalite komutlarını çalıştıran paket.json'a npm betiğini ekleyebilirsiniz (örneğin, test, tüysüz, güvenlik açıkları) - eşzamanlı olarak paralelleştirme için araçlar kullanın ve araçlardan biri başarısız olursa sıfır olmayan kod kullanın. Şimdi geliştirici sadece bir komut çağırmalıdır - örn. ‘Npm çalışma kalitesi’ - anında geri bildirim almak için. Ayrıca bir githook kullanarak kalite kontrolünün başarısız olması durumunda bir taahhütten vazgeçmeyi düşünün (husky yardımcı olabilir)

Wise Aksi taktirde: Kalite sonuçları koddan bir gün sonra geldiğinde, testler aslında resmi bir eserden sonra gelişimin akıcı bir parçası haline gelmez

☺ Doğru Yapma Örnek: Kod kalitesi denetimi yapan npm komut dosyaları, tümü isteğe bağlı olarak veya bir geliştirici yeni kodu zorlamaya çalışırken paralel olarak çalıştırılır

23. Gerçek bir üretim aynası üzerinde e2e testi yapın

Yapın: Uçtan uca (e2e) testi, her CI boru hattının ana zorluğudur - anında ilgili tüm bulut hizmetleri ile aynı geçici bir üretim aynası oluşturmak sıkıcı ve pahalı olabilir. En iyi uzlaşmayı bulmak sizin oyununuz: Docker-compose, yalıtılmış docker ortamını tek bir düz metin dosyası kullanarak aynı kaplarla oluşturmanıza olanak tanır, ancak destek teknolojisi (örneğin ağ oluşturma, dağıtım modeli) gerçek dünyadaki yapımlardan farklıdır. Gerçek AWS servislerinin bir saplamasıyla çalışmak için "AWS Yerel" ile birleştirebilirsiniz. Sunucusuz olduysanız sunucusuz ve AWS SAM gibi çoklu çerçeveler yerel Faas kodunu çağırmanıza izin verir.

Devasa Kubernetes eko sistemi henüz yerel ve CI-aynalama için standart bir uygun araç resmi hale getirmedi, ancak birçok yeni araç sıkça piyasaya sürüldü. Bir yaklaşım, Minikube ve MicroK8'ler gibi araçları kullanarak gerçek bir şeye benzeyen, sadece daha az ek yük ile gelen bir “minimize edilmiş Kubernetes” kullanmaktır. Diğer bir yaklaşım, uzak bir “gerçek Kubernet'ler” üzerinde test etmektir, bazı CI sağlayıcıları (örn. Codefresh) Kubernetes ortamı ile yerel entegrasyona sahiptir ve CI boru hattını gerçek bir şey üzerinde çalıştırmayı kolaylaştırır, diğerleri uzak bir Kubernet'lere karşı özel komut dosyası oluşturmaya izin verir.

Aksi takdirde, üretim ve test talepleri için farklı teknolojilerin kullanılması, iki dağıtım modelinin korunmasını sağlar ve geliştiricileri ve ops ekibini ayrı tutar

Örnek: Anında Kubernetes kümesi üreten bir CI boru hattı (Kredi: Dinamik ortamlar Kubernetes)

dağıtmak:
sahne: dağıt
image: registry.gitlab.com/gitlab-examples/kubernetes-deploy
senaryo:
- ./configureCluster.sh $ KUBE_CA_PEM_FILE $ KUBE_URL $ KUBE_TOKEN
- kubectl ns $ NAMESPACE oluştur
- kubectl gizli -n $ NAMESPACE liman işçisi-kayıt defteri gitlab-kayıt defteri --docker-server = "$ CI_REGISTRY" --docker-kullanıcı adı = "$ CI_REGISTRY_USER" --docker-password = "$ CI_REGISTRY_ASSER" "$ GITLAB_USER_EMAIL"
- mkdir .generated
- echo "$ CI_BUILD_REF_NAME- $ CI_BUILD_REF"
- sed -e "s / TAG / $ CI_BUILD_REF_NAME- $ CI_BUILD_REF / g" şablonlar / deals.yaml | tee ".generated / deals.yaml"
- kubectl uygula - isim alanı $ NAMESPACE -f .generated / deals.yaml
- kubectl uygula - isim alanı $ NAMESPACE -f templates / my-sock-shop.yaml
Çevre, ortam:
adı: ci için test

24.️ 24. Test yürütmesini paralelleştir

Yap: Doğru yapıldığında, test hemen hemen geri bildirim sağlayan 24/7 arkadaşınızdır. Uygulamada, 500 CPU'ya bağlı birim testinin tek bir diş üzerinde yapılması çok uzun sürebilir. Neyse ki, modern test koşucuları ve CI platformları (Jest, AVA ve Mocha eklentileri gibi) testi çoklu işlemlere paralel hale getirebilir ve geri bildirim süresinde önemli iyileşmeler sağlayabilir. Bazı CI satıcıları, geri besleme döngüsünü daha da kısaltan konteynerler (!) Arasındaki testleri de paralelleştirir. Yerel olarak birden fazla işlem üzerinde veya birden fazla makine kullanan bazı bulut CLI'larında - her biri farklı işlemlerde çalışabileceğinden testlerin özerk kalması için talebi paralel hale getirme

Wise Aksi takdirde, bir sonraki özellikleri kodladığınız için, yeni kodu girdikten 1 saat sonra test sonuçlarının alınması, testi daha az ilgili hale getirmek için mükemmel bir reçetedir

Doğru Yapıyor Örnek: Mocha paralel ve Jest, test paralelleştirmesi sayesinde geleneksel Mocha'dan kolayca çıktı (Credit: JavaScript Test-Runners Benchmark)

25.️ 25. Lisans ve intihal kontrolünü kullanarak yasal sorunlardan uzak durun

Yapın: Ruhsatlandırma ve intihal sorunları şu anda büyük olasılıkla sizin temel endişeniz değil, neden 10 dakika içinde bu kutuyu işaretlemiyorsunuz? Lisans kontrolü ve intihal kontrolü (ücretsiz planlı ticari) gibi bir dizi npm paketi CI boru hattınıza kolayca eklenebilir ve Stackoverflow'tan kopyalanan ve kısıtlayıcı lisanslara sahip olan bağımlılıklar veya Stackoverflow'tan kopyalanan kodlar gibi acıları muayene edebilir.

Aksi takdirde: İstemciler istemeden, uygunsuz lisanslara sahip paketleri kullanabilir veya ticari kodu kopyalayıp yapıştırabilir ve yasal sorunlara neden olabilir

Doğru Yapıyor Örnek:

// lisans denetleyicisini CI ortamınıza veya yerel olarak yükleyin
npm kurulum -g lisans denetleyicisi
// tüm lisansları taramasını isteyin ve yetkisiz bir lisans bulduysa 0 dışındaki çıkış koduyla başarısız olun. CI sistemi bu hatayı yakalamalı ve yapıyı durdurmalıdır
lisans denetleyicisi - özet - failOn BSD

️26. Korunmasız bağımlılıkları sürekli inceleyin

Yap: Express gibi en saygın bağımlılıkların bile güvenlik açıkları vardır. Bu, npm denetimi gibi topluluk araçlarını veya snyk gibi ticari araçları kullanarak kolayca evcilleştirilebilir (ayrıca ücretsiz bir topluluk sürümü sunar). Her ikisi de CI’nizden her yapıda çağrılabilir

Aksi takdirde: Kodunuzu özel araçlar olmadan güvenlik açıklarından uzak tutmak, yeni tehditlerle ilgili çevrimiçi yayınları sürekli takip etmenizi gerektirir. Oldukça sıkıcı

Örnek: NPM Denetim sonuçları

2 27. Bağımlılık güncellemelerini otomatikleştirin

Yapın: Paket-lock.json'un en son tanıtımı İplik ve npm, ciddi bir zorluk çıkardı (cehenneme giden yol iyi niyetlerle döşenmiştir) - varsayılan olarak, paketler artık güncelleme almamaktadır. “Npm yüklemesi” ve “npm güncellemesi” ile birçok yeni dağıtım çalıştıran bir ekip bile yeni güncelleme almaz. Bu, subpar bağımlı paketlerin en iyi versiyonlarına veya en kötü ihtimalle zayıf kodlara yol açar. Takımlar artık, package.json dosyasını elle güncellemek veya ncu gibi araçları manuel olarak kullanmak için geliştiricilerin şerefiyesine ve belleğine güveniyor. Gümüş mermi çözümleri olmasa da, en güvenilir bağımlılık sürümlerini alma sürecini otomatikleştirmek daha güvenilir bir yol olabilir, ancak iki olası otomasyon yolu vardır: (1) CI eski bağımlılıkları olan yapılarda başarısız olabilir - 'npm gibi araçlar kullanarak modası geçmiş 'veya' npm-check-updates (ncu) '. Bunu yapmak, geliştiricileri bağımlılıkları güncellemeye zorlar. (2) Kodu tarayan ve otomatik olarak güncellenmiş bağımlılıklarla çekme istekleri gönderen ticari araçlar kullanın. Kalan ilginç bir soru, bağımlılık güncelleme politikasının ne olması gerektiğidir - her yamada güncelleme yapmak çok fazla ek yük oluşturur, ana yayınlandığında doğru güncelleme yapmak dengesiz bir versiyona işaret edebilir (birçok paket piyasaya sürüldükten sonraki ilk günlerde savunmasız kaldı, bkz. eslint-kapsamı olayı). Etkili bir güncelleme politikası bazı “devir sürelerine” izin verebilir - yerel kopyayı kullanılmaz olarak kabul etmeden önce, kodun en sondaki ve sürümlerin gerisinde kalmasına izin verin (örneğin, yerel sürüm 1.3.1 ve depo sürümü 1.3.8'dir).

Aksi takdirde: Yapımcınız, yazarları tarafından açıkça riskli olarak etiketlenen paketleri kullanacaktır.

Örnek: ncu, kodun en son sürümlerin gerisinde kaldığını tespit etmek için manuel olarak veya bir CI boru hattında kullanılabilir.

2 28. Diğer, Düğümle ilgili olmayan, CI ipuçları

Yap: Bu gönderi, Node JS ile ilgili olan veya en azından örneklendirilebilecek test önerileri üzerine odaklanmıştır. Bununla birlikte, bu madde, iyi bilinen ve Düğümle ilgili olmayan birkaç ipucunu gruplar.

  1. Bildirimsel bir sözdizimi kullanın. Bu, çoğu satıcı için tek seçenektir, ancak Jenkins'in eski sürümleri, kodun veya kullanıcı arayüzünün kullanılmasına izin verir.
  2. Yerel Docker desteği olan bir satıcıyı seçin
  3. Erken başarısız olunca ilk önce en hızlı testlerinizi yapın. Birden fazla hızlı incelemeyi gruplayan (ör. Bağlantı, birim testleri) ve kod üreticisine hızlı geri bildirim sağlayan bir "Duman testi" adım / kilometre taşı oluşturun
  4. Test raporları, kapsam raporları, mutasyon raporları, günlükler, vb. Dahil olmak üzere tüm yapay nesneleri gözden geçirmeyi kolaylaştırın
  5. Her olay için birden fazla boru hattı / iş oluşturun, aralarındaki adımları tekrar kullanın. Örneğin, özellik dalı taahhütleri için bir işi ve ana PR için farklı bir işi yapılandırın. Paylaşılan adımları kullanarak her bir yeniden kullanım mantığına izin verin (çoğu satıcı kod yeniden kullanımı için bazı mekanizmalar sağlar)
  6. Asla bir iş beyanına sır saklamayın, bir gizli mağazadan veya işin yapılandırmasından saklayın
  7. Bir sürüm oluşturma sürümünde açıkça sürüm belirtin veya en azından geliştiricinin kullandığından emin olun
  8. Yalnızca bir kez oluşturun ve tüm denetimleri tek yapı eseri (örneğin Docker resmi) üzerinden gerçekleştirin
  9. Yapılar arasında geçiş yapmayan geçici bir ortamda test edin. Önbelleğe alma node_modules tek istisna olabilir

Wise Aksi takdirde: Yıllarca bilgeliği özleyeceksin

2 29. Derleme matrisi: Birden fazla Düğüm versiyonunu kullanarak aynı CI adımlarını çalıştırın

Yapın: Kalite kontrolü huzurla ilgilidir, ne kadar şanslı olursanız, sorunları daha erken saptayarak yakalayabilirsiniz. Yeniden kullanılabilir paketler geliştirirken veya çeşitli konfigürasyon ve Düğüm versiyonları ile çok müşterili bir üretim gerçekleştirirken, CI konfigürasyonların tüm permütasyonları üzerinde testler hattını çalıştırmalıdır. Örneğin, bazı müşteriler için mySQL'i ve diğerleri için Postgres'i kullandığımızı varsayalım - bazı CI satıcıları, "Matrix" adlı bir özelliği destekleyerek, mySQL, Postgres ve 8, 9 ve 10 gibi birden fazla Düğüm sürümüne karşı test etme işlemine izin verir. Bu, sadece ek bir çaba sarf etmeden konfigürasyon kullanılarak yapılır (test veya diğer kalite kontrolleriniz varsayarak). Matrix’i desteklemeyen diğer CI’lerde buna izin verecek uzantılar veya tweaks olabilir

Aksi takdirde: Öyleyse tüm bu zorlu yazma testlerini yaptıktan sonra, hataların yalnızca yapılandırma sorunları nedeniyle gizlice girmesine izin mi vereceğiz?

☺ Örnek: Aynı testi birden fazla Düğüm sürümü üzerinde çalıştırmak için Travis (CI satıcısı) yapı tanımını kullanmak

dil: node_js
node_js:
  - "7"
  - "6"
  - "5"
  - "4"
Yüklemek:
  - npm kurulum
senaryo:
  - npm çalışma testi

Teşekkür ederim. Hoşunuza gidebilecek diğer makaleler

  • Denetim Listesi: Node.js üretim en iyi uygulamaları (Ağustos 2018)
  • 2019’da daha iyi bir Node.js geliştiricisi olmanın 19 yolu
  • Node.js güvenliği için en iyi yöntemler (Eylül 2018)
  • YouTube: 5 gelişmiş ve parlak test tekniği
  • Node.js en iyi uygulamaları - güçlü bir Node uygulaması için 79 en iyi uygulama

Daha fazlasını mı istiyorsun? Twitter'da beni takip et

Testing️ Kendi test ipucunuz var mı? PR burada ve bu makaleyi güncellediğimden emin olacağım