Onları düzeltirken her zaman test hatalarını mı yapmalıyız?


29

Hataları düzeltirken, önce verilen hatayla başarısız olan bir testi yazıp, ardından da test geçinceye kadar kodu düzeltmek için çalıştığım yer teşvik edilir. Bu TDD uygulamalarını izler ve iyi uygulama olduğu varsayılır, ancak uygulamaya gerçekten yakın gelen şifreli testler üretme eğiliminde olduğunu fark ettim.

Örneğin, bir iş gönderildiğinde, belirli bir duruma ulaştığında, iptal edildiğinde ve yeniden denendiğinde bir sorun yaşadık. Bu hatayı çoğaltmak için, içinde iplik senkronizasyonu, çok fazla alay konusu ve benzeri şeyler olan çok büyük bir test yazılmıştır. Yeni tasarıma uyması için gerçekten çok fazla çalışma (yine) gerekir. Ve sadece küçük bir özelliği tek bir özel durumda test ediyor.

Bu yüzden benim sorum: üremesi zor olan böcekleri nasıl test edersiniz? Uygulamayı test eden, yeniden yapılanmaya ve okunabilirliğe zarar veren şeyler oluşturmaktan nasıl kaçınıyorsunuz?


Bu hata durumu yeni tasarımla alakalı mı? Bana göre, yeni bir tasarımın parçası, tasarımın güvenilirliğini artırmak olacaktır; bu nedenle, eğer bu tür bir hata orijinal tasarımda bir hatayla ilgiliyse, bu test durumunun kaldırılmasını haklı çıkarmak için kullanabilirsiniz.
Timin

refactor başka bir şeyle ilgili ve yeni tasarımda kodu biraz değiştirmek ve hatayı yeniden uygulamak hala mümkün. Bu da testin izlediği şey. Teste bir alternatif, kodda "bununla yatma" diyen bir yorum olacağını sanıyorum, fakat yapılacak yanlış şey gibi geliyor: p
Zonko

1
en yenisi için çok karmaşıksa, entegrasyon testinin bir parçası haline getirin
kilit manyağı

Bunun gibi bir birim testi değil, bir entegrasyon testi gerekiyor. Çok fazla alay ediyorsun gerçeğine dayanarak. Gördüğüm genel bir kural, kod tabanınızın dışındaki bileşenlerle konuşan bir veritabanını (dosyayla konuşmak, dosya sisteminden okumak, vb.) Sınamak istememenizdir.
Lucas,

Yanıtlar:


27

Evet, genel olarak yapmalısın . Tüm kurallarda olduğu gibi, diğer kurallara aykırı olduğunda en iyi kararınızı kullanmanız gerekir. Bu senaryoda, testin uygulanması ve iş sorununun hedeflenmesinde ve böceğin durumunda gerilemenin yakalanmasında kalitenin gerçekleştirilmesi için gereken işe karşı hatanın ciddiyetinin tartılması gerekmektedir.

Hata denemelerine yapılan kesintiler, basitçe bir birim testini geliştirmekten ve sürdürmekten daha fazla ek yüke sahip olma eğiliminde olduğundan, yazma testlerini tercih etme eğilimindeyim.


Buna daha fazla vurgu eklerim ve ideal bir dünyada sadece başarısız bir ünite testi varsa bunun bir hata olarak kabul edilebileceğini, ancak italik ve iş gereksinimlerinin önüne geçilmesi gerektiğini belirten +1 olduğunu belirtirim .
Joshua Drake

2
Aslında, sonuçta, testin sürdürülmesi için gereken süre ile bir noobun tekrar meydana geldiğinde hatayı tespit etmesi ve düzeltmesi için geçen süre arasında bir denge söz konusudur.
Zonko,

Ben de bir iş olabilir her eyalette de sadece iptal ve belirli düzeye geldiğinde işi yeniden denemeden test değil, daha ziyade iptal testleri ve yeniden denemeden böylece testi genelleme yana olacaktır.
Eski Pro

+1, "böcekleri azaltma kesintileri, yalnızca bir birim testini geliştirmekten ve sürdürmekten daha fazla ek yüke sahip olma eğiliminde olduğundan" için.
Peter K.

16

Bence en iyi uygulama - sık sık takip etmediğimi itiraf ettiğim biri - üretimde gözlenen sorunu gösteren bir sistem veya entegrasyon testi oluşturmak ve ardından problemden sorumlu birimleri bulmak için araştırma yapmak olduğunu düşünüyorum. ve daha sonra problemi birim seviyesinde gösteren birimler için birim testleri yazınız . Birim testlerini yaptıktan sonra, birimleri düzeltin ve tüm testleri çalıştırın. Bu noktada, orijinal testi atmak ihtiyatlı olabilir - kırılgan ve / veya yavaş olabilir - ancak birim testlerini regresyon ve kapsama amacıyla otomatik odanızda tutun.


7

Arızayı tanımlamak için bir test yazma uygulaması iyi bir fikirdir, çünkü arızayı yeniden oluşturmak için tam olarak hangi adımların gerekli olduğunu belirlemenizi ve düzeltildiğini doğrulamanızı sağlar. Ek olarak, bu testler daha sonra yapılan değişikliklerin sisteme eski bir hatayı tekrar eklememesini sağlamak için duman testi veya regresyon testinin bir parçası olarak yapılabilir.

Dikkate alınacak ilk şey, gerekli test seviyesidir. Belki de düzeltmeyi doğrulamak için yapılan test sistem düzeyinde daha uygun olabilir, hatta manuel olarak yapılan bir kabul testi bile olabilir. Özel olarak nasıl uygulandığına bakılmaksızın belgelenmiş ve yönetilen bir test yaptırmanın daha önemli olduğunu düşünüyorum.

Yeniden düzenlemenin testleri nasıl etkilediği ile ilgili spesifik özelliklere bağlıdır. Bazı durumlarda, yeniden düzenleme (veya yeni özellikler gibi herhangi bir iş türü) testleri artık gerekli yapmaz. İlk başta olduğu gibi, sorun artık mümkün olmayabilir. Bu durumda, test sürecinizi (otomatik veya manuel) daha yalın hale getirmek için testi olası testlerden çıkarmak akıllıca olabilir. Diğer durumlarda, testi gerçekleştirmenin ve özelliğin farklı bir seviyede doğrulanmasının daha uygun olabileceği birden fazla yöntem vardır. Özellik küçükse, belki de test artık gerekli değildir.

Ayrıca yalnızca teste güvenmeyi değil, aynı zamanda günlüğe kaydetmeyi de düşünebilirsiniz. Örneğin, çalışma zamanında bilgi yakalama (çevreye bağlı olarak değişken ayrıntı düzeyleriyle - test sırasında daha ayrıntılı, dağıtım sırasında daha az ayrıntıyla), uygulamayı profilleme, sistemin mevcut durumunun dökümlerini yakalama. Sorunun ortak tetikleyicilerini bulabilirseniz, testi tüm düzeylerde yönlendirmek için kullanabilirsiniz.


5

Evet yapmalısın.

Mevcut kod tabanı için birim testleri yazın. Bir hatayı düzeltirken, birim testinizin başarısız olduğundan emin olmanız gerekir - bu size gerçekten bir hata üzerinde çalıştığınız konusunda güven verecektir. Daha sonra hatayı düzelterek yeniden faktörlendirmeniz ve testin geçmesini sağlamalısınız.

Bu olsa da bir TDD uygulaması değildir. TDD testlerinde tasarımınızı yönlendirin, ancak sizin durumunuzda tasarıma zaten karar verildi.

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.