Apa praktik terbaik untuk penamaan kelas tes unit dan metode pengujian?
Ini telah dibahas pada SO sebelumnya, di Apa saja konvensi penamaan populer untuk Tes Unit?
Saya tidak tahu apakah ini pendekatan yang sangat baik, tetapi saat ini dalam proyek pengujian saya, saya memiliki pemetaan satu-ke-satu antara setiap kelas produksi dan kelas pengujian, misalnya Product
dan ProductTest
.
Di kelas pengujian saya, saya kemudian memiliki metode dengan nama metode yang saya uji, garis bawah, dan kemudian situasi dan apa yang saya harapkan terjadi, misalnya Save_ShouldThrowExceptionWithNullName()
.
unit-testing
naming-conventions
James Newton-King
sumber
sumber
test<MethodUnderTest>_<state>
misalnyatestPop_emptyStack
google-styleguide.googlecode.com/svn/trunk/javaguide.html 5.2.3 Nama metode. Jika ragu, ikuti Google.Jawaban:
Saya suka strategi penamaan Roy Osherove , berikut ini:
[UnitOfWork_StateUnderTest_ExpectedBehavior]
Ia memiliki setiap informasi yang diperlukan tentang nama metode dan secara terstruktur.
Unit kerja bisa sekecil metode tunggal, satu kelas, atau sebesar beberapa kelas. Ini harus mewakili semua hal yang harus diuji dalam kasus uji ini dan terkendali.
Untuk majelis saya menggunakan
.Tests
akhiran yang khas , yang menurut saya cukup luas dan sama untuk kelas (diakhiri denganTests
):[NameOfTheClassUnderTestTests]
Sebelumnya saya menggunakan Fixture sebagai suffix sebagai ganti Tes tapi saya pikir yang terakhir lebih umum, kemudian saya mengubah strategi penamaan.
sumber
UpdateManager.Update()
. Memiliki ini dalam pikiran saya cenderung untuk memanggil tes sayaWhenUpdating_State_Behaviour
atauWhenUpdating_Behaviour_State
. Dengan cara ini saya menguji tindakan tertentu dari suatu kelas sambil menghindari untuk memasukkan nama metode dalam nama tes. Tetapi yang paling penting adalah bahwa saya harus memiliki petunjuk tentang logika bisnis yang gagal ketika saya melihat nama tes yang gagalSaya suka mengikuti standar penamaan "Harus" untuk tes sambil memberi nama perlengkapan tes setelah unit yang diuji (yaitu kelas).
Untuk menggambarkan (menggunakan C # dan NUnit):
Kenapa "Harus" ?
Saya menemukan bahwa itu memaksa penulis tes untuk memberi nama tes dengan kalimat di sepanjang baris "Harus [berada di beberapa negara] [setelah / sebelum / ketika] [tindakan terjadi]"
Ya, menulis "Seharusnya" di mana-mana memang sedikit berulang, tetapi seperti yang saya katakan itu memaksa penulis untuk berpikir dengan cara yang benar (jadi bisa baik untuk pemula). Plus itu umumnya menghasilkan nama tes bahasa Inggris yang dapat dibaca.
Perbarui :
Saya perhatikan bahwa Jimmy Bogard juga penggemar 'harus' dan bahkan memiliki perpustakaan tes unit yang disebut Harus .
Perbarui (4 tahun kemudian ...)
Bagi mereka yang tertarik, pendekatan saya untuk tes penamaan telah berkembang selama bertahun-tahun. Salah satu masalah dengan pola Haruskah saya jelaskan di atas sebagai tidak mudah untuk mengetahui sekilas metode mana yang sedang diuji. Untuk OOP saya pikir lebih masuk akal untuk memulai nama uji dengan metode yang diuji. Untuk kelas yang dirancang dengan baik ini harus menghasilkan nama metode uji yang dapat dibaca. Saya sekarang menggunakan format yang mirip dengan
<method>_Should<expected>_When<condition>
. Jelas tergantung pada konteksnya Anda mungkin ingin mengganti kata kerja Should / When dengan sesuatu yang lebih tepat. Contoh:Deposit_ShouldIncreaseBalance_WhenGivenPositiveValue()
sumber
increasesBalanceWhenDepositIsMade()
.Saya suka gaya penamaan ini:
dan seterusnya. Sangat jelas bagi non-tester apa masalahnya.
sumber
should
saya akan lebih memilihwill
jadiOrdersWithNoProductsWillFail()
Will
tidak benar-benar tepat dan dengan melakukan itu Anda benar-benar keliru mengatakan kepada pembaca bahwa tes tidak akan gagal ... jika Anda menggunakanWill
untuk mengekspresikan sesuatu di masa depan yang mungkin tidak terjadi Anda menggunakannya secara salah sedangkan ituShould
adalah pilihan yang lebih baik di sini karena itu menunjukkan bahwa Anda ingin / berharap sesuatu terjadi tetapi tidak atau tidak bisa, ketika tes berjalan itu memberitahu Anda apakah itu gagal / berhasil sehingga Anda tidak dapat benar-benar menyiratkan bahwa sebelumnya, itulah penjelasan logis untuk itu, apa milikmu? mengapa Anda menghindariShould
?Kent Beck menyarankan:
Satu perlengkapan tes per 'unit' (kelas program Anda). Perlengkapan ujian adalah kelas itu sendiri. Nama perlengkapan uji harus:
Kasus uji (metode perlengkapan uji) memiliki nama seperti:
Misalnya, memiliki kelas berikut:
Perlengkapan ujian adalah:
sumber
Nama Kelas . Untuk nama perlengkapan tes, saya menemukan bahwa "Tes" cukup umum dalam bahasa di mana-mana banyak domain. Sebagai contoh, dalam domain engineering:
StressTest
, dan dalam domain kosmetik:SkinTest
. Maaf tidak setuju dengan Kent, tetapi menggunakan "Tes" pada jadwal pengujian saya (StressTestTest
?) Membingungkan."Unit" juga banyak digunakan dalam domain. Misalnya
MeasurementUnit
. Apakah kelas disebutMeasurementUnitTest
tes "Pengukuran" atau "PengukuranUnit"?Karena itu saya suka menggunakan awalan "Qa" untuk semua kelas ujian saya. Misalnya
QaSkinTest
danQaMeasurementUnit
. Tidak pernah bingung dengan objek domain, dan menggunakan awalan daripada akhiran berarti bahwa semua perlengkapan tes hidup bersama secara visual (berguna jika Anda memiliki palsu atau kelas pendukung lainnya dalam proyek pengujian Anda)Ruang nama . Saya bekerja di C # dan saya menjaga kelas pengujian saya di namespace yang sama dengan kelas yang mereka uji. Ini lebih nyaman daripada memiliki ruang nama tes terpisah. Tentu saja, kelas tes berada di proyek yang berbeda.
Nama metode uji . Saya suka memberi nama metode saya WhenXXX_ExpectYYY. Itu membuat prasyarat jelas, dan membantu dengan dokumentasi otomatis (ala TestDox). Ini mirip dengan saran di blog pengujian Google, tetapi dengan lebih banyak pemisahan prasyarat dan harapan. Sebagai contoh:
sumber
Saya menggunakan konsep Given-When-Then . Lihatlah artikel pendek ini http://cakebaker.42dh.com/2009/05/28/given-when-then/ . Artikel menjelaskan konsep ini dalam hal BDD, tetapi Anda dapat menggunakannya dalam TDD juga tanpa perubahan.
sumber
Lihat: http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsibly.html
Untuk nama-nama metode pengujian, saya pribadi menemukan menggunakan verbose dan nama-nama yang didokumentasikan sendiri sangat berguna (bersama komentar Javadoc yang selanjutnya menjelaskan apa yang dilakukan tes)
sumber
Saya pikir salah satu hal terpenting adalah konsisten dalam konvensi penamaan Anda (dan sepakati dengan anggota tim Anda yang lain). Berkali-kali saya melihat banyak konvensi berbeda yang digunakan dalam proyek yang sama.
sumber
Saya baru-baru ini datang dengan konvensi berikut untuk penamaan tes saya, kelas mereka dan berisi proyek untuk memaksimalkan deskripsi mereka:
Katakanlah saya sedang menguji
Settings
kelas dalam sebuah proyek diMyApp.Serialization
namespace.Pertama saya akan membuat proyek uji dengan
MyApp.Serialization.Tests
namespace.Dalam proyek ini dan tentu saja namespace saya akan membuat kelas yang disebut
IfSettings
(disimpan sebagai IfSettings.cs ).Katakanlah saya sedang menguji
SaveStrings()
metode. -> Saya akan memberi nama tesCanSaveStrings()
.Saat saya menjalankan tes ini, ia akan menampilkan tajuk berikut:
MyApp.Serialization.Tests.IfSettings.CanSaveStrings
Saya pikir ini memberitahu saya dengan sangat baik, apa itu pengujian.
Tentu saja bermanfaat bahwa dalam bahasa Inggris kata benda "Tes" sama dengan kata kerja "tes".
Tidak ada batasan untuk kreativitas Anda dalam memberi nama tes, sehingga kami mendapatkan judul kalimat penuh untuk mereka.
Biasanya nama Test harus diawali dengan kata kerja.
Contohnya termasuk:
DetectsInvalidUserInput
)ThrowsOnNotFound
)WillCloseTheDatabaseAfterTheTransaction
)dll.
Pilihan lain adalah menggunakan "itu" daripada "jika".
Yang terakhir menyelamatkan saya penekanan tombol dan menjelaskan lebih tepatnya apa yang saya lakukan, karena saya tidak tahu, bahwa perilaku yang diuji ada, tetapi saya menguji apakah itu.
[ Sunting ]
Setelah menggunakan konvensi penamaan di atas untuk sedikit lebih lama sekarang, saya telah menemukan, bahwa awalan If dapat membingungkan, ketika bekerja dengan antarmuka. Kebetulan, bahwa kelas pengujian IfSerializer.cs terlihat sangat mirip dengan antarmuka ISerializer.cs di "Buka File Tab". Ini bisa sangat menjengkelkan ketika beralih bolak-balik antara tes, kelas yang diuji dan antarmuka-nya. Alhasil saya sekarang akan memilih That over If sebagai awalan.
Selain itu saya sekarang menggunakan - hanya untuk metode di kelas pengujian saya karena tidak dianggap praktik terbaik di tempat lain - "_" untuk memisahkan kata dalam nama metode pengujian saya seperti pada:
Saya menemukan ini lebih mudah dibaca.
[ Akhir Edit ]
Saya harap ini memunculkan beberapa ide lagi, karena saya menganggap penamaan tes sangat penting karena dapat menghemat banyak waktu yang seharusnya dihabiskan untuk mencoba memahami apa yang dilakukan tes (misalnya setelah melanjutkan proyek setelah jeda panjang) .
sumber
Dalam VS + NUnit saya biasanya membuat folder di proyek saya untuk mengelompokkan tes fungsional bersama. Kemudian saya membuat kelas-kelas perlengkapan pengujian unit dan memberi nama mereka setelah jenis fungsionalitas yang saya uji. Metode [Tes] diberi nama di sepanjang baris
Can_add_user_to_domain
:sumber
Saya harus menambahkan bahwa menjaga tes Anda dalam paket yang sama tetapi dalam direktori paralel ke sumber yang diuji menghilangkan mengasapi kode setelah Anda siap untuk menyebarkannya tanpa harus melakukan banyak pola mengecualikan.
Saya pribadi menyukai praktik terbaik yang dijelaskan dalam "Panduan Saku JUnit" ... sulit untuk mengalahkan buku yang ditulis oleh rekan penulis JUnit!
sumber
nama kasus uji untuk kelas Foo haruslah FooTestCase atau semacamnya (FooIntegrationTestCase atau FooAcceptanceTestCase) - karena merupakan kasus uji. lihat http://xunitpatterns.com/ untuk beberapa konvensi penamaan standar seperti tes, test case, fixture tes, metode pengujian, dll.
sumber