'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.