'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.
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.
sumber
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.
sumber
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:
Tes Fitur RSpec:
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.
sumber
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:
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.
sumber