Apakah RSpec dan Mentimun benar-benar layak?

12

Saya tahu sebagian besar programmer RoR menguji pecandu dan saya mengerti keuntungan dari suite pengujian besar tetapi ketika saya memulai pengujian, saya tidak pernah mendapatkan suite sebesar itu dan saya selalu bertanya-tanya "Apakah saya menguji cara yang benar? Apakah ada yang benar-benar efisien?". Saya sering berurusan dengan tes integrasi hanya menguji cara aplikasi berperilaku.

Pertama, apakah pengujian benar-benar layak? Maksudku, apakah waktu yang dihabiskan untuk menulis tes benar-benar layak?

Lalu, saya menggunakan RSpec, saya baru saja menemukan Mentimun, menggunakannya untuk sementara waktu tetapi saya tidak tahu apakah menulis semua langkah ini benar-benar sepadan dengan masalahnya? Saya tahu saya bisa menggunakan kembali langkah-langkah tetapi saya tidak pernah tahu apakah langkah-langkah ini terlalu lengkap atau tidak: Misalnya, saya telah menggunakan Given I am logged in as (.+)tetapi saya tidak tahu apakah saya harus mengatakan dalam definisi Given there's a user called $1karena dapat menduplikasi pengguna jika pernah dibuat tetapi itu tidak bermanfaat selalu memiliki langkah sebelumnya Given I am logged in as (.+). Cukup banyak kode yang mungkin jarang berguna. Saya kira tidak ada bug baru pada bagian yang diuji setiap hari ... Jadi, apakah Mentimun benar-benar berharga dibandingkan dengan RSpec?

Cydonia7
sumber

Jawaban:

13

'Ah-ha!' saat-saat tentang pengujian di Ruby dan Rails datang ketika saya benar-benar duduk dan membaca sumber daya definitif pada subjek, buku Rspec dan Mentimun . Saya berbagi penghinaan awal Anda terhadap Mentimun, tetapi kemudian saya menyadari bahwa saya melihat gambar dari sudut yang salah.

Pada dasarnya, Mentimun adalah tentang BDD (pengembangan yang didorong oleh perilaku) - Anda menggunakan Mentimun untuk merencanakan fitur Anda, apa yang akan Anda kerjakan selanjutnya. Hmm, selanjutnya Anda ingin pengguna dapat mempromosikan posting di forum atau sesuatu (untuk mencuri contoh;)) Jadi Anda menulis sesuatu yang sederhana.

Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.

Perhatikan bahwa tidak ada referensi untuk kode apa pun yang terkait di sana cukup banyak. Itu ada di langkah Anda. Ketika Anda memperbaiki kode Anda, Anda mungkin harus mengubah definisi langkah Anda, tetapi perilaku (fitur Anda) tidak akan pernah perlu berubah.

Sekarang setiap kali Anda menjalankan fitur Mentimun Anda, Anda akan cukup banyak dipandu melalui cara menguji fitur menggunakan TDD (test driven development). Ini dilakukan pada level yang lebih rendah menggunakan RSpec.

Jalankan pertama - definisi langkah pertama saya tidak terdefinisi. Salin blok untuk mendefinisikannya di say user_steps.rb atau bahkan session_steps.rb karena berhubungan dengan pengguna dan sesi mereka. Sekarang, bagaimana Anda mendefinisikan bahwa pengguna masuk? Anda dapat membawanya melalui proses login.

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

Seharusnya semuanya bahagia. Tahap kedua.

Given /^I can see the post "(.+)"$/ do |name|
  visit post_path(Post.find_by_name(name))
end

Sekali lagi cukup mudah. Perhatikan bahwa jika kami benar-benar mengulang proses login kami, atau bagaimana posting kami didefinisikan dan ditampilkan, kami tidak perlu mengubah perilaku. Langkah ketiga.

When /^I vote the post up$/ do
  pending 
end 

Di sinilah Anda mulai berbicara tentang fungsionalitas baru, tetapi Anda belum tahu bagaimana ini akan berfungsi. Bagaimana Anda memberi suara pada posting? Anda bisa mengklik gambar +1 atau sesuatu, yang melakukan posting ajax ke controller, yang mengembalikan JSON, atau semacamnya. Jadi sekarang Anda dapat beralih ke pengujian Rspec murni.

  • Uji tampilan Anda untuk memastikan gambar +1 ditampilkan,
  • Uji pengontrol Anda bahwa ia berperilaku dengan benar ketika menerima permintaan ajax yang diberikan dari format yang tepat (baik jalur bahagia dan tidak bahagia - bagaimana jika ID posting tidak valid diterima? Apa yang terjadi jika pengguna telah menggunakan 25 upvote mereka dalam sehari? Apakah ini menambah jumlah suara dengan benar?)
  • Uji javascript Anda yang merespons dengan benar ketika diberi gumpalan JSON dalam format yang benar (apakah itu memperbarui gambar +1 untuk menunjukkan itu telah digunakan? (Memikirkan Google+ di sini ...) Apakah itu menunjukkan pesan terima kasih? Dll. )

Semua ini tidak mempengaruhi perilaku - tetapi ketika Anda selesai berurusan dengan pengujian tingkat yang lebih rendah, itu akan sepele untuk mengisi definisi langkah bagaimana memilih posting. Mungkin sesederhana itu click_link '+1'. Dan langkah selanjutnya adalah menguji hasil, yang lagi-lagi harus langsung dilakukan. Dan ketika Anda selesai, maka Anda tahu fitur Anda lengkap dan selesai. Jika perilaku yang diperlukan berubah, Anda dapat mengubah fitur Anda, jika tidak, Anda dapat mengubah kode implementasi Anda dengan aman.

Saya harap ini masuk akal. Itu semua berada di atas kepala saya, tapi saya pikir itu menunjukkan perbedaan antara BDD dan TDD, dan mengapa Mentimun dan RSpec melayani kebutuhan yang berbeda.

sevenseacat
sumber
Ini sangat membantu saya. Tapi saya punya satu pertanyaan lagi: Saya sudah memulai proyek menggunakan RSpec untuk menguji pengendali dan pandangan, kode sekitar 90% ditutupi dengan tes. Apakah Anda pikir saya benar-benar membutuhkan Mentimun dan meluangkan waktu untuk menulis langkah dan skenario sekarang? Maksudku, aku bisa melakukan semua itu dengan RSpec.
Cydonia7
@ Skydreamer: Mungkin tidak perlu, tapi mungkin ini latihan yang bagus. Selama Anda melakukan pengujian, Anda berada di jalur yang benar :)
sevenseacat
10

Pengujian, menurut saya, adalah seni. Melakukan TDD (menggunakan RSpec atau kerangka kerja lainnya) awalnya terasa seperti Anda "membuang-buang waktu." Ini dapat dimengerti karena Anda tidak menulis kode produksi apa pun.

Namun, Anda mulai melihat manfaat TDD ketika Anda perlu meningkatkan basis kode Anda sambil memastikan bahwa semuanya masih berfungsi. TDD membantu Anda menangkap kesalahan regresi sedini mungkin. Melakukan hal ini telah menyelamatkan saya dari hari kerja karena saya telah memfokuskan tes yang menunjukkan kesalahan saya.

Selain itu, memiliki tes dapat bermanfaat untuk ulasan kode karena pengulas Anda dapat melihat skenario apa yang Anda uji dan bagaimana kode Anda dimaksudkan untuk digunakan.

Setelah Anda masuk ke ayunan TDD, melakukan hal lain terasa salah.

David Weiser
sumber
2
+1 walaupun berbicara dari pengalaman, "masuk ke ayunan TDD" adalah upaya raksasa dalam dan dari dirinya sendiri dan sangat sulit dilakukan untuk sebagian besar pengembang.
Wayne Molina
@Wayne M: Setuju. Masuk ke alur TDD itu sulit, tetapi manfaatnya besar. :)
David Weiser
Sulit mengatakannya dengan enteng .. sudah bertahun-tahun berusaha mengatasinya :)
Wayne Molina
Oh ya, itu sepadan dengan usaha.
sevenseacat
2

Menurut saya, Anda tepat di depan timun. Menulis semua langkah itu adalah banyak masalah, dan manfaatnya tidak membenarkan rasa sakit. Saya telah menulis secara luas tentang enam kelemahan menggunakan Mentimun di sini: Mengapa Bother With Cucumber Testing?

Tes unit dan tes integrasi reguler, dilakukan dengan Rspec atau Test :: Unit memang masuk akal, tetapi untungnya ini jauh lebih cepat untuk ditulis daripada tes Mentimun. Pertama, Anda dapat menggunakan Ruby murni daripada harus melawan sintaksis Gherkin yang canggung dan canggung.

Jack Kinsella
sumber
2
Saya bisa mengatakan bahwa saya tidak setuju dengan setiap poin Anda tentang pengujian Mentimun. * Itu tidak merusak editor teks yang baik (gedit saya akan menyorot dan melengkapinya dengan baik saja), * Anda tidak boleh menyalin pengaturan tes apa pun dari pengaturan Rspec yang ada ke pengaturan Mentimun Anda (dua set tes dijalankan pada tingkat yang sangat berbeda of granularity), * jika Anda tidak bisa konsisten tentang penamaan halaman Anda itu bukan kesalahan Mentimun (Rails tidak akan membiarkan Anda memanggil rute hal yang berbeda pada hari yang berbeda, jadi mengapa Mentimun harus?) (
Bersambung
1
* Anda mengatakan apa konvensi tentang file langkah tetapi kemudian mengatakan Anda tidak akan tahu di mana harus mencari untuk mengikuti konvensi? Mengapa mempromosikan posting ada dalam hal lain selain post_steps.rb? * Fitur Anda tidak seharusnya menjadi kode, jadi kata-kata tidak relevan - fitur Anda adalah dokumentasi tentang bagaimana aplikasi Anda berperilaku; * Dan terakhir, saya hanya bisa mengkritik 'mencegah penggunaan kembali kode' dengan Anda melakukan kesalahan .
sevenseacat
2

Apa yang saya percayai secara pribadi adalah itu RSpec testing is a definite must. Misalnya, Anda ingin menulis fitur baru, dan yang juga memiliki referensi ke beberapa fitur lain, dan fitur itu mungkin dirujuk dengan beberapa modul atau metode lain. Jadi bagaimana Anda dapat memastikan bahwa apa yang Anda tulis tidak merusak bagian lain dari aplikasi?

Asumsikan bahwa Anda memiliki aplikasi besar dan Anda memiliki kode sesuatu yang sepele dibandingkan dengan keseluruhan aplikasi, apakah Anda akan menguji ulang seluruh aplikasi dengan mengklik setiap tautan dalam aplikasi untuk memastikan itu berfungsi setiap kali Anda mengubah satu baris kode?

Namun, saya percaya bahwa pengujian timun bukanlah suatu keharusan. Saya pikir pengujian integrasi menggunakan RSpec sendiri lebih masuk akal sampai dan kecuali Anda harus mendapatkan tes yang diperiksa oleh klien Anda. Yang dalam pengalaman saya adalah RARE. Jika tim Anda seluruhnya terdiri dari pengembang maka saya pikir Anda sebaiknya mengganti langkah Mentimun untuk pengujian fitur RSpec. Dan saya pikir setelah RSpec 3 DSL, tes cukup mudah dibaca.

Mis:

Definisi Langkah Mentimun:

Given /^I am logged in$/ do
  visit login_path
  fill_in :name, :with => 'Joe'
  fill_in :password, :with => 'Password'
  click_button 'submit'
end

Tes Fitur RSpec:

feature 'Given the user is logged in' do
      visit login_path
      fill_in :name, :with => 'Joe'
      fill_in :password, :with => 'Password'
      click_link_or_button 'submit'
end

Saya berpikir bahwa daripada memiliki fitur Mentimun, fitur RSpec melakukan hal yang sama tanpa sakit kepala ekstra untuk menulis definisi langkah lain.

Selain itu itu juga murni preferensi Anda sendiri.

Semoga ini bisa membantu Anda memahami sedikit.

Sankalp Singha
sumber
0

Menurut pendapat saya hal pertama yang membedakan praktik dan kerangka kerja konkret. Mentimun bukan BDD, RSpec bukan TDD.

Jika Anda ingin menguji sistem RSpec Anda dengan alat yang baik, Anda dapat melakukan TDD atau BDD dengan RSpec, sebenarnya TDD dan BDD adalah hal yang sama. Seseorang mengatakan "BDD TDD-nya dilakukan dengan benar" dan saya sepenuhnya setuju dengan itu, terutama BDD tentang fitur pengujian / perilaku daripada metode pengujian / kelas. Sebenarnya TDD yang Kent Beck gambarkan tentang fitur-fiturnya, tetapi BDD membantu banyak orang dalam memahami perbedaan utama ini dan kontribusi besarnya dari Dan North kepada komunitas pembangunan.

Gunakan Timun jika Anda merasa bahwa Anda memerlukan alat yang lebih baik untuk berkomunikasi dengan pelaku bisnis, misalnya jika timun memungkinkan orang bisnis Anda atau pemilik Produk membantu tim dalam menulis atau merevisi skenario. Orang lain menyukai mentimun karena skenario ini adalah dokumentasi langsung suatu sistem yang sangat bagus, jika Anda merasa bahwa Anda memerlukan jenis dokumentasi ini, cobalah mentimun.

Kesimpulan:

  • Jika Anda ingin melakukan TDD / BDD sendiri atau tim Anda -> coba RSpec
  • Jika Anda ingin cara yang lebih baik untuk berkomunikasi dengan bisnis dengan Histories dan Skenario Pengguna -> coba mentimun
  • Jika Anda ingin dokumentasi langsung fitur sistem Anda -> coba mentimun.

Tentu saja dua terakhir memiliki biaya tinggi yang terkait, Anda perlu mengevaluasi jika Anda benar-benar membutuhkannya dan sepadan dengan usaha, ini tentu saja tergantung sepenuhnya pada proyek Anda dan lingkungan Anda dan keputusan terserah Anda.

Tetapi selalu ingat bahwa RSpec dan Mentimun hanya alat, dan alat memecahkan masalah konkret, masalah apa yang ingin Anda pecahkan ?, tanyakan pada diri sendiri pertanyaan ini dan Anda mungkin berada dalam posisi yang lebih baik untuk memilih alat yang tepat. Menjadi programmer yang lebih baik tentang mengambil keputusan ini bukan tentang menggunakan kerangka kerja X atau Y / alat / perpustakaan / teknologi.

AlfredoCasado
sumber