Apa perbedaan antara kerangka kerja pengujian unit ScalaTest dan Scala Specs?


121

Keduanya adalah kerangka kerja pengujian unit berkemampuan BDD (Behavior Driven Development) untuk Scala yang ditulis dalam Scala. Dan Spesifikasi yang dibangun di atas mungkin juga melibatkan kerangka ScalaTest . Tapi apa yang tidak ditawarkan oleh Spesifikasi ScalaTest? Apa perbedaannya?


1
Saya tidak percaya bahwa itu akurat untuk mengatakan bahwa Spesifikasi dibangun di atas ScalaTest. Perhatikan bahwa ketergantungan di pom bersifat opsional. Spesifikasi memang memiliki kemampuan untuk spesifikasinya untuk dijalankan sebagai suite ScalaTest.
Geoff Reedy

scalatest menyediakan scalatestplus dengan dukungan khusus untuk beberapa libs. itu mungkin menarik. misalnya, mereka memiliki scalatestplus untuk kerangka bermain
pedrorijo91

Jawaban:


172

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 FeatureSpecsintaks 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 GivenWhenThensifat-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 isDirectorydan memastikan itu benar. ScalaTest tidak memiliki pencocokan khusus untuk java.io.Filessaat 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 directoryatau 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 kelasSpecificationdalam 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 setUpdan tearDownpendekatan 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 BeforeAndAftersifat 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


6
Keterbacaan scalatest adalah poin kemenangan utama atas spesifikasi scala bagi saya.
nemoo

49

Perbedaan utamanya adalah (kebanyakan dari sudut pandang spesifikasi :-)):

  • ScalaTest menyediakan lebih banyak "gaya pengujian" daripada spesifikasi (Anda dapat mengunjungi setiap poin peluru di halaman mulai cepat untuk mendapatkan tampilan mendetail tentang setiap gaya)

  • ScalaTest dan spesifikasi memiliki sekumpulan pencocokan yang berbeda. Anda dapat membandingkannya di sini untuk ScalaTest dan di sini untuk spesifikasinya. Di sisi itu, spesifikasi memiliki banyak fitur kecil yang mungkin Anda sukai saat menulis spesifikasi Anda: pencocokan xml, komposisi pencocokan (cara mudah untuk menggunakan kembali pencocokan dengan mengubahnya), kegagalan yang tepat, perbedaan mendetail untuk string panjang, .. .

  • Mockito telah diberi dukungan BDD yang bagus dalam spesifikasi: Mockito

  • spesifikasi memiliki DataTables yang memungkinkan untuk mengelompokkan banyak contoh kecil dalam semacam tabel (jika Anda dapat menerima operator yang digunakan sebagai pembatas tabel)

  • Dalam spesifikasi, Anda dapat menentukan contoh yang bertingkat sebagai libidum dan secara otomatis dibersihkan di setiap level

Ini tentu saja merupakan perbandingan yang sangat parsial dan bias dan masih banyak perbedaan lainnya (dan perpustakaan masih berkembang, ...).

Pada akhirnya saya pikir itu benar-benar tergantung pada gaya pengujian / spesifikasi Anda. Jika sederhana (struktur spesifikasi sederhana, penyiapan, ekspektasi, ...) maka kedua pustaka akan tampak sangat mirip. Jika tidak, keduanya memiliki pendapat tentang bagaimana hal-hal harus dilakukan. Sebagai contoh terakhir, Anda dapat melihat penandaan: di ScalaTest dan di spesifikasi .

Saya harap ini membantu.


Apakah mungkin untuk memperbarui ini untuk mencakup spesifikasi2? :)
Joffer

5

Sejauh yang saya tahu, kecuali beberapa fitur yang sangat khusus, itu tergantung pada preferensi pribadi menurut gayanya.


2

Dukungan IDE mungkin poin lain

Saya telah mencoba membuat Specs bekerja dengan Eclipse melalui JUnit, dan saya menemukan solusi resminya agak "hacky". Pengaturan spesifikasi: http://code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse

Integrasi ScalaTest (juga melalui JUnit) dengan tampaknya sedikit kurang hacky. Namun, saya belum memiliki satupun dari mereka untuk bekerja sebaik JUnit dan Java.

Penyiapan ScalaTest: http://groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse


Saya mendapatkan 404 untuk tautan ScalaTest itu sekarang. Coba scalatest.org/user_guide/using_junit_runner
DNA

0

Jika salah satu faktor keputusan adalah waktu kompilasi, scalatest tampaknya berkinerja lebih baik.

Kami saat ini menggunakan specs2 dalam proyek kami, tetapi mengalami waktu kompilasi yang lambat dalam pengujian. Saya baru saja menyelesaikan POC untuk pindah ke scalatest dan melihat waktu kompilasi turun dengan faktor sekitar 0,82 hanya dengan mengganti 2 kerangka kerja di beberapa sumber kami.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.