“Passing / Broken build” göstergesine alternatif mi?


14

Her bir taahhütte testleri yürüten sürekli bir entegrasyon olduğunda, ortak bir en iyi uygulama tüm testlerin her zaman geçmesini sağlamaktır (diğer bir deyişle "derlemeyi kırmayın").

Bununla ilgili bazı problemler buluyorum:

Örneğin, biletlere karşılık gelen testler oluşturarak açık kaynaklı bir projeye yardımcı olamazsınız. Başarısız test içeren bir açık kaynak projesine bir Çekme İsteği önerirsem, derleme başarısız olarak işaretlenir ve proje, "derlemeyi bozacağı" için depoya birleştirilmesini istemez.

Ve ben senin repo başarısız testleri için kötü bir şey olduğuna inanmıyorum , bu izleyicide açık sorunları olması gibi. Bunlar düzeltilmeyi bekleyen şeyler.

Aynı şey bir şirket için de geçerli. TDD ile çalışıyorsanız, testleri yazamaz, testi gerçekleştiren mantık kodunu kaydedemez ve yazamazsınız. Bu, dizüstü bilgisayarımda 4-5 test yazdıysam, tatile gitmeden önce bunları taahhüt edemem demektir. Kimse işimi geri alamaz. Bunları, örneğin e-posta ile göndermek dışında bir iş arkadaşınızla "paylaşamıyorum". Ayrıca, bir kişi testleri yazarken diğeri ise modeli yazmayı önler.

Bütün bunlar, derleme işlemini / sürekli entegrasyonu yanlış mı / yanlış mı anlıyorum? Bana öyle geliyor ki, "geçme" / "geçmeme" çok dar bir göstergedir.

Sürekli entegrasyonu ve TDD'yi uyumlu hale getirmenin bir yolu var mı?

Belki "Yeni testler" (yani başarısız olabilir) ve "regresyon testleri" (yani gerektiğini ayırt etmek için bir standart çözüm / uygulama yoktur değil onlar işe kullanılan çünkü başarısız)?


1
Başarısız test sayısının son bir saatte (veya daha fazla) arttığını (kırmızı) veya azaldığını (yeşil) gösteren bir göstergeye sahip olun .
Joachim Sauer

2
TDD / ALM uzmanı değilim (bu nedenle bir cevaptan ziyade yorum), ancak probleminizin özel dallar / özellik dalları ile çözülebileceğini düşünüyorum. Özellik A üzerinde mi çalışıyorsunuz? Dallayın, dalda çalışın (iş arkadaşlarınızla) ve işiniz bittiğinde - sürekli entegre gövdeye birleştirin.
Avner Shahar-Kashtan

@JoachimSauer Evet, ancak bu metrik herhangi bir büyük projede standartlaştırılmış / kullanılıyor mu? Çoğu projenin (ve CI araçlarının) neden bu şekilde çalıştığını anlamaya çalışıyorum.
Matthieu Napoli

"Başarısız olabilecek testler" için doğru kriterin "yeni testler" değil, "bilinen açık konular için testler" olduğunu düşünüyorum. Bu testlerin nasıl yararlı olduğunu görebiliyorum - bu testlerin CI derlemesinde nasıl YANLIŞ OLMADIĞINI da görebilirim çünkü orada test geçişi / başarısızlığının anlamını kirletiyorlar (sadece birinin gerçekten zaman harcadığı testleri yapmak istiyorsunuz geçmek için).
Joris Timmermans

@MadKeithV Tam olarak
Matthieu Napoli

Yanıtlar:


12

Nereye gittiğinizi görüyorum, ancak bu tür sorunlar genellikle başka şekillerde çözülür. Bunun standart protokol olması için iyi bir neden var. Birisi derlenmeyen bir kod gönderirse, kodunu güncelleyen herkes derlenmeyen bir programa sahip olacaktır . Bu, şu anda tamamen farklı bir şey üzerinde çalışan ve bir şekilde üzerinde çalıştıklarını derleyip test etmeden önce beklemeleri gereken bir durumda bulunan programcıları da içerir.

Standart protokol, programcıların gerektiğinde kodlarını her gün güncelleyebilmeleri için derledikleri sürece , tam veya eksik çalışma için bile değişiklik yapabilmenizdir.

Ancak, hala ne elde ettiğinizi görüyorum. Bazen kodunuzu kaydetmek için taahhütte bulunabilirsiniz . Bunun için çoğu kaynak deposu dallanmayı destekler. Bu, özel bir dal oluşturmanıza, başkalarını rahatsız etmeden üzerinde çalışmanıza, ardından iş tamamlandığında bagajda birleşmenize izin verir. Bu, yapının bozulmasına neden olan herhangi bir boşluk olmadan istediğiniz zaman işlem yapmanızı sağlar.

Bu uygun değilse, GIT yerel makinenizdeki depolara (itmeye) izin verir, ancak muhtemelen depo herhangi bir yerde olabilir. Potansiyel olarak kısmi / eksik iş için bir havuz ve bitmiş iş için başka bir depo oluşturabilirsiniz ve bu depoda her gece bir yapı ekleyebilirsiniz.

Yine, yeterince önemi vurgulayamıyorum. Hiçbir zaman kırık kod gövde için taahhüt etmeyin! Katkılarınız diğer programcıların çalışmalarını etkileyemez.

Düzenle

Kırık testler tasarladığınızı görüyorum, ama benim düşünceme göre, çok az fark var. Bir testin bütün amacı, bir programın belirli bir yönünün geçip geçmediğini belirlemektir. Her zaman başarısız olursa ve hiçbir şey yapmazsanız, geleneksel birim test kullanımında test hiçbir işe yaramaz. Eğer böyle bir test başarısız olursa mutlaka "başarısız" bir taahhüt gerektirmeyen başka bir metrik gerçekleştirmek için kullanırsanız, o zaman aynı şeyi yapmanın başka bir yolunu bulmanızı şiddetle tavsiye ederim.

Aksi takdirde, testin hiçbir zaman dikkate alınmadığını veya derlemenizin başarısız olmasına neden olursa, diğer programcılarınızın başarısız derlemeleri yoksayması riskiniz vardır. Programcıların bir yapıyı kırdıklarında, gerçek bir içgörü sunmayan ve sadece kötü uygulamalarla sonuçlanabilecek bir test yapmaktan fark ettikleri daha önemlidir.


1
Gerçekten de konu dalları ile bir noktaya değiniyorsunuz. Ama asla bozuk kod yürütmekten bahsetmiyorum, sadece başarısız testler. Örneğin, nasıl düzeltileceğini bilmesem bile, gelen biletler için testler oluşturarak açık kaynaklı bir projeye yardımcı olabilirim. Bu, koruyucular için biraz zaman kazandırır.
Matthieu Napoli

Sizinle aynı proje üzerinde çalışıyorsam ve başarısız bir test yüklüyorsanız, şimdi başarısız test içeren bir derleme var. Bu işlevsellik henüz uygulanmadığından testinizi silebilirim veya özelliği uygulamaya karar verir ve kodunuz üzerinde durup zaman kaybedersiniz. Bunu yapmanın bir kültürü olsaydı, bu tür bir yanıttan kaçınılabilirdi, ama o zaman herkes bunu yapardı ve böylece tüm testleriniz geçtiğinde bile, hepsi benim değil. Bu durumda, yapı her zaman başarısız testlere sahip olacaktır . Ben bir ters görmüyorum.
Michael Shaw

the build would always have failing teststam! Ama bu çok kötü bir şey mi? Bizim tek metrikimiz "derleme bozuk ya da değil" dir, ancak kodunuz bilinen hatalarla dolu olabilir , bu yüzden gerileme dışında hiçbir şey ifade etmez. Mükemmel bir dünyada, her izleyici sorununun bir testi olacaktır (çoğaltmak düzeltmekten daha kolaydır). Sonuç, 35 testin / tüm testlerin% 70'inin geçtiğini, Branch-A'nın regresyon olmadan 40 teste (% 80) geliştirdiğini ve Branch-B'nin regresyonları olduğunu görmek olacaktır. Bugün sadece Üstat ve Şube-A'nın iyi olduğunu ve Şube-B'nin bozuk olduğunu söyleyebilirsiniz.
Matthieu Napoli

@ Matthieu Ne elde ettiğinizi anlıyorum. Özel bir kategoriye veya "hey, eğer bu test başarısız olursa, sorun değil. Tamam olduğunu biliyoruz." biz şimdi
kırmak

@Earlz Kesinlikle! Ne merak ediyorum "biri tarafından, bir yerde yapılır mı? Ve bunu destekleyen araçlar var mı (CI ve birim test kütüphaneleri?" Çünkü eğer bu testleri sadece klasik CI ve birim test araçları ile kategorize edersem, yapı her zaman Yine de başarısız ve hangi testler başarısız arasında bir fark görmeyeceğim ve bu yüzden yararlı olmayacaktır: /
Matthieu Napoli

4

Başarısız testlere sahip bir ana dal verildiğinde, bu listeyi önceki yapılarla karşılaştırmadan - hataları tanıtmadığınızdan nasıl emin olabilirsiniz?

Başarısız testlerin sayısını izlemek yeterli değildir: bir testi düzeltebilir ve diğerini kırabilirsiniz. Ve tatildeyseniz, başarısız yapıya bakan başkaları için net olmayacaktır.

Ana dalınızı her zaman temiz ve yeşil tutun . Bir dalda çalışın. Şubeyi CI altında, ayrı bir işte tutun ve kalbinizin içeriğinde başarısız testler yapın. Sadece ustayı kırma.

Şubenin denetçisine yalnızca tüm testleri geçmesi durumunda şubenizi birleştirtirin. (Daha güçlü: İncelemeyi, şubeyi master'a birleştirmenin sonucu tüm testleri geçerse, şubenizi birleştirebilmesini sağlayın!)


2
Simply tracking the number of failing tests is insufficientolası tek metrik bu değil. Örneğin: Branch-A improves it to 40 tests (80% passing) with no regression. Regresyon olmaması, daha önce geçen testlerin her zaman geçtiği anlamına gelir. Kısacası, bir testin hiç geçmediği sürece başarısız olmasına izin verilecektir. Bana öyle geliyor ki, ana dallarda başarısızlık testlerini yasaklamakla iyi şeyleri kaçırıyoruz. (elbette farklı çalışan araçlar gerektirir: birim testleri, CI, ...)
Matthieu Napoli

Hala benim açımdan duruyorum: efendi her zaman yeşil olmalı , çünkü açık ve net. Elbette, bir özellik dalında işaretleyici testleri başarısız oluyor. CI insanlara olağanüstü hataları hatırlatmaya devam edebilir.
Frank Shearar

Bence Matthieu'nun önerdiği şey, ustanın her zaman yeşil olmaktan sapmaması değil, biraz farklı bir "yeşil" tanımıdır. Bana mantıklı gelmediği açık değil - elbette izleme için tamamen önemsiz bir araç gerektirmez. (? Geri rulo bu test geçişi devlet aniden kırmızı olduğunu yollarla eğer Kötü şans ... yapılan bir değişiklik ile İhtiyaç)
Christopher Creutzig

NUnit, yok sayılan bir test kavramına sahiptir. Bu bir alternatif olabilir: kaçmazlar, bu yüzden başarısız olmazlar, ancak yine de göz ardı edildiği bildirilmektedir.
Frank Shearar

2

Sürekli entegrasyonla ilgili iyi anlaşılmış ve kabul edilmiş uygulamaları atmadan sorunlarınızı çözmenin yolları vardır.

Bir bilete karşılık gelen bir 'kırık test' yapma sorunuyla başlayacağım. Bir çözüm, sorunu açığa çıkaran bir veya daha fazla kırılma testi oluşturmak, ardından sorunu gerçekten düzeltmektir , böylece ana kod satırına tekrar birleştirilebilirler. İkinci çözüm, kırık testlere sahip olmaktır , ancak yapıyı gerçekten çalıştırmamak ve kırmamak için bir tür yoksayma bayrağı kullanın . Muhtemelen bir yorum veya bunun için kırık bir test olduğunu çok açık hale getiren özel bir açıklama ekleyinTicket#N . Ayrıca biletin kendisine, imzalanmamış ve çalıştırılmayı bekleyen oluşturulan testlere atıfta bulunan bir not ekleyin . Bu, bir kişinin bileti düzeltmesine yardımcı olur, ancak aynı zamanda testten geçen biri için kırmızı bayrak olmaz.

Ve TDD ile bir sonraki probleminize. TDD küçük bir test yazmak ve daha sonra bu testi geçmek için küçük bir kod parçası yazmakla ilgilidir . Ardından, küçük bir işlevsel modülünüz olana kadar yinelemeyi sürdürün. 4-5 test yazarsanız, tatile çıkarsanız yanlış yapıyor olabilirsiniz. Programı birinizle testi, diğeri karşılık gelen kodu yazacak şekilde eşleştirebilirsiniz. Ancak, tamamlanmış bir modül işlenmeye hazır olmadan önce bu kodu ikiniz arasında paylaşmak için ana kod satırı deposunu kullanmamalısınız. Diğerlerinin önerdiği gibi, paylaşılan bir şube sorunlarınızı orada çözecektir.

Sürekli entegrasyon mantrasını kırmaya çalışmak, beklenmedik ve korkutucu yollara yol açabilir. Örneğin, bu tür bir ortamda kod kapsamı ne anlama gelir ? Geliştiriciler sistemin birçok " Bozuk Penceresi " olduğunu nasıl hissetmezlerdi ? Nasıl bir değişiklik yapılır, testi çalıştırır ve gerçekten yeni bir şey kırıp kırmadıklarını, ya da sadece eski şeyleri bilebilir mi?


Programlama yaptığınız kişiyle paylaşmak için herhangi bir alete ihtiyacınız yoktur - sadece klavyeyi verin. Farklı bilgisayarlar kullanıyorsanız, bununla ilgili yanlış bir şey yok, sadece "çift programlama" değil.
Christopher Creutzig

1

Bence temel probleminiz test SONUÇLARINI yapının bir parçası olarak dahil etmenizdir. Açıkçası bazı insanlar sizinle aynı fikirde olsa da, diğerleri aynı fikirde değil. Yapıyı kırma, oluşturmadığı zaman gerçekleşir. Hatasız inşa etmediğinde değil.

Windows veya Linux gibi büyük bir projeyi, hatta Firefox gibi bir şeyi düşünün - sence hatasız mı geliyorlar? Tabii ki değil. Şimdi bu projeler TDD yapmıyor, ama bu gerçekten alakasız - TDD iki temel gerçeği değiştirmiyor: hatalar var ve bunları düzeltmek zaman alıyor. Bir projenin (açık kaynaklı veya değil) düşük öncelikli hataları boşa harcayamayacağı zaman. KDE son zamanlarda on yıldan eski bir hatayı düzeltti. En son ne zaman birinin "projemizi göndermek için on yıl beklediğimize sevindim" dediğini duydunuz?

TDD, bir bakıma, muhtemelen hatalarla gemi göndermeyi kolaylaştırır - çünkü kusurun ne olduğunu daha iyi anlarsınız. Hatanın nedenini kesin olarak tanımlayabiliyorsanız, düzeltmenin maliyetini tartmak için mükemmel bir temeliniz vardır.

Benim tavsiyem yeşilin içinde biraz kırmızı olmayan bir proje bulmak.


1
 > a common best practice is to have all the tests passing (green) at all times.

Tüm testlerin başarısız olmasını (kırmızı değil) tercih ederim .

Bu biraz farklı tanım sayesinde,

  • henüz uygulanmadı (NotImplementedException varsa rahibede gri)
  • başarısız olduğu bilinen = "yok" ifadesi, testi yok sayıldı olarak işaretleyerek / ek açıklama ekleyerek (sarı)

Bunları depoya kontrol ediyorum, sürekli yapınız bozulmamış ve bu nedenle geçerli değil.


0

İki farklı CI yapısı "kavramı" düşünebilirsiniz.

  1. Düzenli CI yapıları. Düzenli CI derlemesi, yalnızca geçmesi için kodun yazıldığı testleri derlemeli ve çalıştırmalıdır, böylece test geçişi / başarısızlıklarının CI raporları, kodun daha önce kabul edilen durumuna karşı açık, açık bir regresyon göstergesidir.
  2. "Gelecek" bir CI derlemesi. Bu derleme, yalnızca hiçbir kodu yazılmamış olan testleri derler ve çalıştırır. Böyle bir teste sahip olmanın birkaç nedeni olabilir:

    • Sorun izleyiciden, henüz düzeltilmeye çalışılmayan belirli hata durumları için testler eklenebilir. Düzeltmeden bile bir sorun için zaten kodlanmış, çalışan bir teste sahip olmak açıkça yararlıdır.

    • Henüz uygulanmamış yeni gerekli işlevler için testler eklendi.

    • Çoğu zaman, bir hatanın veya özelliğin nasıl test edileceğini bilmek, özelliğin veya düzeltmenin nasıl uygulanacağını bilmekten daha kolaydır ve testi kaynak kontrolüne göndererek iki adımı ayırmak, hiçbir bilginin kaybolmamasını sağlamak için yararlı olabilir.

"Standart" CI'de olduğu gibi, düzenli geliştirme rejiminde ekip sadece normal yapının günlük inşa sonuçlarına bakacaktır.

Ekip ayrıca "gelecekteki" CI yapısından test senaryolarının gelişimini de izleyebilir - özellikle de düzenli CI için yapılan herhangi bir değişikliğin gerçekten "önemli" bir gösterge olabilen "gelecekteki" yapının sorunlarını çözüp çözmediğini görmek için altta yatan sorun veya tasarım iyileştirmesi.

Son olarak, bir ekip üyesinin ellerinde fazladan zaman varsa, sorunlardan birini "gelecek" ten düzeltmeye bakabilir ve başarılı olursa "normal" e geçirir (sorun izleyici durumunu güncellerken).


0

Reponuzda başarısız testlerin yapılmasının kötü bir şey olduğuna inanmıyorum, izleyicinizde açık sorunlar olması gibi. Bunlar düzeltilmeyi bekleyen şeyler.

Sorun testlerin başarısız olmasından kaynaklanmıyor, basit, bağlamsız bir gerileme göstergesi. Aka: Bir geliştirici olarak, tek bir göstergeyi kontrol edebilir ve bir regresyon veya kırılma kodu ekleyip eklemediğimi öğrenebilir miyim.

'Yumuşak' arızalar kavramını tanıttığınız anda (tamam, üzerinde çalışıyoruz / henüz uygulanmadı / yeni sürümü bekliyoruz / bu diğer yapı düzeltildikten sonra tekrar geçecek), ihtiyacınız var beklenen durumu öğrenmek için koşabilecek veya teste bakabilecek herkes. Hangi takım yeterince büyük bir takımda değişecek: göstergeniz anlamsızlaşacak. Daha küçük bir bağlamda (örneğin ekip özel entegrasyon testi), o zaman teknik borç gibi olduğunu ve tamam olduğunu düşünüyorum - sadece yönetilmesi gerekiyor.

'Yeşil / geçiş' olan çoğu araç adresinin yolu, beklenen sonucun ne olduğunu yansıtır - kodun çalıştığını değil:

  • Fitness, beklenen başarısızlık kavramına sahiptir.
  • JUnit'in @Ignored / @Test vardır (beklemek =)
  • Salatalık 'henüz uygulanmadı' (veya her ne denirse) durumuna sahiptir

Bunlar kendi sorunları ile gelirler ('evet, bunun kırıldığını biliyoruz, üzerinde çalışıyoruz' ve 'doğru davranış bir istisnadır' arasında nasıl ayırt edersiniz) - ama yardımcı olurlar.


0

Atlanmış testler kullanıyorum.

Kullandığım belirli birim test çerçevesinde SkipTest istisnasını yükseltebilirim. Test aslında çalışmaz ve başarısızlığı derlemeyi bozmaz. Ancak, atlanan testlerin sayısını görebilir ve bu alanda yapılacak iş olup olmadığını görebilirim.

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.