Aşağıdaki TDD kaçınılmaz olarak DI'ya yol açıyor mu?


14

Teste Dayalı Geliştirme (TDD), Bağımlılık Enjeksiyonu (DI) ve Kontrolün İnversiyonu (IoC) aynı anda yapmayı öğrendim. TDD kullanarak kod yazdığımda sınıfımın yapıcılarında daima DI'yi kullanıyorum. Bunun TDD yapmayı nasıl öğrendiğimden mi yoksa TDD'nin doğal bir yan etkisi mi olduğunu merak ediyorum.

Benim sorum şu: Harici hizmetlere bağlı olmayan TDD ilkelerini ve yazma birimi testlerini kaçınılmaz olarak DI'ye götürüyor mu?


8
Birim Testi Sanatı'nı okuyorum ve kesinlikle Bağımlılık Enjeksiyonuna (DI) yol açtığı görülüyor.
programcı

2
Peki bu hangi dilde? Java'da DI / etc gereklidir, ancak bunun nedeni bir dil sınırlamasıdır - Python gibi diller, testlerde yama bağımlılıklarını maymunlaştırabileceklerinden buna ihtiyaç duymazlar.
Izkata

@Izkata: DI'nin dil sınırlaması için bir geçici çözüm olduğunu kabul ediyorum; ancak maymunsu yetiştirme, daha az katı dillerde zorunlu olarak aynı şey değildir. Diğer yolların yanı sıra, DI'nin disipline göre yaklaştırdığı şeyi doğal olarak yapmanıza izin veren birinci sınıf fonksiyonları tercih ederim.
Javier

Yanıtlar:


19

Veritabanlarına veya harici hizmetlere bağlı olmayan TDD ve yazma birimi testlerinin yapılması kaçınılmaz olarak DI'ya yol açıyor mu?

Geniş DI tanımları için, evet. Sınıflar bir vakumda mevcut değildir, bu nedenle bağımlılıklarının bir şekilde doldurulması gerekir. Bazen sadece bir değer sağlamak iyidir. Bazen yapıcıda bir alay sağlamanız gerekir. Bazen IoC kapları aracılığıyla. Bazen özel test erişimcisi aracılığıyla. Her şey sınıfa bir miktar test enjekte eder, böylece tek başına çalışabilir.


9

DI'yi zaten bilen, ancak daha önce hiç görmemiş insanlar için, birim testinin neredeyse DI'yi kullanmaya yol açacağını düşünüyorum.

Eğer varsa yok DI hakkında bilmek ve yazma birimi testlerinde çalışıyoruz, bazı insanlar doğal bazı sinirli alacak DI, yeniden icat ve sonunda araştırma yoluyla DI keşfetmek, ancak sadece birine gerçekleşmeyecek ne sıklıkta şaşıracaksınız olacak birim testlerini kolaylaştırmak için yazılımlarını yapılandırmanın daha iyi bir yolu olabilir. Bu insanlar birim testlerini inatçı ve pes etmeksizin yazarlar.


8

Birim testi DI'ye yol açacaktır (gevşek bağlı birimler oluşturmaya zorladığınız için). TDD zorunlu olarak değildir, çünkü TDD "birimsel" birim testleri yerine katman katman testler oluşturmak için de kullanılabilir. Bu makaleye bakın

http://stephenwalther.com/archive/2009/04/11/tdd-tests-are-not-unit-tests.aspx

farklılıkların açıklaması için.


1
"TDD UT değil" için +1. Ayrıca aşırı ayrılmanın TDD'nin (zorunlu olarak) değil, UT'nin ortak bir sonucu olduğunu kabul etmek için.
Javier

3

Evet ve hayır: TDD, DI ile sonuçlanan iyi yapılandırılmış bir kod yazmaya yol açar.

Demek istediğim, TDD genellikle kapsülleme, SRP ve tekrar kullanılabilirlik konusunda size doğru yolu gönderiyor. Bu sadece kodunuzun etrafında bazı testler yapmakla ilgili değildir: daha iyi bir tasarım elde etmek için bu testleri kullanmakla ilgilidir. Bir nesne kendi bağımlılıklarını yaratırsa, o zaman belirli bir uygulama içinde belirli bir bağlam içinde yaşar ve muhtemelen uygulamaya daha büyük ölçüde dokunur. DI sadece test açısından değil, aynı zamanda kod kalitesi açısından da iyi bir şeydir.


Evet ve hayır cevabınızın hiçbir kısmını açıklığa kavuşturabilir misiniz? DI olmadan TDD nasıl yapılır.
Gilles

'Hayır' kısmı, bunun TDD ve DI arasında doğrudan bir bağlantı olduğunu düşünmüyorum. Kod kalitesi ile dolaylı. Bu muhtemelen saçları bölüyor, ama sadece kod kalitesinin sadece test edilebilirlik değil, amaçladığınız şey olduğuna dikkat çekeceğimi düşündüm.
Tim

0

Diğer cevaplarda da belirtildiği gibi, TDD birim testleri gerektirmez . TDD yaparken entegrasyon / fonksiyonel testler de yazabilirsiniz. TDD'yi uygulamanın birkaç yolu arasında, birim testlerin oluşturulması "siz gerçekleştirene kadar sahte" yöntem olacaktır (ayrıntılar için Kent Beck'in kitabına bakınız).

"TDD kaçınılmaz olarak DI yol açar" gelince, kesinlikle değil. Birim testleri yazarken ihtiyaç duyulan şey, test edilen birimi harici bağımlılıklarının uygulamalarından izole etmektir. Ve bu DI ile veya DI olmadan da kolayca yapılabilir. Muhtemelen en iyi yol, uygun bir izolasyon / alay aracı kullanmaktır.


Ama alayları kullanmak için mutlaka sınıftaki bağımlılıkları enjekte etmemelisiniz?
Gilles
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.