TDD, yeni testler eskileri henüz uygulanmadı


13

Test odaklı geliştirmeyi deniyorum ve sık sık aşağıdaki duruma geldiğimi fark ettim:

  1. Bazı işlevler için testler yazıyorum X. Bu testler başarısız oluyor.
  2. X'i uygulamaya çalışırken, kodumun alt katmanında bazı Y özelliklerini kullanmam gerektiğini görüyorum. Yani...
  3. Y için testler yazıyorum. Şimdi hem X hem de Y için testler başarısız oluyor.

Bir kez aynı anda çalışılan farklı kod katmanlarında 4 özellik vardı ve ben aslında ne yaptığım (aynı anda çok fazla test başarısız) odaklanmak kaybediyordu.

Sanırım testleri yazmaya başlamadan önce görevlerimi planlamak için daha fazla çaba harcayarak bunu çözebilirim. Ancak bazı durumlarda daha derine inmem gerektiğini bilmiyordum, çünkü alt katmanın API'sını çok iyi bilmiyordum.

Bu gibi durumlarda ne yapmalıyım? TDD'nin herhangi bir tavsiyesi var mı?

Yanıtlar:


9

İyi bir şey, test altındaki kodun yardıma ihtiyacı olduğunu anlamanızdır. Hemen uygulamak yerine, bir arayüz oluşturun ve testlerinizin doğru kodu hedeflediğinden emin olmak için alayları kullanın. Bu testleri geçtikten sonra, dayandığı kodu uygulamaya geçebilirsiniz.


Testlerim genellikle bir yöntemin dahili olarak ne yapması gerektiği hakkında bilgi sahibi değildir (hangi alt düzey API'yi çağırmak için fe). Sadece test edilen kodda neye ihtiyacım olursa olsun testleri yapmalı mıyım?
liori

2
Benzer şekilde, test edilmiş sınıflarınız 'alt katmanların' ne yaptığına dikkat etmemelidir. Gerçek sınıflar / nesneler yerine alayları / saplamaları kullanın. Bu, tasarımda biraz daha fazla çaba gerektirebilir, ancak daha az eşleştirilmiş ve yeniden kullanımı daha kolay olan kodla sonuçlanır.
Mayıs'ta

1
Bağımlılık enjeksiyonu kullanıyor musunuz? Alt düzey endişeleri daha üst düzey sınıflardan kolayca ayırabilirsiniz. Test edilen sınıfınızda, testinizde arayüzler için alaylar oluşturduğunuz bağımlılıkları (arayüzler olarak) için parametreler içeren bir kurucu vardır. Temel olarak, daha düşük düzeydeki hizmetleri zaten uyguladığınızı iddia ediyorsunuz.
Michael Brown

@Mike Brown, evet, biliyorum. Sahte nesneler oluşturabileceğimi biliyorum. Ama sonra özellik testimde Xbağımlılıkların hangi kısmının Xalay edeceğimi bilmeliyim . Bunun testlerin bir parçası olmaması gereken uygulama ayrıntılarının bir parçası olduğunu hissediyorum - aksi takdirde uygulamayı yeniden düzenlerken testleri değiştirmem gerekebilir. Bunun için endişelenmeli miyim?
liori

1
Hiç de değil ... testler, test edilen sistemin varsayımlarını yansıtmalıdır. Ayrıca, sistemin ihtiyaç duyduğu hizmetlerden ihtiyacınız olanı ortaya çıkarmanıza yardımcı olur. Bu konuda seninle aynı fikirdeydim ama özyinelemeli programlamayı nasıl anladığımla karşılaştırdım. Önce kodu, istediğinizi yapan bir işleve sahip olduğunuzu varsayarak yazarsınız. Sonra istediğinizi yapan kodu yazın.
Michael Brown

4

Saplamalar ve alaylar, henüz değiştirilmeyen / uygulanmayan işlevselliği simüle etmek için kullanılabilir. Ayrıca, bu tür 'zincir reaksiyonu'na neden olan bağımlılıkları çözmenize yardımcı olabilirler.

Öte yandan, belki de bir sonraki değişikliği yönlendiren sadece bir (başarısız) test tutmak en iyi yaklaşımdır.

Yeni işlevselliğe dayanan kodu hedefleyen diğer testler, bu noktada gerçekten alakalı olmadıkları için termporarly devre dışı bırakılabilir. sizin durumunuzda, Y vb. uygulayana kadar X testlerini devre dışı bırakın.

Bu şekilde, sadece istediğiniz şey olan bir sonraki değişikliğe odaklanabilirsiniz.


Ha, IDE'mdeki bir test çalıştırması sırasında testi kapatan bir özellik aradım ve bulamadım. Şimdi python'un unittestzaten test atlama olduğunu buldum . Bu benim için yeterli olabilir.
liori

Google test C ++ framework'ü kullanıyoruz ve testleri devre dışı bırakma seçeneği var. Devre dışı bırakılan testler yürütülmez, derlenir - ihtiyacınız olan anda - çalışmaya hazırdırlar (ayrıca, devre dışı bırakılan testlerin 'yürütülmesini zorlayabilirsiniz' - bir tür 'çalışma zamanı izni') - mükemmel özellik ...
ratkok

3

Dur

Burada iki ayrı sorun olabilir:

  1. bazı hikayeleri ve test senaryolarını unuttun ve belirli bir test senaryosu üzerinde çalışmaya başlayana kadar bunları keşfetmedin ve / veya

  2. aslında TDD özellik testi değil, birim testi yapıyorsunuz

1 numara için durun , geri dönün ve hikayeleri güncelleyin ve senaryoları test edin, ardından farklı bir senaryo ile başlayın.

2. için durdurma istihdam mocks diğer arayüzleri örtbas ve / veya test geçiş yapmak için daha fazla kod uygulamak için çok ve, sen özelliklerini değil, birimler test etmekte olduğumuzu hatırlamak olmadan yeni test senaryoları ekledi. Bu, test senaryolarını kaçırmadığınızı varsayar, ancak bunun yerine - ve bu gerçekten yaygındır - birim testi ve TDD'yi karıştırır.


Cevabınızı gerçekten seviyorum, gerçekten neler olduğunu açıklamak daha iyi bir iş çıkarıyor.
maple_shaft

... Bununla birlikte, dünyada "DUR, geri gitmemiz gerek" ifadesinde aklını tamamen kaybetmeyecek bir PM bilmediğim söyleniyor. Projeyi ilerletmek için sunakta ilk doğanlarını feda etmeden her şeyi deneyecekler, teknik borç ve eksik birim testleri lanetlenecek. Sanırım bir organizasyondaki tek ölçüleri projeyi zamanında bitirirken onları suçlayamazsınız. Bazı kuruluşlar sadece kaliteye göre zamana değer veriyorlar ve bu yüzden TDD'nin bu tür organizasyonlarda başarılı bir şekilde çalıştığını görmedim, maalesef bunların çoğu IMO.
maple_shaft

@maple_shaft: Yeniden gruplandırmayı bıraktığınız süre sadece birkaç saat olabilir - işleminiz yoldan çıkmadığı sürece, tabandan uzaklaşır, bu durumda tekrar izlemek için birkaç gün durmanız, proje başarılı olacak. Tam pistin yanlış yolda ilerlemesinin bir anlamı yok!
Steven A. Lowe

0

Bu, TDD için de benim için harika bir soru ve BÜYÜK bir hayal kırıklığı. Geliştirmeye başlayana kadar hangi alt seviye bileşenlere veya özelliklere ihtiyacınız olduğunu bilmenin hiçbir yolu olmadığı bu senaryoda TDD eksik gibi hissediyorum.

Şahsen TDD'nin sadece ne yapmanız gerektiğini ve bir özelliği gerçekleştirmek için neyi çağırmanız gerektiğini biliyorsanız çalıştığını gördüm. Geliştiriciler başlamadan önce her şeyi her zaman bilmiyorlar, bu yüzden tanımladığım durumu hafifletmek için kendimin en iyi yolunu buldum:

Prototip

Teknik bir soruna yönelik yöntem ve yaklaşımları keşfetmek ve keşfetmek için basit prototip uygulamaları yaptığımda, birçok bacak çalışmasını keşfedip başlamadan önce bu araştırmayı yolumdan çıkarıyorum. Tasarım ve tahmin de çok daha kolay hale geliyor.

Eğer prototip uygulama haline gelecek şekilde dahil edilmişse, o zaman tembel bir şey yapmamanızı ve gerçekte sonra prototipiniz için birim testleri oluşturmanızı öneririm.

Bu noktada daha düşük seviye API hakkında daha fazla bilgi sahibi olmanız ve daha yüksek seviye bileşenlerinizde daha düşük seviye API ile başarılı bir şekilde bağlantı kurabilmeniz gerekir.


Yani aslında bazı keşifsel kodlamayı gayri resmi (= resmileştirilmiş bir metodoloji ile gitmemek) yaparak planlama aşaması için daha fazla bilgi almayı öneriyorsunuz. Ve sonra gerçek kodu planlamak için yeterli bilgi vereceğini varsayın. Haklı mıyım?
liori

Neden prototiplemenin gayri resmi bir süreç olduğunu varsayıyorsunuz? Her tahmin, prototip oluşturmayı ve proje çizelgelerini gerekli geliştirme görevinin yanı sıra bunu da hesaba katmalıdır. Tasarım veya Kod İnceleme ile aynı görüyorum. Bu notta çok fazla bilinmeyen görevlerde resmileştirilmiş ve açıklanması gerekmektedir. Prototip oluşturma ve Konsept Kanıtı gerçekleştirme yeteneği olmadan, TDD'yi takip etmek, geliştiricilerin TÜM özelliklere sahip HER ŞEY hakkında her şeyi bildiğini varsayar. Gerçek dünya bu şekilde çalışmaz ve sizin ne kadar zeki veya deneyimli olduğunuzu umursamıyorum.
maple_shaft

"Gayri resmi yol" ile, prototipleme zamanının hesaba katılmaması gerektiği anlamına gelmiyordu, ancak prototipler yaparken TDD'yi veya başka bir kod yöntemini takip etmiyorsunuz.
liori

TDD Birim Test ve Geliştirme için bir metodolojidir. Kod İncelemesi için TDD yapmak mantıklı olur mu? TDD, Tasarım, Teknik Özellikler veya Beyaz Tahta Yazımı için anlamlı mı? Prototip oluşturma kendi başına bir görev, araştırma, kavram kanıtı ve eğitim için keşifsel bir geliştirme türüdür.
maple_shaft

1
TDD prototipleme için mükemmel bir mantıklı. Ne olursa olsun (nesne, işlev, API, tüm program) şeyleri tekrarlanabilir, yürütülebilir bir gereksinimler kümesi şeklinde hızlı bir şekilde ortaya çıkarmanızı sağlar. Kendinize bir iyilik yapın ve Testler Rehberliğinde Büyüyen Nesne Odaklı Yazılım okuyun ; tüm bir uygulamayı (entegrasyon dahil) önce test edilerek oluştururken adım adım ilerlemenizi sağlar.
Frank Shearar

0

TDD yaparken ne tür sınavlar yaptığınıza bağlıdır.

Klasik model birim testleri yazmak ve testi kodun diğer "birimlerinden" ayırmak için alay veya saplamaları kullanmaktır.

ATDD, testin tam bir yığın veya neredeyse tam yığın testi gibi birçok alternatif model vardır. Bu durumda, gerekli program davranışını iddia eden yazma testleriniz tek bir kod birimi değil, bu yüzden başka testler yazmazsınız. Testi tatmin etmek için ekipmanı gidiş-dönüş alırsınız. Daha sonra diğer özellikler / davranışlar için başka testler eklersiniz.

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.