RSpec: Apa perbedaan antara fitur dan spesifikasi permintaan?

113

Apa perbedaan konseptual antara spesifikasi fitur Rspec dan spesifikasi permintaan ?

Dari dokumen spesifikasi fitur:

Spesifikasi fitur adalah pengujian tingkat tinggi yang dimaksudkan untuk melatih fungsionalitas melalui aplikasi. Mereka harus menjalankan aplikasi hanya melalui antarmuka eksternalnya, biasanya halaman web.

Dan untuk spesifikasi permintaan:

Spesifikasi permintaan menyediakan pembungkus tipis di sekitar pengujian integrasi Rails, dan dirancang untuk mendorong perilaku melalui tumpukan penuh, termasuk perutean (disediakan oleh Rails) dan tanpa stubbing (terserah Anda). Dengan spesifikasi permintaan, Anda dapat:

  • tentukan satu permintaan
  • tentukan beberapa permintaan di beberapa pengontrol
  • tentukan beberapa permintaan di beberapa sesi

Saya tahu bahwa spesifikasi fitur menggunakan Capybara dan spesifikasi permintaan tidak. Tapi itu hampir tidak memberikan konsep yang berbeda.

membahayakan
sumber

Jawaban:

147

Perbedaan konseptualnya adalah Anda biasanya menguji cerita pengguna, dan semua interaksi harus didorong melalui antarmuka pengguna. Di situlah Capybara berperan. Spesifikasi permintaan masih menguji perilaku aplikasi Anda dan tidak memiliki ekspektasi keterbacaan seperti yang akan dilakukan oleh uji penerimaan. Jadi, ada fitur untuk meningkatkan sintaks untuk tes penerimaan.

Perbedaan teknis mencakup spesifikasi permintaan yang membungkus pengujian integrasi Rails, sedangkan spesifikasi fitur tidak. Ini berarti dengan spesifikasi permintaan Anda dapat menggunakan metode get, post, put, delete dan assert terhadap respon. Dengan spesifikasi fitur, Anda harus mendorong semua interaksi melalui browser dan menggunakan metode seperti mengunjungi dan menegaskan pada halaman.

Saya akan merekomendasikan membaca feature_spec.feature di kode sumber rspec-rails di github. Saya harap ini membantu.

Richard Jordan
sumber
2
Jadi, apakah Anda akan merekomendasikan penggunaan fitur dan spesifikasi permintaan, atau apakah salah satunya sudah cukup? (Menjadi baru di TDD ...)
robertwbradford
2
Saya menggunakan keduanya, @robertwbradford. Saya menggunakan spesifikasi fitur untuk mendorong saya keluar dalam pengujian - menguji pengalaman pengguna dan kemudian membangun fungsionalitas menggunakan pengujian unit. Saya menggunakan spesifikasi permintaan untuk menguji tanggapan - misalnya dalam session_spec saya mungkin memiliki "GET /login"blok yang menggambarkan dengan harapan di itblok seperti expect(response.status).to eq(200)dan expect(response).to render_template(:new), atau di describe "POST /sessions", context "with valid credentials"blok, dengan expect(response).to redirect_to(user)danfollow_redirect!; expect(response.body).to include("Signed in")
Richard Jordan
5
Dan apakah Anda juga menggunakan spesifikasi pengontrol? Tampaknya ada sedikit duplikasi antara apa yang Anda uji dalam spesifikasi permintaan dan apa yang biasanya diuji dalam spesifikasi pengontrol.
Ernesto
5
Mengatakan itu, posting tertaut di atas dengan jelas menggambarkan perbedaannya. Gunakan spesifikasi permintaan untuk menguji melalui API, gunakan spesifikasi fitur untuk menguji melalui frontend.
Damien Roche
2
@RichardJordan: Sebuah pertanyaan: Dalam spesifikasi fitur, apakah Anda akan merekomendasikan untuk menggunakan jalur Rails (yaitu visit users_path) atau string yang di-hardcode ( visit '/users') ?. Secara pribadi, saya memilih untuk tidak menggunakan aplikasi internal apa pun dalam spesifikasi semacam itu.
tokland