JUnit sınıflarının özel test paketine ayrılması?


118

Okumayı yoluyla Test-Driven Development kavramlarını öğreniyorum Zanaatkar makaleler (tıklayın Zanaatkar altında By Konu ) benim önceki soruya, bir cevap önerilir "JUnit ve uygun yazılım mühendisliği öğrenme için örnek proje" . Şimdiye kadar seviyorum!

Ama şimdi oturup kendim denemek istiyorum. Sadece basit bir cevaba ihtiyaç duyacağını umduğum bir sorum var.

JUnit test sınıflarınızı ve gerçek kodunuzu nasıl düzenlersiniz? Esas olarak paket yapısından bahsediyorum, ancak diğer not kavramları da yardımcı olacaktır.

Test sınıflarını org.myname.project.test. * 'A ve normal kodu org.myname.project. *' A mı koyuyorsunuz? Test sınıflarını normal sınıfların yanına koyuyor musunuz? Sınıf adlarının son eki yerine Test ile önek olarak eklemeyi mi tercih edersiniz?

Bunun, bu kadar yakında endişelenmemem gereken bir şey gibi göründüğünü biliyorum, ama ben çok organizasyon merkezli bir insanım. Ben neredeyse oldukça aslında işlerin yapılmasında daha halletmek ne takip etmek için yöntemler bulmaktan daha fazla zaman harcıyor kişinin tür.

Ve şu anda düzgün bir şekilde paketlere bölünmüş bir projem var, ancak proje karmakarışık oldu. Her şeyi yeniden düzenlemeye ve testler yazmaya çalışmak yerine, ilk ve her şeyden önce testlere baştan başlamak istiyorum. Ama önce testlerimin nereye gittiğini bilmem gerekiyor.


düzenleme: Maven'i tamamen unuttum, ama görünüşe göre çoğunuz onu kullanıyor! Geçmişte, Maven'in beni tamamen bozduğu özel bir kullanım durumum vardı, ancak Ant bana ihtiyacım olan esnekliği verdi, bu yüzden Ant'a bağlandım, ama belki de yanlış yaklaşımı benimsediğimi düşünüyorum. Sanırım Maven'i bir kez daha deneyeceğim çünkü test odaklı geliştirmeyle iyi gidecek gibi görünüyor.


Yanıtlar:


154

Test sınıflarını test ettikleri proje sınıflarıyla aynı pakete koymayı tercih ederim, ancak aşağıdaki gibi farklı bir fiziksel dizinde:

myproject/src/com/foo/Bar.java
myproject/test/com/foo/BarTest.java

Bir Maven projesinde şöyle görünür:

myproject/src/main/java/com/foo/Bar.java
myproject/src/test/java/com/foo/BarTest.java

Buradaki ana nokta, test sınıflarımın paket kapsamı sınıflarına ve üyelerine erişebilmesidir (ve test edebilir!).

Yukarıdaki örnekte gösterildiği gibi, benim test sınıflarımda test edilen sınıfın adı artı Testbir sonek var. Bu, onları hızlı bir şekilde bulmaya yardımcı olur - her birinin adı Test... ile başlayan birkaç yüz test sınıfı arasında arama yapmayı denemek çok da eğlenceli değil .

@ Ricket'in yorumundan esinlenen güncelleme : bu şekilde test sınıfları (tipik olarak), sınıf adlarının proje bazında alfabetik bir listesinde test edilen arkadaşlarından hemen sonra görünür. (Ne kadar bilinçli olarak farkına varmadan, gün geçtikçe bundan faydalanıyor olmam komik ...)

Güncelleme2: Maven gibi pek çok geliştirici (ben de dahil), ancak en azından bir o kadar çok geliştirici var gibi görünüyor. IMHO, "ana akım" Java projeleri için çok kullanışlıdır (projelerin yaklaşık% 90'ını bu kategoriye koyardım ... ancak diğer% 10 hala oldukça büyük bir azınlıktır). Maven sözleşmelerini kabul ederseniz kullanımı kolaydır; ancak değilse, hayatı sefil bir mücadele haline getirir. Görünüşe göre çok farklı bir düşünce tarzı gerektirdiği için, Ant'ta sosyalleşen birçok insan için Maven'i anlamak zor görünüyor. (Ben, Ant'ı hiç kullanmadım, ikisini karşılaştıramıyorum.) Kesin olan bir şey var: Birim (ve entegrasyon) testini doğal, birinci sınıf bir adım haline getiriyor ve bu da geliştiricilerin bu temel uygulamayı benimsemesine yardımcı oluyor.


6
Son ek notuna da katılıyorum. Ayrıca, test sınıfları farklı bir fiziksel klasöre ayrıldığından, alfabetik sıralı sıralamayı gruplandırmaya yönlendirmek için bazı girişimlerde Test ile denemeye ve önek almaya gerek yoktur ve BazıSınıfTest'in daha iyi okuduğunu düşünüyorum.
Ricket

Mükemmel gelenekler +1
whiskysierra

1
Test sınıflarını aynı pakete koymakla ilgili bir şey: paket-özel üyelerin kullanımına izin verirken (bu yüzden bu şemayı da kullanıyorum), aynı zamanda görünürlüğü otomatik olarak test etmeye de izin vermiyor, özellikle. TDD kullanırsanız ve IDE'nizin gerekli yöntem saplamalarını oluşturmasına izin verirseniz. Onları paket-özel görünürlüğü ile oluşturabilir (NetBeans, sana bakıyorum), bu da testinizin mükemmel bir şekilde geçmesini sağlar (bu koçanlara uygulama koyduktan sonra), ancak gerçek kullanımda başarısız olabilir (eklemeyi unuttuysanız public) .
Sergei Tachenov

Bu kongre ilginç olsa da, test paketi büyüdüğünde ne yaparsınız? Diyelim ki sınıfta 6 yönteminiz var, her yöntemin 10 testi var. Sınıfınızda 60 testiniz var mı? Genellikle test sınıfını alt bölümlere ayırırım (yöntem başına bir test sınıfı). Bununla ilgili sorun, test paketinizde birçok sınıf bulabilmenizdir.
mmal Almeida

1
Eclipse'de @Thick_propheT: proje adına sağ tıklayın, Yeni - Diğer ... seçeneğine tıklayın, ardından Java klasörünün içinde Kaynak Klasör'ü seçin. "test" olarak adlandırın. Daha sonra yukarıdaki kurala uymak isterseniz, bu test klasörüne test senaryosu yazmak istediğiniz sınıfın paketiyle aynı adı taşıyan yeni bir paket ekleyin, ardından paketin içine yeni bir JUnit Test Case ( Yeni-Diğer ... yaptığınızda Java / Junit klasörü. bu yeni sihirbazda, test edilen sınıfı belirleyebilir ve test
olayınızı

15

Test sınıflarımı test ettikleri ile aynı pakete, ancak farklı bir kaynak klasör veya projeye koyuyorum . Test kodumu bu şekilde düzenlemek, üretim jar dosyalarının test kodu içermemesi için onu kolayca derleyip paketlememe olanak tanıyor. Ayrıca test kodunun paket özel alanlarına ve yöntemlerine erişmesine izin verir.


12

Kullandığım Maven . Maven'in teşvik ettiği yapı: -

src/main/java/org/myname/project/MyClass.java

src/test/java/org/myname/project/TestMyClass.java

Örneğin, test edilen sınıfın adının önüne Test eklenmiş bir test sınıfı, ana teste paralel bir dizin yapısındadır.

Test sınıflarının aynı pakette (dizinde olması gerekmez) olmasının bir avantajı, sahte test nesnelerini incelemek veya enjekte etmek için paket kapsamı yöntemlerinden yararlanabilmenizdir.


18
<class>Test.javaTest<class>.java
Olduğunu

2
Maven , Maven Surefire Eklentisi belgelerine göre her iki modeli de kabul edecektir .
Elijah Woodward

3
<class>Test.javaIDE arama özelliklerini kullanırken , adlandırma şemasının hem ana sınıfı hem de test sınıfını yakından göstermesini sağladığını ve bu da onu biraz daha iyi hale getirdiğini iddia ediyorum Test<class>.java.
christopheml

1
@christopheml Katılıyorum, şimdi yaptığım şey bu.
Martin

Bu Intellij için çalıştı. MyClassTest.java çalışmadı.
user2761431
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.