Bagaimana cara memulai TDD dengan Ruby on Rails? [Tutup]

167

Saya akrab dengan konsep-konsep (mengambil kelas pengujian di perguruan tinggi), tetapi saya tidak yakin bagaimana benar-benar menggunakannya karena saya tidak pernah bekerja pada proyek TDD "nyata".

Saya akan memulai pengembangan proyek menggunakan Ruby on Rails (kemungkinan besar menggunakan 2.3). Aplikasi ini akan digunakan untuk mengelola data, pengguna, dan beberapa file. Ini tidak akan terlalu rumit pada awalnya tetapi mungkin banyak skala dalam 6 bulan ke depan jadi saya merasa ini adalah waktu yang tepat untuk mendapatkan lebih banyak ke TDD.

Saya punya ide dasar tentang bagaimana melakukannya, tetapi saya masih membutuhkan beberapa petunjuk dan saran:

  • Artikel Ruby on Rails TDD 101 apa yang harus saya baca?

  • Apa yang perlu saya uji?

  • Permata / plugin apa yang harus saya gunakan?

  • Haruskah saya menggunakan rspec ? Sesuatu yang lain

  • Setelah saya mendapatkan semua kelas pengujian, bagaimana cara saya pergi dan menyebarkannya? (mis: Integrasi Berkelanjutan)

  • Bagaimana mengkonsumsi TDD sebenarnya?

  • Apakah saya perlu membaca buku tentang ini atau dapatkah saya mendapatkan semuanya hanya dengan bermain-main dengannya dan membaca tutorial online? Jika saya perlu membaca buku, buku apa?


Saya suka belajar dengan contoh sehingga seseorang dapat memberi tahu saya bagaimana saya akan pergi dan mengambil pendekatan TDD untuk memecahkan masalah ini:

Saya punya Perusahaan. Saya punya Kontak. Kontak dapat ditautkan ke 1 perusahaan. Perusahaan dapat memiliki banyak kontak. Saya ingin membuat cara untuk membuat kontak, perusahaan, dan menautkan kontak ke perusahaan.

Anda tidak harus menggunakan contoh ini dalam jawaban Anda tetapi itu akan membantu :)

marcgg
sumber

Jawaban:

202

Artikel Ruby on Rails TDD 101 apa yang harus saya baca?

Saya akan mulai dengan panduan untuk menguji aplikasi rel .

Railscast juga memiliki beberapa screencasts yang sangat baik tentang cara menggunakan alat pengujian yang berbeda.

Apa yang perlu saya uji?

Saya akan mulai dengan model, karena mudah diuji. Aturan sederhananya adalah bahwa Anda harus mencakup setiap pernyataan if dalam pengujian Anda.

Anda harus menguji tujuan metode ini (untuk memastikan itu berfungsi seperti yang diharapkan) serta semua kasus tepi.

Pastikan juga Anda tidak berakhir pada pengujian.

Permata / plugin apa yang harus saya gunakan? Haruskah saya menggunakan rspec? Sesuatu yang lain

Saat Anda mulai, gunakan saja Test Unit. Anda dapat menggunakan rspecatau cucumbersetelah Anda terbiasa dengan dasar-dasarnya.

Autotestadalah alat yang bagus untuk dimiliki jika Anda ingin benar-benar didorong oleh tes. Tapi itu adalah 'yang bagus' tidak diperlukan.

Setelah saya mendapatkan semua kelas pengujian, bagaimana cara saya pergi dan menyebarkannya?

Tidak yakin tentang pertanyaan itu. Anda biasanya tidak menggunakan tes. Setelah Anda memiliki semua kelas pengujian, ketikkan 'rake test' sederhana untuk menjalankan semua tes Anda.

Bagaimana mengkonsumsi TDD sebenarnya?

Ini benar-benar menghemat waktu. Jika Anda suka teka-teki labirin, Anda tahu hampir selalu lebih mudah untuk menyelesaikannya jika Anda beralih dari selesai ke awal. Sama dengan TDD. Tanpa Test Driven, Anda secara konsisten berpikir 'apa yang harus saya lakukan selanjutnya'. Dengan Test Driven, tes akan memberi tahu Anda apa yang harus dilakukan selanjutnya (rusak jika logika tidak ada sehingga Anda hanya perlu memperbaiki bagian yang rusak). Anda juga memiliki lebih sedikit bug yang akan menghemat banyak waktu dalam jangka panjang.

Apakah saya perlu membaca buku tentang ini atau dapatkah saya mendapatkan semuanya hanya dengan bermain-main dengannya dan membaca tutorial online? Jika saya perlu membaca buku, buku apa?

Anda tidak perlu buku. Cara paling efisien untuk mempelajari segala sesuatu adalah: lakukan saja. Kembali ke buku atau sumber daya daring setelah Anda menemukan pertanyaan atau masalah. Ini juga tangkas.

Dalam contoh Anda, hal-hal yang perlu diuji adalah: Kontak dapat ditautkan ke 1 perusahaan, Perusahaan dapat memiliki banyak kontak, menciptakan cara untuk membuat kontak, dan menautkan kontak ke perusahaan.

class CompanyTest <Test::Unit
    def test_relationship # test associations/relationships
        c = companies(:some_company)
        assert_equal [a list of contacts], c.contacts # make sure a company can have multiple contacts
    end
end

class ContactTest<Test::Unit
   def  test_relationships
        c = contact(:some_contact)
        assert_equal some_company, c.company # make sure the contact link to 1 company
   end

   def  test_create/add
        # test create contacts, here you need to make sure the contact is created correctly, and linked to company correctly
   end
end
mis.
sumber
3
Tautan ke artikel rusak, tetapi menemukannya di sini: web.archive.org/web/20100325215651/http://bloritsch.d-haven.net/…
fivetwentysix
13

Saya telah menghasilkan seri video 6-episode yang diajarkan sebagai kelas publik di San Francisco pada musim panas 2010. Materi ini mencakup pengujian dan efisiensi pengembang di Rails 2.3 menggunakan RSpec 1.3. Tanggal sedikit, tetapi konsep utama berlaku untuk Rails 3 dengan Rspec 2.x

http://www.rubyfocus.biz/class_video/2010/07/19/rails_tdd_class_1.html

Wolfram Arnold
sumber
9

Saya merekomendasikan buku ini: Tutorial Ruby on Rails . Saya hampir selesai dengan itu. Buku ini menggunakan TDD seluruh buku. Cobalah!

sivabudh
sumber
5

TDD adalah tentang menulis tes terlebih dahulu. Ini pada dasarnya memaksa Anda untuk menulis klien Anda sendiri sebelum Anda menulis kode aplikasi Anda. Siklus ini umumnya menulis tes untuk API yang tidak ada, menjalankan tes yang mengharapkannya gagal, tulis kode API Anda, jalankan tes Anda lagi dan pastikan itu lulus. Kemudian tulis tes Anda berikutnya ... dan seterusnya.

Anda mungkin juga tertarik dengan panduan Rails ini .

Andy Gaskell
sumber
3

Permata / plugin apa yang harus saya gunakan?

Saya selalu menikmati seharusnya .

Bagaimana mengkonsumsi TDD sebenarnya?

Alasan saya selalu menyukai pengembangan TDD adalah karena ia memfokuskan bagaimana saya akan mengimplementasikan kode tertentu. Saya memiliki perasaan anekdotal bahwa setiap kali saya lebih mematuhi prinsip-prinsip TDD, saya menghabiskan lebih sedikit waktu untuk mengerjakan ulang nanti. Namun, jumlah waktu yang dihabiskan adalah seberapa baik Anda menulis unit test. Jika unit test tidak menangkap perilaku yang diharapkan, semua waktu yang dihabiskan untuk itu terbuang sia-sia.

Patrick Robertson
sumber