Saya memiliki aplikasi Rails dengan lebih dari 2.000 contoh dalam tes RSpec saya. Tak perlu dikatakan, ini adalah aplikasi yang besar dan ada banyak hal yang harus diuji. Menjalankan pengujian ini pada tahap ini sangat tidak efisien dan karena memakan waktu lama, kami hampir putus asa untuk menulisnya sebelum meluncurkan versi baru. Saya menambahkan --profile ke spec.opts saya untuk menemukan contoh yang paling lama berjalan dan setidaknya ada 10 di antaranya yang membutuhkan waktu rata-rata 10 detik untuk dijalankan. Apakah itu normal di antara Anda ahli RSpec? Apakah 10 detik terlalu lama untuk satu contoh? Saya menyadari bahwa dengan 2.000 contoh, akan membutuhkan waktu yang tidak sepele untuk menguji semuanya secara menyeluruh - tetapi pada titik ini 4 jam agak menggelikan.
Waktu seperti apa yang Anda lihat untuk contoh terlama Anda? Apa yang dapat saya lakukan untuk memecahkan masalah spesifikasi saya yang ada untuk mengetahui kemacetan dan membantu mempercepat. Setiap menit akan sangat membantu saat ini.
sumber
perftools.rb
bersama dengan kerangka pengujian Anda untuk memahami apa yang menggunakan sebagian besar waktu Anda. Terima 10 panggilan teratas dan cobalah untuk menghilangkan / membaca sepintas. Kemudian ulangi, sampai bahagia.Jawaban:
10 detik adalah waktu yang sangat lama untuk menjalankan satu pengujian. Naluri saya adalah bahwa target spesifikasi Anda menjalankan pengujian unit dan integrasi pada saat yang bersamaan. Ini adalah hal yang umum terjadi pada proyek dan pada tahap tertentu, Anda perlu mengatasi hutang teknis ini jika Anda ingin menghasilkan lebih banyak, lebih cepat. Ada sejumlah strategi yang dapat membantu Anda melakukan ini ... dan saya akan merekomendasikan beberapa strategi yang telah saya gunakan di masa lalu.
1. Unit Terpisah Dari Tes Integrasi
Hal pertama yang akan saya lakukan adalah memisahkan unit dari tes integrasi. Anda dapat melakukannya dengan:
Filosofinya adalah, Anda ingin bangunan reguler Anda cepat - jika tidak, orang tidak akan terlalu senang untuk sering menjalankannya. Jadi kembalilah ke wilayah itu. Jalankan pengujian reguler Anda dengan cepat, dan gunakan server integrasi berkelanjutan untuk menjalankan build yang lebih lengkap.
Tes integrasi adalah tes yang melibatkan dependensi eksternal (misalnya Database, WebService, Queue, dan beberapa orang akan membantah FileSystem). Tes unit hanya menguji item kode tertentu yang ingin Anda periksa. Ini harus berjalan cepat (9000 dalam 45 detik dimungkinkan), yaitu sebagian besar harus berjalan di memori.
2. Ubah Tes Integrasi Menjadi Tes Unit
Jika sebagian besar pengujian unit Anda lebih kecil dari rangkaian pengujian integrasi, Anda mengalami masalah. Artinya, ketidakkonsistenan akan mulai terlihat dengan lebih mudah. Jadi dari sini, mulailah membuat lebih banyak pengujian unit untuk menggantikan pengujian integrasi. Hal-hal yang dapat Anda lakukan untuk membantu dalam proses ini adalah:
Setelah Anda memiliki pengujian unit yang tepat untuk menggantikan pengujian integrasi - hapus pengujian integrasi. Pengujian duplikat hanya memperburuk pemeliharaan.
3. Jangan Gunakan Perlengkapan
Perlengkapan itu jahat. Gunakan pabrik sebagai gantinya (masinis atau bot pabrik). Sistem ini dapat membuat grafik data yang lebih mudah beradaptasi, dan yang lebih penting, mereka dapat membuat objek dalam memori yang dapat Anda gunakan, daripada memuat sesuatu dari sumber data eksternal.
4. Tambahkan Cek Untuk Menghentikan Tes Unit Menjadi Tes Integrasi
Sekarang setelah Anda memiliki pengujian yang lebih cepat, saatnya untuk melakukan pemeriksaan agar BERHENTI ini terjadi lagi.
Ada perpustakaan yang catatan aktif patch monyet melempar kesalahan ketika mencoba mengakses database (UnitRecord).
Anda juga dapat mencoba memasangkan dan TDD yang dapat membantu memaksa tim Anda menulis tes lebih cepat karena:
5. Gunakan Perpustakaan Lain Untuk Mengatasi Masalah
Seseorang menyebutkan spork (mempercepat waktu muat untuk rangkaian pengujian di bawah rails3), hydra / parallel_tests - untuk menjalankan pengujian unit secara paralel (di beberapa inti).
Ini mungkin harus digunakan TERAKHIR. Masalah Anda yang sebenarnya ada di langkah 1, 2, 3. Selesaikan itu dan Anda akan berada dalam posisi yang lebih baik untuk menggunakan infrastruktur tambahan.
sumber
Untuk buku masak hebat tentang meningkatkan kinerja suite pengujian Anda, lihat presentasi Grease Your Suite .
Dia mendokumentasikan percepatan 45x dalam waktu proses rangkaian pengujian dengan memanfaatkan teknik seperti:
sumber
Anda bisa menggunakan Spork. Ini memiliki dukungan untuk 2.3.x,
https://github.com/sporkrb/spork
atau ./script/spec_server yang mungkin berfungsi untuk 2.x
Anda juga dapat mengedit konfigurasi database (yang pada dasarnya mempercepat kueri database, dll.), Yang juga akan meningkatkan performa untuk pengujian.
sumber
10 detik per contoh sepertinya waktu yang sangat lama. Saya belum pernah melihat spesifikasi yang membutuhkan waktu lebih dari satu detik, dan sebagian besar membutuhkan waktu lebih sedikit. Apakah Anda menguji koneksi jaringan? Menulis database? Sistem file menulis?
Gunakan tiruan dan rintisan sebanyak mungkin - mereka banyak lebih cepat daripada menulis kode yang mengenai database. Sayangnya, mengejek dan mematikan juga membutuhkan lebih banyak waktu untuk menulis (dan lebih sulit untuk dilakukan dengan benar). Anda harus menyeimbangkan waktu yang dihabiskan untuk menulis tes vs. waktu yang dihabiskan untuk menjalankan tes.
Saya setuju dengan komentar Andrew Grimm tentang melihat ke dalam sistem CI yang memungkinkan Anda untuk memparalelkan rangkaian pengujian Anda. Untuk sesuatu sebesar itu, mungkin itu satu-satunya solusi yang layak.
sumber
Beberapa orang telah menyebutkan Hydra di atas. Kami telah menggunakannya dengan sukses besar di masa lalu. Saya baru-baru ini mendokumentasikan proses menyiapkan dan menjalankan hydra: http://logicalfriday.com/2011/05/18/faster-rails-tests-with-hydra/
Saya setuju dengan sentimen bahwa teknik semacam ini tidak boleh digunakan sebagai pengganti tes menulis yang terstruktur dengan baik dan cepat secara default.
sumber
Jika Anda menggunakan model ActiveRecord, Anda juga harus mempertimbangkan biaya enkripsi BCrypt.
Anda dapat membaca lebih lanjut tentang itu di entri blog ini: http://blog.syncopelabs.co.uk/2012/12/speed-up-rspec-test.html
sumber
permata fast_require mungkin bisa membantu Anda. Selain itu, satu-satunya cara Anda adalah (seperti yang Anda lakukan) membuat profil dan mengoptimalkan, atau menggunakan spork atau sesuatu yang menjalankan spesifikasi Anda secara paralel untuk Anda. http://ruby-toolbox.com/categories/distributed_testing.html
sumber
Anda dapat mengikuti beberapa tip sederhana untuk mengetahui terlebih dahulu di mana sebagian besar waktu dihabiskan jika Anda belum mencobanya. Simak artikel di bawah ini:
https://blog.mavenhive.in/7-tips-to-speed-up-your-webdriver-tests-4f4d043ad581
Saya kira sebagian besar dari ini adalah langkah umum yang akan diterapkan terlepas dari alat yang digunakan untuk pengujian juga.
sumber
Hapus rangkaian pengujian yang ada. Akan sangat efektif.
sumber