Üretimde bir hata bulunduğunda kasten yapıyı bozmalı mıyım?


410

Son kullanıcılar tarafından üretimde ciddi bir hata bulunursa, bu hatayı kapatmak için başarısız bir birim testinin eklenmesi gerektiği ve bu nedenle hata düzeltilinceye kadar kasten yapıyı bozması benim için mantıklı görünüyor. Bunun mantığı, yapının başından beri başarısız olması gerektiği , ancak otomatikleştirilmiş test kapsamının yetersizliğinden kaynaklanmadığıdır.

Meslektaşlarımdan bazıları, başarısız bir ünite testinin kontrol edilmemesi gerektiğini söyleyerek aynı fikirde değildi. Normal TDD uygulamaları açısından bu bakış açısına katılıyorum, ancak üretim hatalarının farklı şekilde ele alınması gerektiğini düşünüyorum - sonuçta neden izin vermek istiyorsunuz? Bilinen kusurlarla başarılı olmak için bir yapı?

Bu senaryoyu ele almak için başka kanıtlanmış stratejileri olan var mı? Yapının kasıtlı olarak kırılmasının diğer ekip üyeleri için yıkıcı olabileceğini biliyorum, ancak bu tamamen dalları nasıl kullandığınıza bağlı.


75
+ 1; çok kışkırtıcı bir soru. Her iki tarafı da görebiliyorum.
Carl Manaster

28
Evrensel bir anlayış olmayan "testleri" dahil etmek için "yapı" terimini kullanıyorsunuz.
Jay Bazuzi,

19
TDD yapıyorsanız, başarısız testini yazarsanız, kodu düzeltin ve sonra check-in yapın . Böylece kırılmış bir yapı oluşmasını önlersiniz.
dietbuddha

7
Aynı mantıkla sorunu çözene kadar müşterilerin canlı örneklerini kapatmalısınız. Hayır, yapıyı bozmamalısın. Geliştiricinin hatayı yönetmesine izin verin, ünite testini ekleyin ve kod birlikte değişir. Tüm süreci kapatmaya gerek yok.
Thanos Papathanasiou

Yanıtlar:


412

Stratejimiz:

Başarısız bir testte kontrol edin, ancak not ile birlikte not verin @Ignore("fails because of Bug #1234").

Bu şekilde, test var, ancak yapı bozulmuyor.

Tabii ki, db dosyasında yok sayılan testi not edin, bu nedenle @Ignoretest düzeltildikten sonra kaldırılır. Bu aynı zamanda hata düzeltme için kolay bir kontrol işlevi görür.

Başarısızlık testlerinde yapıyı kırma noktası bir şekilde takımı baskı altına almak değildir - onları bir sorunla karşı karşıya bırakmaktır. Sorun tanımlanıp DB böceğine dosyalandığında, her derleme için test çalıştırmasının bir anlamı yoktur - bunun başarısız olacağını biliyorsunuzdur.

Tabii ki, hata hala düzeltilmelidir. Ancak düzeltmeyi zamanlamak bir iş kararıdır ve bu nedenle gerçekten dev'in endişesi değildir ... Bana göre, bir hata DB'ye dosyalandığında, müşteri / ürün sahibi bana düzeltilmesini istediğini söyleyene kadar artık benim sorunum değil .


150
+1 "Düzeltmeyi zamanlamak bir iş kararıdır" ile kafasına çiviyi çarptığınızı düşünüyorum - bir geliştirici olarak bir hatanın yapıyı bozup kırmayacağına karar vermek benim kararım değil.
MattDavey

22
Bence bu çok mantıklı bir çözüm. Özellikle küçük kodları kontrol eden bir sonraki adam birdenbire "başarısız test" uyarısı alır ve bunun yaptığı bir şey olduğunu düşünür.
Holger

14
"Bana göre, bir hata DB'ye dosyalandığında, artık sorun değil" ... +1
Jake Berger

20
@anon Toyota’da Exept. Bir hat işçisi bir kusur görür, sonra andon kordonu çeker ve tüm tesis durur ve yönetim sona erer ve sorun çözülene kadar hat yeniden başlatılmaz. Google Andon Kordon. Bu yeni bir kavram değil. bakınız: startuplessonslearned.com/2008/09/…
Christopher Mahan

4
@AndresJaanTack: Bu elbette metodolojinize bağlı olacaktır, ancak genel olarak aynı fikirde değilim. En azından bir iş ortamında, iş zamanlaması bir iş kararıdır - ve hata düzeltmeyi de içerir . Bazen, yeni bir özellik (veya belirli bir tarihte serbest bırakmak), (küçük) bir hatayı düzeltmekten daha değerli olabilir - bu durumda hata düzeltmesinin ertelenmesi gerekir. “Bugünü düzeltmek” bu durumda uygunsuz olur çünkü daha önemli işleri geciktirir.
sleske,

106

Bir yapının bilinen kusurlarla başarılı olmasına neden izin vermek istiyorsunuz?

Çünkü bazen, zaman kısıtlamalarınız olur. Veya böcek o kadar küçüktür ki, birimin test edilmesi ve düzeltilmesi için gereken birkaç gün boyunca ürünün sevkiyatını geciktirmeye değmez.

Ayrıca, her hata bulduğunuzda kasten yapıyı kırmanın amacı nedir? Bulduysanız, tüm ekibinizi rahatsız etmeden düzeltin (veya düzeltecek kişiye atayın). Bir hatayı düzeltmeyi hatırlamak istiyorsanız, hatayı izleme sisteminizde çok önemli olarak işaretlemeniz gerekir.



3
Cevabımın ikinci paragrafına bakınız.
Arseni Mourzenko,

8
Anladığım kadarıyla, konunun ilk paragrafınızda özetlendiğini düşünüyorum - hatanın ciddiyetini yargılamak, geliştiriciye bağlı değil mi, yoksa bir gösteri durdurucu olup olmadığına bağlı değil, bu daha geniş bir iş için bir karar.
MattDavey

4
Soru, bu hatanın önceliği nedir? ŞİMDİ bir OMG FIX IT olabilir Bu can sıkıcı bir noktada düzeltmemiz gereken ortada bir şey olabilir Yea olabilir. Ancak tüm böcekler bu spektrumdaki aynı yere çarpmayacaktır.
Zachary K,

55

Sorunları tekrar ortaya koymamanızı (-) istemediğiniz için testler yapılır. Başarısız olan testlerin listesi, hata izleme sisteminin yerine geçmez. POV'da başarısızlık testlerinin sadece hataların belirtilmesi değil, aynı zamanda gelişim süreci başarısızlığının (dikkatsizlikten kötü tanımlanmış bağımlılığa kadar) bir göstergesi olmadığına dair bir geçerliliği vardır.


20
"başarısız testlerin listesi hata izleme sisteminin yerine geçmez" +1, ayrıca çok iyi bir nokta :)
MattDavey

1
Daha önce değil, regresyon birim testlerinin hata tabanının bir parçası olarak kod tabanına girmesini öneririm.
yrk

6
@yarek: Regresyon testleri herhangi bir zamanda kod tabanına girebilir, sadece hata düzeltilinceye kadar göz ardı edilmesi gerekir. Genellikle problemi teşhis ederken bunları geliştiririm, çünkü daha sonra hata ayıklama yardımı olarak ikiye katlayabilirler.
Ocak'ta

Bu, "yapıyı kırmanın" neden bir CI'nin "Blame Driven Development" e geliştirdiği bir işyerinin toksik bir parçası haline geldiğinin iyi bir örneğidir. PHB'nin "dikkatsizlik" hakkında sızlanmaya başladığı pek çok toplantıya katıldım, sanki yapı bozuldu. Böyle bir ortamda, yapıyı bozan bir şeyi kasıtlı olarak kontrol edemezsiniz. Aksi takdirde PHB üzülecektir. Yapıyı kır, utanç konisini tak. Ne berbat bir uygulama.
Warren P,

@WarrenP, bazen başka sorunlar var, ama açık olalım, dikkatsizlik bu yapıların kırılmasının ilk nedeni. Bir şeyin yapıyı bozduğunu biliyorsanız, neden kontrol edin?
AProgrammer

23

"Yapıyı kırmak", bir yapının başarıyla tamamlanmasını önlemek anlamına gelir . Başarısız bir test bunu yapmaz. Yapının bilinen bir kusur olduğunu ve bunun tam olarak doğru olduğunu gösterir.

Çoğu derleme sunucusu, testlerin zaman içindeki durumunu izler ve bir regresyona (eklendiğinde ve artık geçmeyen testlerde) eklendiğinden beri başarısız olan bir teste farklı bir sınıflandırma atayacaktır ve gerileme gerçekleşti.


12
Bu her zaman doğru değildir, genellikle ekipler başarısız bir testi kırık bir yapı olarak kabul eder - aslında son zamanlarda gördüğüm takımların çoğu (Bu tipik bir çevik uygulama). Çoğu çevik ekipte başarısızlık testi çizgiyi durdurduğunuz bir durumdur - tüm ekip soruna saldırır ve çözer. Sanırım cevabınızı uygulamalarınıza dayandırmak zorunda olduğu anlamına gelebilir, bu durumda bu tamamen doğrudur.
Bill K,

2
Derlemenin başarısız olduğu anlamına gelen başarısız bir testi her zaman düşünürüm.
John Saunders

@JohnSaunders: Ama bu anlama gelmiyor. Cevabımda dediğim gibi, "derleme kusurları biliniyor" anlamına geliyor.
Ben Voigt

1
@ho hiçbir test olmadığını söyledi? Bunu nereden aldın? Yani, hatayı bulduktan sonraki ilk adımım derlemenin başarılı olmasını engellemek değil, ayrıntılı bir hata raporu oluşturmak. Hata giderildiğinde, önce başarısız bir ünite testi yapılmalıdır.
John Saunders

1
Derhal başarısızlık testi oluşturmada sorunum yok. Sadece derlemede çalışacak bir dizi teste girmesini istemiyorum. Ayrıca, hatayı düzelten geliştiricinin bu testi yoksaymasını da istiyorum. Çalıştığım çoğu yerde, hata raporunu oluşturan insanlar birim testleri oluşturmayacak.
John Saunders

16

Başarısızlık testinin eklenmesi gerektiğini, ancak açıkça “başarısızlık testi” olarak nitelendirilmemesi gerektiğini savunuyorum.

@ BenVoigt'ın cevabında işaret ettiği gibi , başarısız bir test mutlaka " yapıyı bozmaz " anlamına gelmez. Sanırım terminoloji takımdan takıma değişebilir, ancak kod hala derlenir ve ürün hala başarısız bir testle gönderilebilir.

Bu durumda kendinize sormanız gereken şey,

Başarılması gereken testler nelerdir?

Testler yalnızca herkesin kod hakkında iyi hissetmesini sağlamak için varsa, o zaman herkesin kod hakkında kötü hissetmesini sağlamak için başarısız bir test eklemek verimli olmaz. Fakat o zaman, ilk etapta testler ne kadar verimli?

Benim iddiam, testlerin işletme gereksinimlerinin bir yansıması olması gerektiğidir . Bu nedenle, bir gereksinimin gerektiği gibi karşılanmadığını gösteren bir "hata" bulunursa , testlerin işletme gereksinimlerini doğru veya tam olarak yansıtmadığının da bir göstergesidir.

İlk önce düzeltilmesi gereken böcek budur . "Başarısız bir sınav ekleyemezsin". Sen ediyoruz düzelten iş gereksinimlerine daha doğru bir yansıması için testler. Kod o zaman bu testleri geçemezse, bu iyi bir şeydir. Testlerin işlerini yaptığını gösterir.

Kodu düzeltmenin önceliği işletme tarafından belirlenecektir. Ancak testler düzeltilinceye kadar, bu öncelik gerçekten belirlenebilir mi? İş, tam olarak neyin başarısız olduğu, neyin başarısız olduğu ve kararlarını öncelikli olarak almak için niçin başarısız olduğu bilgisi ile donanmış olmalıdır. Testler bunu belirtmelidir.

Tamamen geçmeyen testleri yaptırmak kötü bir şey değil. Önceliklendirilmesi ve buna göre ele alınması bilinen sorunların büyük bir eseridir. Ancak, tamamen test edilmeyen testlere sahip olmak bir problemdir. Testlerin değerini sorgulamaya çağırıyor.

Başka bir şekilde söylemek gerekirse ... Yapı zaten bozuldu. Karar verdiğiniz tek şey, bu gerçeğe dikkat edip etmemek.


1
Sizin iddianız yanlıştır, birim testleri mutlaka doğrudan iş gereklilikleriyle eşleşmez, oysa işlevsel veya uçtan uca testler muhtemelen yapar, ancak OP birim testlerinden / TDD'den bahsediyordu.
John Buchanan,

@JohnBuchanan: Yazılımın yapması gerekeni yapmıyorsa, doğrulanması gereken testler nelerdir? (Gereksinimleri karşıladığı anlamına gelir.) Sizin de belirttiğiniz gibi, birim testleri dışındaki diğer test türleri vardır. Ancak birim testlerinde, bu yazılımın işletmenin ihtiyaçlarını karşıladığını doğrulamayan değeri göremiyorum.
David

1
@JohnBuchanan - "Testler iş gereksinimlerinin bir yansıması" demedi, "OLMALIDIR" dedi. Bu doğru, ancak tartışmalı. Bunun her zaman böyle olmadığını iddia etmekte haklısınız - bazı insanlar iş gereksinimlerine uymayan birim testleri yazıyorlar - (bence) bunu yapmak yanlış. David'in iddiasının yanlış olduğunu iddia etmek istiyorsan, neden böyle düşündüğün hakkında bir şeyler söyleyebilirsin.
Dawood ibn Kareem

13

Test otomasyon ekibimizde, testteki bir hatadan ziyade üründeki bir kusurdan dolayı başarısız oldukları sürece başarısızlık testlerini kontrol ederiz. Bu şekilde, dev ekip için kırdıklarına dair kanıtımız var. Yapıyı kırmak oldukça kaşlarını çattı, ancak bu kusursuz bir şekilde derlenebilir ama başarısız testler yapmakla aynı şey değil.


4
@ MattDavey'nin fikrinin mükemmel olduğunu düşünüyorum ve geçmişte bunun için tartışmıştım. Her zaman bir taş direniş duvarı ile tanıştım - "yapıyı asla bozmamalısınız!" Bu durumda yapının çoktan kırıldığı fikri insanların kavramaları imkansız görünüyor. Ne yazık ki, bu, iyi bir fikrin (otomatik test etme ve temiz inşalar), taraftarları kuralı bilen ancak sebebini bilmeyen bir kargo-kült uygulamasına girdiği başka bir durumdur.
Tom Anderson,

3
Karşılaştığım bir fikir, QA ekibinin (test yazmak için yeterince tekniklerse) hatalar için başarısız testler yazmasına ve bunları kontrol etmesine izin verilmesi gerektiğidir. geliştirme işleminin doğru yolu olan özellikler eklemeye ilişkin hataların giderilmesine öncelik verilmesi.
Tom Anderson,

Ancak bunlar yapım sırasında çalışacak ünite testleri olmamalıdır. Ortamınız KG için bir test yönetim sistemi içeriyorsa (Microsoft Test Yöneticisi gibi), o zaman kesinlikle, bir veya daha fazla test durumu eklenmeli ve hataya bağlanmalıdır, ancak bu derlemenin başarılı olmasını engellemez - bu sadece bir test olur Böcek önce "geçmesi" kabul edilir önce geçmek zorunda durumda.
John Saunders

7

Hata giderilinceye kadar başarısız olacağını bildiğiniz bir testin yazılması iyi bir fikirdir, TDD'nin temelidir.

Yapıyı kırmak kötü bir fikir. Neden? Çünkü hiçbir şey sabitlenene kadar devam edemez demektir. Esasen kalkınmanın diğer tüm yönlerini engeller.

Örnek 1
Uygulamanız birçok bileşenden farklıysa ne olur? Peki ya bu bileşenler kendi serbest bırakma döngüsüne sahip diğer ekipler tarafından çalışıyorsa? Zorlu! Hata düzeltmenizi beklemek zorundalar!

Örnek 2
İlk hatanın düzeltilmesi zorsa ve daha yüksek önceliğe sahip başka bir hata bulursanız ? İkinci böceğin yapısını da bozar mısınız? Artık ikisi de düzeltilene kadar inşa edemezsiniz . Yapay bir bağımlılık yarattınız.

Testin başarısız olmasının bir yapıyı durdurmasının neden mantıklı bir nedeni yoktur. Bu, geliştirici ekibin (belki de yönetim tartışmasıyla birlikte) bilinen hatalara sahip bir derleme yayınlamanın artılarını ve eksilerini tartıştırarak yapması gereken bir karardır. Bu, yazılım geliştirmede çok yaygındır, hemen hemen tüm ana yazılımlar en azından bilinen bazı konularla birlikte yayımlanır .


5

Bu, testlerin oynaması gereken rolüne ve sonuçlarının kabul edilen inşa sistemini / süreci nasıl etkilemesi gerektiğine bağlıdır. Yapıyı kırma anlayışım Ben'inkiyle aynı ve aynı zamanda mevcut testleri kıran kodu da bilerek kontrol etmemeliyiz. Eğer bu testler "sonradan" geldiyse, başkalarını gereksiz yere daha az yıkıcı hale getirmek için onları görmezden gelmek "tamam" olabilir, ancak başarısız testlerden yoksun bırakma (bu şekilde göründüğü gibi) uygulamalarını rahatsız edici (özellikle öyle) buluyorum. ünite testleri için), bu testleri ne kırmızı ne de yeşil olarak göstermenin bir yolu olmadığı sürece.


"Ne kırmızı ne de yeşil gibi testleri belirtmenin bir yolu olmadığı sürece" Sadece kayıt için: Çoğu birim test çerçevesi kırmızı, yeşil ve yok sayılan testleri ayırt eder. En azından JUnit ve TestNG bunu yapar ("xx testi, x başarısız, x yoksayıldı" şeklinde rapor verir).
sleske

Sleske bu ideal olurdu, sadece başarısızlıkları görmezden
gelmenin

SARI inşa değil mi? (Kırmızı / Yeşil / Sarı) Hudson / Jenkins'de, Cruise Control ve diğer tüm çalışanlar?
Warren P,

@Warren P insanlar doğru testleri görmezden geldiğinde işe yarar, ancak bazıları onları yeşil yaparak testleri yok
sayar

5

Tabii ki, bu hataya bağlıdır, ancak genellikle manuel veya otomatik test sırasında tanımlanmayan bir şey yanlış giderse, bu durum kapsama alanında bir boşluk olduğunu gösterir. Kök nedenini bulmayı ve sorunun üzerine bir birim test vakasını koymayı kesinlikle teşvik ederim.

Bir bakım branşından sıcak bir düzeltme yapılması planlanan bir üretim sorunu ise, düzeltmenin ana hat üzerinde çalıştığından ve geliştiricinin, aşırı derecede bir birleştirme çatışması çözümü ile düzeltmeyi yanlışlıkla gideremeyeceğinden emin olmanız gerekir. .

Ek olarak, yayın politikanıza bağlı olarak, yeni güncellenen ünite testlerinin varlığı, bir geliştiricinin sorunu değiştirmek yerine, sadece [(sorun veya testler?)] Değiştirmek yerine sorunu çözdüğünü doğrulamaya yardımcı olabilir. Yeni birim testlerinde doğru gereksinimleri.


5

Yapıya bir başarısızlık testi eklenmesiyle ilgili bir sorun, ekibinizin başarısız testlerden yoksayma alışkanlığıyla karşılaşabilmesidir; Yapım sisteminize bağlıdır, ancak başarısız bir test her zaman "bir şey kırılmış" anlamına gelmiyorsa, başarısız testlere daha az dikkat etmek kolaydır.

Takımınızın bu zihniyete girmesine yardımcı olmak istemezsiniz.

Bu yüzden testi eklemeniz gerektiğine katılıyorum , ancak hata giderilinceye kadar otomatik derleme amacıyla 'yok sayılmış ' olarak işaretleyin .


1
Test yazılımınız, daha önce başarısız olmuş bir sınamaya karşı yeni bir şeyin ne zaman kırıldığını size bildirmelidir.
Ben Voigt

4

Bence bir şekilde testi bir hata olarak 'kontrol etmelisin', bu yüzden bunu düzelttiğinde tekrar olmaz ve bir şekilde öncelik sırasına koyarız, bence yapıyı bozmamak en iyisidir. . Bunun nedeni, müteakip inşa komisyonlarının, kırık testinizin arkasına gizlenmesidir. Bu nedenle, bu hata için kırık bir teste bakarak, tüm ekibin bu hatayı düzeltmek için çalışmalarını bir kenara koymasını talep edersiniz. Bu olmazsa, bu şekilde izlenemeyen ihlal komisyonları ile sonuçlanabilirsiniz.

Bu yüzden beklemede olan bir test olarak kabul etmenin ve ekibinizde beklemede olan testlere girmemek için bir öncelik haline getirmenin daha iyi olduğunu söyleyebilirim.


4

Diğer bir seçenek ise başarısızlık testini kaynak kontrol sisteminizde ayrı bir branşta kontrol etmektir. Uygulamalarınıza bağlı olarak, bu uygun olabilir veya olmayabilir. Bazen devam etmeyen işler için önemsiz olmayan bir hatayı düzeltmek için yeni bir şube açıyoruz.

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.