Test paketleri için adlandırma kuralı


11

Aslında test paketlerimizi tıpkı test edilecek meslektaşları gibi adlandırıyoruz. Böylece bu yapı ile sonuçlanıyoruz:

src/main/java
    com.hello.world
        helloWorld.java
src/test/java
    com.hello.world
        helloWorldTest.java

Sadece paket adıyla sağlandıysa "test" ve "test etmek" arasında ayrım yapamayacağınız için bunun her zaman oldukça akıllı olmadığını hissettim. Diğer yandan bunun bir şekilde önemli olduğu bir dava bulamadım. Her iki paket için de aynı adlandırma kurallarına sahip olmak iyi bir uygulamadır (test senaryoları ve kaynak sınıfları için)? Değilse, daha iyi bir yaklaşım ne olurdu?


1
İyi bir uygulama olup olmadığı hakkında bir fikir yok, ama popüler bir uygulama. Diğer seçenek ("Test" i paket ismine, yöntem isimlerine vb. Koymak) "Smurf nameing" i biraz fazla karıştırır. Söylediğiniz gibi, yalnızca "paket adı ile belirtilmişse" "test" ve "test etmek" arasında ayrım yapamamanın bir sorun olacağını düşünmek zor.
David Arno

@DavidArno Girişiniz için teşekkürler :) O zaman şirin isimlendirmekten nasıl kaçınırsınız? Yani com.hello.world.test.helloWorld.java ile sonuçlanırdık, değil mi?
OddDev

Eğer bir yöntemi varken "Şirin" sorunu daha fazladır XXXTest()içinde com.hello.world.test.helloWorldTest.java. Genel tavsiye, yolda "Test" in yalnızca bir kez görünmesini sağlamaktır, bu nedenle (a) paket adında testi kullanın (ve test dosyasını test edilen dosyayla aynı şekilde adlandırın) veya (b) paket adını aynı ve dosya / sınıf adına "test" ekleyin.
David Arno

@DavidArno Ah, açıklama için teşekkürler! İlk yorumu yanlış anladım. Şimdi anladım.
OddDev

O belli değildi buysa ben iddia ediyorum, ben benim ilk açıklama yanlış :) var
David Arno

Yanıtlar:


11

Bu iyi bir kongre.

Bazen paket-özel sınıflar ve yöntemler için birim testleri de yazmak istersiniz. Başka bir pakete yerleştirilmiş bir birim test sınıfından onları arayamazsınız.

Üretim kodu derlenirken veya çalıştırılırken, sınıf yolunda olmaması gerektiği gibi aynı ad alanında birim sınama sınıflarının bulunması konusunda karışıklık olmamalıdır.

Aşağıda genel arabirime sahip küçük bir modül, genel fabrika sınıfı ve iki paket-özel uygulama sınıfı örneği verilmiştir:

src/main/java:
    com.hello.transmogrifier
        public interface Transmogrifier
        public class TransmogrifierFactory
        class MapTransmogrifier implements Transmogrifier
        class ListTransmogrifier implements Transmogrifier

scr/test/java:
    com.hello.transmogrifier
        public class TransmogrifierFactoryTest
        public class MapTransmogrifierTest
        public class ListTransmogrifierTest

Transmogrifier arabiriminin uygulamalarını gizlemek geçerli bir tasarım seçeneği olabilir. Uygulamayı seçmek belki de fabrika sınıfının sorumluluğundadır.

Uygulamalar pakete özel olduğundan, doğrudan test etmek istiyorsanız birim test sınıflarını aynı pakete yerleştirmeniz gerekir. Ünite test sınıflarınızı başka bir pakette aldıysanız, testlerinizden yalnızca genel arayüze ve fabrika sınıfına doğrudan erişebilirsiniz.


1
"Genellikle paket-özel sınıflar ve yöntemler için birim testleri yazmak istersiniz". Hayır! Bu gerçekten kötü bir uygulamadır. Paket özel türleri uygulama ayrıntılarıdır ve asla doğrudan test edilmemelidir. Yalnızca herkese açık API'ları test edin.
David Arno

1
@DavidArno Kabul etmiyorum. Ancak, bu tartışmayı önlemek için "genellikle" kelimesini "bazen" kelimesiyle değiştirdim.
GELMEKTEDİR

1
İstediğiniz her şeye katılmayabilirsiniz, ancak bir kod parçasının iç işleyişini test etmek, hem bu iç işleyişler hem de testler arasındaki sıkı bağlantıya ve basit yeniden düzenleme sırasında bile kolayca kırılan kırılgan testlere yol açar. Bu çok kötü bir uygulamadır.
David Arno

Tüm Transmogrifier uygulamalarımın çalıştığından emin olmak istersem, fabrika ne yaparsa yapsın, o zaman her uygulamayı test eden birim testleri yazacağım. Sınıflar pakete özel olsa da uygulamaların ortak bir ortak API'sı olduğunu unutmayın. Genel API'yi değiştirmediğim sürece bu testler kesilmemelidir. Aslında, bir Transmogrifier için genel bir test yazıp her uygulamaya karşı çalıştırırım. Her uygulamayı fabrika kullanarak elde etmek mümkün olsa da, Transmogrifiers test ederken bu bağımlılığa sahip olmak daha iyidir.
GELMEKTEDİR

Sonra bir gün, bakmak MapTransmogrifierve ListTransmogrifierve oluşturduğunuz bu yüzden, bir sınıfa yapılmış olabilir karar ListMapTransmogrifier, kullandıkları ve iki sınıfları silmek için fabrika değiştirin. Kod artık derlenmemektedir, bu nedenle her ikisinde de her testi değiştirmeniz MapTransmogrifierTestve ListTransmogrifierTestderlemeniz gerekir. Bir test başarısız. Bu testlerin değiştirilmesi veya yaratılmasından kaynaklandı ListMapTransmogrifiermı? Bulmak için hata ayıklayıcı çıkıyor ... alternatif olarak testler fabrikayı kullandığında, o refactoru yapıyorsunuz ve hepsi hala derleniyor ...
David Arno
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.