Mevcut eklentiler için TDD’yi benimseyin

Test odaklı Geliştirme (TDD), hata özellikleri veya iyileştirmeler yazmadan önce testleri yazmaya dayanan bir yazılım geliştirme felsefesidir. Bu, kalkınma hakkında nasıl düşündüğünüz açısından büyük bir farktır. Hem farklı bir zihinsel model nedeniyle hem de kod tabanına yaklaşma şeklinizi değiştirmek zor olduğu için TDD’ye taşınmayı çok zor buluyorum. TDD’den önce, çalışması gereken bir kod yazdım, neden başarısız olduğunu görmek, düzeltmeyi ve sonra testi yazarak tarayıcımda manuel olarak test ettim. TDD ile, kodun nasıl çalıştığını açıklayan ve hangi kriterlerin kodun çalıştığından emin olduğunu belirleyen bir işlev ve test beyanı yazdım. Ancak o zaman çalıştım. “İş” tanımı artık belirsiz değil, kendimi yargılamak için programlanabilecek bir standardım var. Koddaki test kriterlerimi yazarak, bir kod incelemesi yapan kişi, test kriterlerinin doğru olup olmadığını aşabilir. Son bölüm, ekip üyeleri arasındaki “benim için işlev” ve neyin farklı olduğunu öğrenmek için -up’u takip eden belirsiz ifadelerden kaçındı – test ortamı veya test kriterleri. Manuel QA ile, her test adımını belgelediğiniz sürece sahip değilsiniz.
Bu makalede, bir TDD gerilme isteği yazmak için bir phunit kullanarak eklenti kaldera formlarımın bir örneğini kullanacağım. Bu, WordPress’in geliştirilmesinde nasıl test yapılacağına dair bir makale değildir. PHP ünitesi testi, PHP entegrasyon testi, JavaScript ünitesi testi, önceki tork için JavaScript entegrasyon testi hakkında yazdım. Bu yazı, eklenti kaldera formlarımız için TDD’yi benimseme deneyimime dayanıyor. TDD’yi tercih ediyorum ve özellikle bir tarayıcı ile manuel test yerine JavaScript’in geliştirilmesinde daha hızlı olduğunu düşünüyorum. Doğru yapıldığında, kodun bakımını kolaylaştırır. TDD için kısa teslimat TDD’de yeniyseniz, bunu ilk test olarak düşünmek daha kolay hissedebilirsiniz. Listede takip edilmesi kolay adımlar:
Testte tanımlamak için yeterli işlev yazın.
Başarısız bir test yazın.
Mezuniyet sınavı yapın.
Kod incelemesi.
TDD kullanırken, çalışmayan komiteyi yapmanız ve itmeniz gerekir. Test geçmeden önce master veya kalkınma dalınıza itmek, ana dala zarar vermedeki her değişiklik anlamına gelir, bu bir sorundur. Bu yüzden git akışı mantıklı. Yeni dallar açar, ek değişiklikler yaparsınız ve yalnızca test, tiftik, tarama kod kalitesi ve insan kodunu gözden geçirme izni gibi otomatik incelemeleri geçerken birleştirirsiniz.
Basit olacak şekilde oluşan bir örnek hakkında konuşalım ve sonra gerçek dünyanın örneklerini görelim. İhtiyaçlarınızın iki sayı eklemek için bir nesne oluşturmak olduğunu varsayalım. İlk olarak, bedensiz işlevler yazacağım:
Sonra teyit edilen matematiksel kuralların takip etmesini sağlamak için iki test ekleyeceğim: O zaman orijinal işlevimi ayrı bir taahhütte değiştireceğim, böylece gerçekten çalıştığı:
Kod yapılmadan önce testin başarısız olmasının nedeni iki nedenden dolayı idi. İlk olarak, sadece mümkünse bir şey taahhüt etmeyi taahhüt edin. İkincisi, belki bir geçiş testi yaptıktan sonra, siz veya değişiklik kodunu inceleyen kişi testin doğru olduğuna karar verebilirsiniz, ancak uygulama değildir. Bu olursa, bir testi kaybetmeden veya daha çekici bir git yapmadan ve ardından baştan başlayarak uygulama ile taahhütte bulunabilirsiniz.
TDD daha sonra ödedi Bu kod JavaScript’i şimdi test ediyor. Ancak düzgün test edilen bir işleve sahip olmak, güvenli bir şekilde tekrarlamanızı sağlar. Belirtilen ondalık sayıya isteğe bağlı yuvarlak sonuçlara üçüncü bir argüman eklemeniz gerektiğini varsayalım. İlk olarak imza işlevini değiştirin:
Bunu geriye dönük uyumluluğu korumak için isteğe bağlı bir argüman haline getirdim. Varsayımımın doğru olmasını sağlamak için mevcut testi değiştirmeyeceğim. Geriye dönük uyumluluğun korunduğunu kanıtlıyorlar. Kötü kokan ve testinizin çok katı olduğuna dair bir işaret olan testi değiştirmek.
Bunun yerine, iki test daha ekleyeceğim:
Testi her aşamada uygulayarak, iyileştirmemin gerçek gelişme olduğunu ve yeni kusurlara neden olmadığına dair bir garantim var.Gelecekte kodu değiştirmek zorunda kaldığınızda, teste yatırım yaptığınız zaman işe yarayacaktır.Testin kapsamı nedir?Ne inşa ettiğinize bağlıdır.Bulabileceğim en Ortodoks TDD kuralları Bob Amca’dan gelin: Başarısız olan bir hata birimi testi yapmak dışında herhangi bir üretim kodu yazmanıza izin verilmez.
Başarısız olmaktan daha fazla birim testi yazmanıza izin verilmez ve derleme hatası başarısızlıktır.
Başarısız bir birim testini geçmek için bir üretim kodu yazmanıza izin verilmez.
Bu çok katı bir standarttır ve kod tabanının değişimini zorlaştıran testlere kolayca yol açabilir.Unutmayın, amaç gelişme hızını azaltmak değil, gelişmektir.
Kent C. Dobbs – PayPal’da aynı zamanda JavaScript Uygulama Testinin yazarı olan bir mühendis – bu konu hakkında iyi bir gönderiye sahip. Posta’da “Testinize düşen sonuçları alıyorsunuz çünkü kapsam%70’in çok ötesine yükseliyor”. Bu ifadeyi sevmiyorum, ama benden daha deneyimli, çok daha fazla. Açılış kaynağı projesinin% 100 kapsama sahip olduğunu, çünkü WordPress için geçerli olacak kurallara benzeyen “birçok farklı durumda yeniden kullanılabilecek bir cihaz (hasar, birçok projede ciddi sorunlara neden olabilir)” olduğunu belirtti. Eklenti. Ayrıca OSS projesinin “%100 kod kapsamı elde etmek nispeten kolay olduğunu” yazdı. Bu birçok WordPress eklentisi gibi gelmiyor. Kişisel, kurallarım bugün olduğundan daha fazla kapsam. Test eksikliği, daha sonra olgunlaşan teknik borçtur. Yazma testi artık daha fazla zaman gerektiriyorsa, çok değerlidir. Yeni kod için, bu sizi test edilebilecek bir desen kullanarak kodu yazmaya zorlar. Kodu yeniden aktarmalıdır, böylece önceden test edilebilir, bazen sıkıntılı. WordPress’te izole birim testi basit değildir. Genellikle, Cypress.io veya Ghost Müfettişi kullanarak otomatik UI testi bana daha iyi yardımcı oldu. Kodun gerçekten test edilemeyeceği konusunda endişelenmek zorunda kalmadan birçok işlevi hızlı bir şekilde ekleyebilirim.
TDD ile Özellikler Ekle Caldera formlarına yaptığım TDD gerilme isteklerinin örneklerini keşfetmek istiyorum. Bu durumda yeni bir özellik – maksimum dosya yükleme boyutları için ayarlar eklemek. TDD’nin sevdiğim bir kısmı, yazmadan önce hangi yeni işlevlere ihtiyacınız olan yeni işlevleri bulmaya zorlamaktır. Seni bilmiyorum, ama sadece ihtiyacım olmadığını anlamak için çalışmak için çok zaman gerektiren çok fazla kod yazdım. TDD, ilerlemeden önce planımı düşünmeye zorladı. Github’da aşağıdaki çekme isteği okumak istiyorsanız: https://github.com/calderawp/caldera-forms/pull/2823 Bu PR’nin garip olduğunu not etmeliyim çünkü ilgili değişikliklerden devam eden birkaç şubeyi birleştirmek zorundayız bir arada. TDD’yi benimsemek parçalanıyor ve yasaya mükemmel bir uyum olmadığını iddia ediyorum.
Bir başarısızlık testi yazmak bazen bunu yapmak zordur. Örneğin, bu durumda, alan ayarlarını okumak ve dosya boyutunu kontrol etmek için birkaç yardımcı yöntem geliştirmem gerekiyor ve yardımcı program yöntemini mevcut koda entegre etmem gerekiyor. Bunu iki adımda yapmayı seçtim. Fayda yöntemini çalıştırdım ve test ettim ve sonra yeni yöntemi kullanmak için hareket ettim.
Bu benim ilk taahhüdüm: https://github.com/calderawp/caldera-forms/pull/2823/commits/d878e9d501af6ae92d72e45340a185dea1e9c69 kodlarını görürseniz, sınıfa iki yöntem ekler ve bir işlevi vermezse işlev:
Geliştirdiğim kod için bu komitede hepsi bu. Ayrıca işlevlerin nasıl çalışması gerektiğini gösteren bir test yaptım: Bu test yeni yöntemin nasıl çalışması gerektiğini gösteriyor. Bir dizi yorum, her ifadenin neden yapıldığını açıklar. Süreç beni nasıl düzenleyeceğimi düşünmeye zorladı, bu noktada bir kullanıcı arayüzü olmayan, yapılandırılmalı ve daha sonra nasıl kullanacağım. Benim genel kuralım, taahhüt etmenin sadece bir şey yapması gerektiğidir. Bu taahhüt yeni bir yöntem ve başarısız bir test ekler. Önceki cümlede “ve” kelimesi kuralları ihlal ettiğimi gösteriyor. İki taahhüt yapmam gerekebilir. Daha da önemlisi, hangi mantığın test edileceği üzerinde çalışmak için çok zaman harcadığımı ve orada çok sayıda önceden iletişim kurmuş revizyon olduğunu not etmek istiyorum. Geçmişte geçiş testi yapmak, TDD kullanmadığımda, UI seçeneğini ekleyerek, seçeneğe sahip bir form oluşturarak, sonra bir dosyayla bir form göndererek ve kodumun beklendiği gibi çalışıp çalışmadığını görerek bunu test etmek zorunda kaldım. Kodlara göz atmak ve işlevin sonuçlarını kontrol etmek için Xdebug’u kullanmak sürece çok yardımcı olur, ancak çok yavaştır. Ayrıca, başarılı olduktan sonra, daha sonra bu özelliğe zarar veren başka şeyler olup olmadığını öğrenmenin bir yolu yoktur. Bu yüzden TDD’yi daha hızlı buluyorum – mümkünse – ve gelecekte zamandan tasarruf edin. Her komite arasındaki tüm test dizisini çalıştırmak süreci çok yavaşlatacaktır. JavaScript testi için Jest’i testim için koşucu olarak kullanıyorum ve yalnızca değişen kod üzerinde testler çalıştırmak için kolayca yapılandırılabilir.
Başarısız bir test yazdığım, lisansüstü değişikliklerle ilgili tüm testleri aldığım bir stratejiye yol açar ve sonra ona beklenmedik bir şey olmadığından emin olmak için tüm testlerimi çalıştırmasını söylüyorum. İşte bir phunit’e benzer bir şeyin nasıl yapılacağı hakkında bir makale. Kişisel çözümüm, dokümanlarımda “şimdi” grup anotasyonunu kullanmak. Phunit’te, testlerinizi özelliklere göre gruplamak için @group kullanabilirsiniz. Ardından, sadece ClipPpunit’te bayraklarla gruptaki testleri çalıştırabilirsiniz. Caldera formlarında @Now testini çalıştırmak için bir besteci komut dosyası var. Mevcut testle, iki yeni yöntem üzerinde çalışmaya başlayabilir ve her seferinde sadece iki test çalıştırabilir ve her testin neden başarısız olduğunu görebilirim. Bu süreçte PHP hataları, uyarılar ve bildirimler ve test hataları görüyorum. Bir noktada kendime çok rahatsız oldum çünkü kodun çalışması gerekiyordu ve neden olmasın bilmiyordum, ama en azından deli olmadığımın kanıtım var. Ayrıca, birçok ifadeyle iki test yazmamın nedeninin böyle daha hızlı başarısız olmaları olduğunu belirtmeliyim. Test başına sık sık önerildiği gibi bir ifadem varsa ve genellikle iyi bir fikirse, test başına 10 veya daha fazla başarısız göreceğim. Anlaması çok daha zor. Bir Testin bir ifadeyle bir tanesi düzenlenmesi her seferinde bir sorunun çözülmesine yardımcı olur. Yazdığım gerçek işlev oldukça basit görünüyor:
Testim kolayca göz ardı edilen birkaç farklı durum içeriyor.Örneğin, düzenleme yoksa ne olur.PHP’de karmaşık olan ilişkilendirici dizideki içeriğe dayalı koşullu mantık dizin kaybedilebildiğinden, değer farklı bir skaler tiple temsil edilebilir – ya da tamsayı 1 veya ‘1’ veya ‘true’ ise ise temsil edilebilir

Doğru boole yerine mi kullanıldı? Gerçekten bence bu basit, bu yöntem üzerinde çalışırken bir teste ihtiyacım yok. Ayrıca, ilk çabam başarısız oldu ve sadece testimin nedenini bilmeme yardımcı olacak şekilde başarısız olduğu ve başarısız olduğu için bunu biliyordum. Şimdiye kadar testlerin izolasyonunun ötesine geçmek teknik bir entegrasyon testidir, çünkü çevre WordPress’in çalışmasını gerektirir ve ağrıya eşdeğer birim testi için bir taklit kullanmayı düşünmüyorum. Başka bir test gerçek entegrasyon testidir. Kaladera form dosyası için dosyaları yüklemek için ayrı bir bitiş noktamız var. Bu durumda, son işleyiciye dokunmam gerekmiyor, çünkü bu mantığı yangın işleyicisine karıştırmıyorum. Yangın kontrolünün sorumluluğu, WordPress API REST ve API REST’den devam eden verileri kullanarak yükleyen ayrı sınıf “UploadHandler” in etkileşimidir. Yani, sadece “yüklemeHandler” den değişiklik yapmam gerekiyor. Sınıf değişti. Yapılan değişiklik, dosya boyutu sınırını destekleme ihtiyacıdır. İş mantığı başka yerdedir. Sadece çok büyük bir dosya verirsem emin olmalıyım. Doğru dosya boyutuyla aynı şekilde çalıştığından ve dosya çok büyük olduğunda istisnalara neden olduğundan emin olmalıyım. İşte üç yeni test:
İlk Test – TestKnowsFileIStooLarge () – Daha önce yaptığım yardımcı program için sahip olduğum testlerin tüm permütasyonlarını yapmıyorum, çünkü zaten işe yaradığını biliyorum.İşlevin bu bağlamda çalıştığını kontrol ettim.İkinci Test – TestException WhenFileIStooLarge () – Testin sonuçlarının istisnanın atılmasını sağlamak.Deneme/yakalama desenlerini kullanmadığımı unutmayın.Phunit kullanıyorum ‘

admin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir