Sürekli entegrasyon hattınıza güvenecek kadar otomatik testiniz ne zaman var?


10

Testle sürekli entegrasyon, her zaman "sevk edilebilir" kodunu kontrol ettiğinizden emin olmak için kullanışlıdır.

Bununla birlikte, kapsamlı bir test paketini sürdürmek gerçekten zordur ve genellikle, yapı yine de buggy olacak gibi hissettirir.

CI boru hattı testinize ne kadar güvenmeniz gerekiyor? Yeterli testin ne zaman yapılacağına karar vermek için bir tür metrik kullanıyor musunuz?

Yanıtlar:


16

Genel olarak

Sürekli entegrasyon hattınıza güvenecek kadar otomatik testiniz ne zaman var?

Ne hakkında emin olmak istediğinizi düşünürseniz, cevap muhtemelen netleşir. Nihayetinde 1-1; her test sizi test ettiği tek şeyden emin yapar:

  • Birim testi, bir sınıfın (veya modülün) test edildiğini yaptığına dair güven verir.
  • Entegrasyon testi, birkaç birimin test edilen şekilde birlikte çalıştığına dair güven verir.
  • Uçtan uca testler, tüm uygulamanın testte açıklandığı gibi belirli bir şey yaptığına dair güven verir.

Sorunuzu formüle ettiğiniz yoldan, büyük olasılıkla şu anda büyük resimli bir iş anlayışıyla düşünüyorsunuz, örneğin:

Uygulamamın X yapabileceğinden emin olmak istiyorum .

Böylece X yapmaya çalışan ve bunu doğru yapıp yapmadığını kontrol eden bir uçtan uca test yazıyorsunuz.

Daha somut

Hepsi çok referanslıdır, ama bunun nedeni de budur. Orada sadece değil kendisine daha.

Örneğin, yemek tarifleri oluşturmak için bir uygulama yazdığınızı düşünün. Bir özellik, farklı miktarlarda birkaç çeşit peynir eklerseniz, size doğru sıcaklık ve zamanı verir, böylece hepsi erir.

Böylece CheeseMeltCalculator100g Gouda ve 200g Emmental peyniri için bir birim testi yazabilirsiniz ve daha sonra sıcaklık ve zamanın doğru olduğunu kontrol edin. Bu CheeseMeltCalculator, 100g Gouda ve 200g peynir için çalıştığından emin olabileceğiniz anlamına gelir . Yerine 200g Gouda 300g ile bu testi tekrar Şimdi, eğer sen olabilir oldukça emin farklı değerleri için doğru çalıştığından emin. Sen testleri ekleyebilir 0, -1ve int.MaxValueGouda gr kodu çelme vermediğinden emin olmak için (veya amaçlandığı gibi düzgün gezileri) garip girişi için.

CheeseMeltCalculatorTüm gıda sıcaklığı ve zaman hesaplama sürecine doğru bir şekilde dahil edildiğini kontrol etmek için bir entegrasyon testi yazabilirsiniz . Bu yanlış giderse, ancak CheeseMeltCalculatoryukarıdaki testler iyi ise, hatanın diğer hesap makinelerinde veya farklı hesap makinelerindeki verilerin birleştirilme biçiminde olduğundan emin olabilirsiniz.

Son olarak, tüm bir tarif oluşturmak için uçtan uca bir test yazabilirsiniz ve kontrol ettiğiniz şeylerden biri sonuç sıcaklığı ve süresidir. Önceki 2 test seviyesi iyiyse, ancak bunun için yanlış giderse, o parçaların doğru olduğundan emin olabilirsiniz ve hata, sıcaklık hesaplamasının uygulamaya nasıl entegre edildiği hakkında bir şeydir. Örneğin, kullanıcı girişi doğru şekilde aktarılmamış olabilir.

Ve son olarak , eğer bu testlerin hepsi iyi ise, o zaman " birkaç farklı türde peynir eklerseniz, size doğru sıcaklık ve zamanı verir, böylece hepsi erir "

Uzun lafın kısası

Mesele şu ki, "doğru çalışıyor" testine sahip olamazsınız. Sadece "X yaparsam Y olur" testini yapabilirsiniz.

Ancak, bu tam olarak proje için teknik özelliklerde olması gereken şeylerdir. " Birkaç farklı türde peynir eklerseniz, size doğru sıcaklık ve zamanı verir, böylece hepsinin erimesini sağlar " gibi bir ifade, müşteriye sadece bitmiş ürünün ne yapacağına dair net beklentiler vermekle kalmaz, aynı zamanda döndürülebilir otomatik testlere

ilave bilgi

Kullanıcı Richard bu bilgileri bir düzenlemeye ekledi:

Martin Fowler, web sitesinde en yaygın stratejiler hakkında çok güzel bir özete sahiptir: https://martinfowler.com/articles/microservice-testing/

Bunu kaldırmak istemiyorum, ama şunu söylemek istiyorum: Bu cevaba kıyasla, bu bir "özet" değil, hoş grafikler ve her şeyle daha derinlemesine bir açıklama.

Benim tavsiyem şöyle olacaktır: Cevabımı okuduktan sonra her şey size mantıklı geliyorsa, işiniz bitmiştir. İşler hala belirsiz görünüyorsa, biraz zaman ayırın ve bağlantılı makaleyi okuyun.


Bu iyi bir kavramsal görüştür. Test kapsamımıza güven sağlamada yararlı olabilecek örnek metrikleriniz var mı?
stonefruit

@stonefruit Gerçekten değil, ama tam olarak ihtiyacım olan cevaba sahip olduğumu düşünüyorum: Testivus On Test Kapsamı
R. Schmitz

@stonefruit Bu benzetteki sayıya göre,% 80, bu bağlamda daha sık duyduğunuz bir sayıdır. Esas olarak pareto prensibi nedeniyle - son% 20 kapsama alanı çalışmanın% 80'i kadardır. Başka bir deyişle, ilk etapta% 80'den% 100'e çıkarmak için 4 kat daha fazla iştir. Bu genellikle aşırıya kaçar, ancak bir uydu için kontrol kodu yazdığınızı düşünün: Bir hata ortaya çıkarsa, bunu düzeltemezsiniz; % 100'lük bir kapsam elde etmek o zaman değerli bir yatırımdır.
R. Schmitz

Görünüşe göre üçüncü programcıyım. haha. Sanırım günün sonunda, uydu örneğinden bahsettiğiniz gibi, riske dayalı bir yaklaşım benimsiyor.
stonefruit

1
@stonefruit Belki de ilk kişisin. % 0 kapsamı olan bir projeniz varsa,% 80'e varan bir ölüm yürüyüşü başlatmayın. Bunun yerine, gerçekten, " sadece iyi testler yazın ". Belki cuma günlerinin son yarısını test yazmak için kullanın, böyle bir şey. Deneyimlerime göre, otomatik olarak önce en iyi çaba-ödül oranına sahip testler yapacaksınız ve her test size biraz daha fazla güven verecektir.
R. Schmitz

4

Aradığınız güveni sağlayacak hesaplayabileceğiniz bir ölçüm yoktur. Güven bir şey yaparak ve daha sonra bunu başararak ya da başarısızlıkla ve ondan bir şey öğrenerek inşa edilir.

Test kapsamımda bana güven veren tek "metrikler":

  1. Üretimde bulunan hata sayısı
  2. Kod tabanını yeniden düzenleyebilir ve regresyon hatalarını yakalamak için test kapsamınıza güvenebilir misiniz?

Otomatik testler gümüş bir kurşun değildir. Her bir bırakma döngüsü sırasında kaç üretim hatası bulunduğunu takip etmeniz gerekir. Bu sayı düştüğünde daha iyi bir yazılım sunuyorsunuz. Otomatik testler ve Sürekli Entegrasyon yalnızca daha iyi yazılım sunmak için kullandığınız araçlardır .

Gerçekten ölçebileceğiniz tek metrik "Daha iyi bir yazılım mı sunuyorsunuz?"

Ve o zaman bile, özneldir.


Diğer cevaplarla karşılaştırıldığında, bu cevap olası metrikleri ele almaktadır. Önerilen metrikleri daha anlamlı hale getirmeyi düşünüyorum. Belki de üretimde bulunan kusurların sayısını bulmanın yanı sıra, her kusura risk yönetimine dayalı bir puan verin ve bir eşik koyun (örneğin son 3 ay içinde bulunan 30 puan kusur). Eşik değere ulaşmak, buggy kodunun teknik borcu katlanarak artmadan önce olası hatalar için sistemin gözden geçirilmesinin bir göstergesi olabilir.
stonefruit

2

Sürekli entegrasyon hattınıza güvenecek kadar otomatik testiniz ne zaman var?

Çoğu ekonomik ortamda, yeterli güveni uygulamak için bütçeniz olmayacaktır (>% 99), ancak sınırlı bir bütçeyi yönetmelisiniz: Her şey maliyet / fayda oranı ile ilgilidir.

  • Bazı otomatik testlerin uygulanması ucuzdur, bazıları aşırı maliyetlidir.
  • Gerçek risk yönetiminize bağlı olarak, bazı riskler testlerle karşılanmalı, diğerleri risk altında olmamalıdır.

Bu yüzden gerçekte kolay / ucuz / riskli testler uygulanacak, pahalı / olası olmayan testler uygulanmayacaktır.

Yazılım geliştirmenin bir alt hedefi, otomatikleştirilmiş testi uygun fiyata tutmak için test edilmesi kolay / ucuz ( Test-driven_development uygulayarak test edilebilirlik için tasarım) mimarisi yaratmaktır .

Pareto_prin prensibinin burada da korunabilir / test edilebilir yazılım için de uygulanabileceğini varsayıyorum :% 20 daha fazla para harcayarak% 80 ekstra fayda elde edeceğinizi söylüyor. Kalan% 20 daha fazla avantaja ulaşmak için ekstra% 80 para harcamanız gerekir.

Potansiyel olarak test edilmemiş kaynak kodunu göstermek için kod kapsamı ve mutasyon kapsamı gibi Test Metrikleri uygulayabilirsiniz .

Ancak% 100 kapsama alanı olsa bile, kodunuzun hata içermediğinden emin olamazsınız.

Yönetim, coetetrics'i sever. "Kod kapsamı> =% 80" yönetim tarafından zorlanıyorsa, geliştiriciler otomatikleştirilmiş testi desteklemiyor / beğenmiyorsa, yanlış bir güvenlik hissi veren hiçbir şeyi kanıtlamayan yüksek kapsama alanına sahip test kodu yazmanın yolları vardır.


1

Buradaki hile, tam kapsama alanı hakkında değil, değişikliklerinizin riskini yönetme konusunda endişelenmektir.

Boru hattınızı zaten Üretimdeki ile aynı sürümü dağıtmak için kullandığınızı varsayalım - regresyon hatası riski nedir? Sıfır (çünkü değişiklik yok).

Şimdi diyelim ki ekranlardan birinde bir metin parçası değiştirmek istiyorum. Metnin şimdi doğru bir şekilde görüntülendiğini doğrulamak için testi ekledim (argüman için gerçekten önemli bir metin parçası olduğunu varsayalım). Regresyon hatası olmadığını doğrulamak için başka hangi testlere ihtiyacım var? Gerçekten hiçbiri ...

Dolayısıyla, her sürümün yaşaması için gereken otomatik testlerin sayısı, uygulamanızın boyutunun değil, değişikliğinizin boyutudur. Küçük, düşük riskli değişiklikler yapıyorsanız, riskleri azaltmak için çok daha az teste ihtiyacınız olacaktır.

Ama bir dakika ... bu CI ve CD ile çok iyi uyuşmuyor mu?

Evet! Tüm değişikliklerinizi ve deltalarınızı çok küçük tutarak, regresyon risklerinin çoğunu test etmek yerine süreç yoluyla hafifletiyorsunuz. Dahası, soru aslında otomasyondan biri değil (sadece kullanacağımız araç) - sadece bir test ve risk iştahı meselesi. Otomasyonu tamamen unutun, bir değişikliğin sorun yaratmadığından emin olmak için bir değişikliğe karşı hangi testleri yapardınız? Bu sorunun cevabı manuel bir test sürecinden bir CI sistemine değişmez - tek avantajı, bu regresyon testlerinin birçoğunun daha önce işlevsellikte geliştirilmiş olması ve CI'nin sizi daha küçük ve daha güvenli değişiklikler yapmaya teşvik etmesidir.

TLDR

Testleriniz değişiklik riskini azaltmak içindir. Sıfır delta ile konuşlandırmanın herhangi bir riski yoktur ve bu nedenle herhangi bir risk taşımamaktadır. Değişikliklerinizi küçük tutarak onları doğrulamak için gerekli testleri tanımlamak çok daha kolay hale gelir - otomasyonun tekrar kullanılabilirliği bir avantajdır.


0

Ürününüzü manuel olarak test ettiğinizle aynı metriktir.

Pratik olarak, bu düşük güven bölgelerini tanımlamak kolaydır: Ürünü gönderdiğinizi varsayarsak, sevk edilebilirlik konusunda güveninizi artıran bazı boru hattı sonrası manuel adımlarınız olduğunu varsayalım. Bunlar, otomatik işlemin kendisine olan güveni artırmak için otomatikleştirmeniz gereken alanlardır.

Otomasyonunuz sürekli bir çabadır. Ürününüz geliştikçe büyür ve gelişir. Bir kusur, CI'yi yeniden etkinleştirmenin yanı sıra kodunuzu yeniden düşünmek için bir nedendir. Ve buradaki güneşli taraf, ürüne olan güvenin ulaşılabilir olması - otomasyona olan güvenin de elde edilebilir olmasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.