Pemisahan kelas JUnit menjadi paket tes khusus?

118

Saya mempelajari konsep Test-Driven Development dengan membaca artikel Craftsman (klik Craftsman di bawah By Topic ) yang direkomendasikan untuk menjawab pertanyaan saya sebelumnya, "Contoh proyek untuk mempelajari JUnit dan rekayasa perangkat lunak yang tepat" . Saya menyukainya sejauh ini!

Tapi sekarang saya ingin duduk dan mencobanya sendiri. Saya punya pertanyaan yang saya harap hanya membutuhkan jawaban sederhana.

Bagaimana Anda mengatur kelas pengujian JUnit dan kode Anda yang sebenarnya? Saya berbicara terutama tentang struktur paket, tetapi konsep catatan lainnya juga akan membantu.

Apakah Anda menempatkan kelas pengujian di org.myname.project.test. * Dan kode normal di org.myname.project. *? Apakah Anda menempatkan kelas tes tepat di samping kelas normal? Apakah Anda lebih memilih untuk memberi awalan nama kelas dengan Test daripada mengakhirinya?

Saya tahu ini sepertinya hal yang tidak perlu saya khawatirkan secepat ini, tetapi saya adalah orang yang sangat berorientasi pada organisasi. Saya hampir seperti tipe orang yang menghabiskan lebih banyak waktu untuk mencari tahu metode untuk melacak apa yang harus dilakukan, daripada benar-benar menyelesaikan sesuatu.

Dan saya memiliki proyek yang saat ini terbagi dengan rapi ke dalam paket, tetapi proyek tersebut menjadi berantakan. Alih-alih mencoba merefaktor semuanya dan menulis tes, saya ingin memulai dari awal, tes pertama dan semuanya. Tapi pertama-tama saya perlu tahu kemana perginya tes saya.


edit: Saya benar-benar lupa tentang Maven, tetapi tampaknya sebagian besar dari Anda menggunakannya! Di masa lalu, saya memiliki kasus penggunaan khusus di mana Maven benar-benar mengecewakan saya, tetapi Ant memberi saya fleksibilitas yang saya butuhkan, jadi saya akhirnya terikat dengan Ant, tetapi saya berpikir mungkin saya hanya mengambil pendekatan yang salah. Saya rasa saya akan mencoba Maven lagi karena sepertinya ini akan berjalan dengan baik dengan pengembangan yang digerakkan oleh pengujian.

Ricket
sumber

Jawaban:

154

Saya lebih suka menempatkan kelas uji ke dalam paket yang sama dengan kelas proyek yang mereka uji, tetapi dalam direktori fisik yang berbeda, seperti:

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

Dalam proyek Maven akan terlihat seperti ini:

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

Poin utama dalam hal ini adalah bahwa kelas pengujian saya dapat mengakses (dan menguji!) Kelas dan anggota cakupan paket.

Seperti yang ditunjukkan contoh di atas, kelas pengujian saya memiliki nama kelas yang diuji plus Testsebagai sufiks. Ini membantu menemukannya dengan cepat - tidak lucu mencoba mencari di antara beberapa ratus kelas tes, yang masing-masing namanya dimulai dengan Test...

Pembaruan yang terinspirasi oleh komentar @ Ricket: dengan cara ini kelas tes (biasanya) muncul tepat setelah teman mereka yang diuji dalam daftar alfabetis proyek dari nama kelas. (Lucu bahwa saya mendapat manfaat dari hari demi hari, tanpa secara sadar menyadari bagaimana ...)

Pembaruan2: Banyak pengembang (termasuk saya) menyukai Maven, tetapi tampaknya ada juga yang tidak. IMHO sangat berguna untuk proyek Java "arus utama" (saya akan memasukkan sekitar 90% proyek ke dalam kategori ini ... tetapi 10% lainnya masih merupakan minoritas yang cukup besar). Mudah digunakan jika seseorang dapat menerima konvensi Maven; Namun jika tidak, itu membuat hidup menjadi perjuangan yang menyedihkan. Maven tampaknya sulit dipahami oleh banyak orang yang disosialisasikan di Ant, karena tampaknya memerlukan cara berpikir yang sangat berbeda. (Saya sendiri, karena tidak pernah menggunakan Ant, tidak dapat membandingkan keduanya.) Satu hal yang pasti: ini membuat pengujian unit (dan integrasi) menjadi langkah kelas satu yang alami dalam proses, yang membantu developer mengadopsi praktik penting ini.

Péter Török
sumber
6
Saya setuju dengan catatan sufiks juga. Juga karena kelas tes dipisahkan ke dalam folder fisik yang berbeda, tidak perlu mencoba dan mengawali dengan Test dalam beberapa upaya untuk mengelabui urutan abjad ke dalam pengelompokan, dan saya pikir SomeClassTest membaca lebih baik.
Ricket
Konvensi luar biasa +1
whiskysierra
1
Satu hal tentang menempatkan kelas uji dalam paket yang sama: meskipun memungkinkan untuk menggunakan anggota paket-pribadi (yang mengapa saya menggunakan skema ini juga), itu juga tidak memungkinkan untuk menguji visibilitas secara otomatis, esp. jika Anda menggunakan TDD dan membiarkan IDE Anda menghasilkan stub metode yang diperlukan. Ini dapat menghasilkan mereka dengan visibilitas paket-pribadi (NetBeans, saya melihat Anda), yang membuat tes Anda lulus dengan sempurna (setelah Anda benar-benar menerapkannya ke dalam rintisan itu), tetapi mungkin gagal dalam penggunaan nyata (jika Anda lupa menambahkan public) .
Sergei Tachenov
Meskipun konvensi ini menarik, apa yang Anda lakukan saat rangkaian pengujian bertambah? Misalnya, Anda memiliki 6 metode di kelas, setiap metode memiliki 10 pengujian. Apakah Anda memiliki 60 tes di kelas Anda? Saya biasanya membagi kelas uji (satu kelas uji per metode). Masalahnya adalah Anda mungkin menemukan banyak kelas dalam paket pengujian Anda.
mmalmeida
1
@Thick_propheT di Eclipse: klik kanan pada nama proyek, klik New - Other ..., lalu di dalam folder Java pilih Source Folder. beri nama "test". Kemudian jika Anda ingin mengikuti konvensi di atas, tambahkan paket baru ke folder uji ini yang memiliki nama yang sama dengan paket kelas yang ingin Anda tulis kasus uji, kemudian dalam paket tambahkan Kasus Uji JUnit baru (terletak di folder Java / Junit saat Anda melakukan New-Other ...). di wizard baru itu, Anda dapat menentukan kelas yang diuji dan menamai kasus uji Anda dengan nama yang sama dengan sufiks "Uji"
atau
15

Saya menempatkan kelas pengujian saya dalam paket yang sama dengan apa yang mereka uji tetapi dalam folder atau proyek sumber yang berbeda . Mengatur kode pengujian saya dengan cara ini memungkinkan saya untuk dengan mudah mengkompilasi dan mengemasnya secara terpisah sehingga file jar produksi tidak berisi kode pengujian. Ini juga memungkinkan kode pengujian untuk mengakses bidang dan metode privat paket.

ChrisH
sumber
12

Saya menggunakan Maven . Struktur yang dipromosikan Maven adalah: -

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

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

yaitu kelas pengujian dengan Ujian yang diawali dengan nama kelas yang diuji berada dalam struktur direktori paralel dengan pengujian utama.

Satu keuntungan memiliki kelas pengujian dalam paket yang sama (meskipun tidak harus direktori) adalah Anda dapat memanfaatkan metode cakupan paket untuk memeriksa atau memasukkan objek pengujian tiruan.

Martin
sumber
18
Saya pikir itu <class>Test.java, bukanTest<class>.java
Mike Rylander
2
Maven akan menerima salah satu pola, sesuai dengan dokumentasi Plugin Maven Surefire .
Elijah Woodward
3
Saya berpendapat bahwa <class>Test.javaskema penamaan membuat kelas utama dan kelas pengujian muncul lebih dekat saat menggunakan fitur pencarian IDE, yang membuatnya sedikit lebih baik daripada Test<class>.java.
christopheml
1
@ Christopheml Saya setuju, itulah yang saya lakukan sekarang.
Martin
Ini berhasil untuk Intellij. MyClassTest.java tidak berfungsi.
pengguna2761431