Specs dan ScalaTest adalah alat yang bagus untuk pengguna yang senang, tetapi keduanya berbeda dalam beberapa hal. Anda mungkin ingin memilih salah satu sebagai alat pengujian utama Anda di Scala, tetapi tidak perlu menyerah karena Anda dapat menggunakan keduanya. Jika Anda menyukai FeatureSpec
sintaks ScalaTest dan sintaks Mockito spesifikasi, misalnya, Anda dapat meletakkan kedua file jar di jalur kelas Anda dan menggunakan keduanya pada saat yang bersamaan. Di sini saya akan mencoba dan menangkap perbedaan filosofi desain utama yang saya perhatikan antara spesifikasi dan ScalaTest.
Mungkin perbedaan filosofis utama antara alat ini adalah bahwa spesifikasi dirancang untuk Pengembangan Berbasis Perilaku (BDD), sedangkan ScalaTest lebih umum. ScalaTest menyediakan ciri-ciri yang dapat Anda gabungkan untuk mendapatkan perilaku yang Anda sukai di kelas pengujian Anda, termasuk BDD, dan Anda juga dapat dengan mudah menentukan perilaku Anda sendiri jika Anda menginginkan sesuatu yang berbeda.
ScalaTest mendukung BDD melalui Spec
, FeatureSpec
, WordSpec
, FlatSpec
, dan GivenWhenThen
sifat-sifat, dan juga memiliki sifat-sifat yang Anda dapat mencampur dalam untuk mendapatkan sintaks matcher bagus. Jika Anda suka "harus", Anda mencampurkan ShouldMatchers. Jika Anda suka "harus", Anda bisa mencampurnya MustMatchers
. Tetapi jika Anda menyukai BDD tetapi tidak menyukai sintaks pencocokkan, Anda dapat menggunakan salah satu ciri Spec dari ScalaTest tanpa mencampurkan sifat pencocokkan. Specs memiliki kelas Spesifikasi yang Anda perluas, dan Anda harus menggunakan kata "must" dalam ekspresi matcher Anda. Perbedaan filosofis besar yang terbukti di sini adalah bahwa ScalaTest memberi Anda lebih banyak pilihan. Untuk membuat ruang pilihan ini lebih mudah dinavigasi, saya memberikan pohon keputusan di sini:
http://www.scalatest.org/quick_start
Sintaks matcher juga berbeda antara ScalaTest dan spesifikasi. Di ScalaTest saya mencoba untuk melihat seberapa jauh saya bisa pergi dengan notasi operator, dan berakhir dengan ekspresi matcher yang sangat mirip dengan kalimat bahasa Inggris, dengan spasi di antara kata-kata. Sintaks pencocokan spesifikasi menjalankan kata-kata lebih banyak dengan huruf besar / kecil.
Spesifikasi memiliki lebih banyak pencocokan daripada ScalaTest, dan menurut saya mencerminkan perbedaan dalam sikap desain. Saya benar-benar memotong mungkin 2/3 dari sintaks pencocokan yang saya buat dan pertimbangkan untuk dirilis. Saya akan menambahkan lebih banyak pencocokkan di rilis mendatang, tetapi ingin memastikan bahwa saya tahu pengguna benar-benar menginginkan sesuatu sebelum saya menambahkannya. Namun, pencocok ScalaTest menyertakan sintaks pencocok properti dinamis yang mengambil beberapa kelonggaran itu. Misalnya di Spesifikasi Anda dapat menulis di java.io.File
:
file must beDirectory
Ini akan memanggil isDirectory
dan memastikan itu benar. ScalaTest tidak memiliki pencocokan khusus untuk java.io.Files
saat ini, tetapi di ScalaTest, Anda dapat menggunakan pemeriksaan dinamis seperti ini:
file must be a ('directory)
Setiap kali Anda meneruskan simbol setelahnya be
, itu akan menggunakan refleksi untuk mencari (dalam hal ini) metode atau bidang bernama directory
atau metode bernama isDirectory
. Ada juga cara untuk membuat ini statis, dengan mendefinisikan a BePropertyMatcher
(yang biasanya hanya membutuhkan 2 atau 3 baris kode). Jadi pada dasarnya di ScalaTest saya mencoba menyediakan lebih banyak fungsionalitas dengan lebih sedikit API.
Perbedaan sikap desain umum lainnya antara spesifikasi dan ScalaTest melibatkan konversi implisit. Secara default, Anda hanya mendapatkan satu konversi implisit saat menggunakan ScalaTest, yang menempatkan ===
operator dalam segala hal. (Jika perlu, Anda dapat "menonaktifkan" konversi implisit ini dengan satu baris kode. Satu-satunya alasan Anda perlu melakukannya adalah jika Anda mencoba menguji sesuatu yang memiliki ===
operatornya sendiri , dan Anda mendapatkan konflik. ) ScalaTest mendefinisikan banyak konversi implisit lainnya, tetapi untuk menggunakannya Anda perlu secara eksplisit "mengundang" mereka ke dalam kode Anda dengan mencampurkan suatu sifat atau melakukan impor. Saat Anda memperpanjang kelasSpecification
dalam spesifikasi, saya pikir Anda mendapatkan lusinan konversi implisit secara default. Saya tidak yakin seberapa penting hal itu dalam praktiknya, tetapi saya pikir orang akan ingin menguji kode yang menggunakan implikasinya sendiri, dan terkadang mungkin ada konflik antara implikasi kerangka pengujian dan kode produksi. Ketika itu terjadi, saya pikir mungkin lebih mudah untuk mengatasi masalah di ScalaTest daripada spesifikasi.
Perbedaan lain dalam sikap desain yang saya perhatikan adalah kenyamanan dengan operator. Satu tujuan yang saya miliki adalah bahwa setiap programmer yang melihat kode pengujian orang lain yang menggunakan ScalaTest akan dapat menebak apa artinya tanpa mencari apa pun di dokumentasi ScalaTest. Saya ingin kode klien ScalaTest menjadi sangat jelas. Salah satu cara tujuan itu terwujud adalah ScalaTest sangat konservatif tentang operator. Saya hanya mendefinisikan lima operator di ScalaTest:
===
, yang artinya sama
>
, yang artinya lebih besar dari
<
, kurang dari
>=
, lebih besar dari atau sama
<=
, kurang dari atau sama.
Itu dia. Jadi hal-hal ini terlihat seperti apa artinya. Jika Anda melihat di kode orang lain:
result should be <= 7
Harapan saya adalah Anda tidak perlu menjalankan dokumentasi API untuk menebak apa <=
artinya. Sebaliknya, spesifikasi jauh lebih bebas dengan operator. Tidak ada yang salah dengan itu, tetapi itu adalah perbedaan. Operator dapat membuat kode lebih ringkas, tapi tradeoff adalah Anda mungkin harus menjalankan dokumentasi ketika Anda menemukan hal-hal seperti ->-
, >>
, |
, |>
, !
, atau ^^^
(yang semua memiliki arti khusus di Specs) dalam kode uji kolega Anda.
Satu perbedaan filosofis lainnya adalah bahwa saya mencoba dan membuatnya sedikit lebih mudah di ScalaTest untuk menggunakan gaya fungsional ketika Anda perlu berbagi perlengkapan, sedangkan Spesifikasi secara default melanjutkan tradisi setUp
dan tearDown
pendekatan yang dipopulerkan oleh JUnit, di mana Anda menetapkan ulang vars sebelum setiap tes. Namun jika Anda ingin menguji seperti itu, itu juga sangat mudah di ScalaTest. Anda hanya perlu mencampurkan BeforeAndAfter
sifat tersebut.
Untuk wawasan lebih lanjut tentang ScalaTest, Anda dapat menonton presentasi "Get Higher with ScalaTest" yang saya berikan pada konferensi Devoxx 2009 di sini:
http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about