Kami memiliki sistem yang memiliki beberapa skrip bash yang berjalan selain kode Java. Karena kami mencoba Menguji Segala Sesuatu yang Mungkin Bisa Rusak, dan skrip bash tersebut mungkin rusak, kami ingin mengujinya.
Masalahnya adalah sulit untuk menguji skrip bash.
Apakah ada cara atau praktik terbaik untuk menguji skrip bash? Atau haruskah kita berhenti menggunakan skrip bash dan mencari solusi alternatif yang dapat diuji?
Jawaban:
Sebenarnya ada shunit2 , kerangka kerja pengujian unit berbasis xUnit untuk skrip shell berbasis Bourne. Saya sendiri belum pernah menggunakannya, tetapi mungkin ada baiknya untuk dicoba.
Pertanyaan serupa telah ditanyakan sebelumnya:
sumber
Saya mendapat jawaban berikut dari kelompok diskusi:
Metode ini seperti injeksi ketergantungan untuk skrip, dan terdengar masuk akal. Menghindari skrip bash dan menggunakan bahasa yang lebih mudah diuji dan kurang jelas lebih disukai.
sumber
Pengujian Bash yang sesuai dengan TAP : Sistem Pengujian Otomatis Bash
inti kelelawar
sumber
Nikita Sobolev menulis posting blog yang sangat bagus yang membandingkan beberapa kerangka kerja pengujian bash yang berbeda: Menguji aplikasi Bash
Untuk yang tidak sabar: Kesimpulan Nikita adalah menggunakan Kelelawar tetapi tampaknya Nikita melewatkan proyek inti Kelelawar yang menurut saya akan digunakan di masa mendatang karena proyek Kelelawar asli belum aktif dipertahankan sejak 2013.
sumber
Epoxy adalah kerangka kerja pengujian Bash yang saya rancang terutama untuk menguji perangkat lunak lain, tetapi saya juga menggunakannya untuk menguji modul bash, termasuk dirinya sendiri dan Karton .
Keuntungan utama adalah overhead pengkodean yang relatif rendah, penyarangan pernyataan tidak terbatas, dan pemilihan pernyataan yang fleksibel untuk diverifikasi.
Saya membuat presentasi yang membandingkannya dengan BeakerLib - kerangka kerja yang digunakan oleh beberapa orang di Red Hat.
sumber
Mengapa Anda mengatakan bahwa "sulit" untuk menguji skrip bash?
Apa yang salah dengan pembungkus uji seperti:
sumber
Saya membuat shellspec karena saya menginginkan alat yang mudah digunakan dan berguna.
Ini ditulis oleh skrip shell POSIX murni. Ini telah diuji dengan banyak cangkang lebih dari shunit2. Ini memiliki fitur yang kuat daripada kelelawar / inti kelelawar.
Misalnya, mendukung blok bersarang, mudah dibuat tiruan / stub, mudah dilewati / tertunda, pengujian berparameter, nomor baris pernyataan, dieksekusi berdasarkan nomor baris, eksekusi paralel, eksekusi acak, formatter TAP / JUnit, cakupan dan integrasi CI, profiler, dll. .
Lihat demo di halaman proyek.
sumber
Saya sangat menyukai shell2junit , sebuah utilitas untuk menghasilkan keluaran seperti JUnit dari pengujian skrip Bash. Ini berguna karena laporan yang dihasilkan kemudian dapat dibaca oleh sistem integrasi berkelanjutan, seperti plug-in JUnit untuk Jenkins dan Bamboo.
Meskipun shell2junit tidak menyediakan kerangka kerja skrip Bash yang komprehensif seperti shunit2 , shell2junit memungkinkan Anda memiliki laporan hasil pengujian yang bagus.
sumber
Coba bashtest . Ini cara sederhana untuk menguji skrip Anda. Misalnya, Anda memiliki
do-some-work.sh
yang mengubah beberapa file konfigurasi. Misalnya, tambahkan baris baruPASSWORD = 'XXXXX'
ke file konfigurasi/etc/my.cfg
.Anda menulis perintah bash baris demi baris dan kemudian memeriksa keluaran.
Install:
Membuat tes hanyalah menulis perintah bash.
File
test-do-some-work.bashtest
:Jalankan tes:
Anda dapat menemukan beberapa contoh di sini dan di sini
sumber
Mungkin ini bisa digunakan, atau dikontribusikan
https://thorsteinssonh.github.io/bash_test_tools/
Dimaksudkan untuk menulis hasil dalam protokol TAP yang menurut saya bagus untuk CI, dan bagus untuk mereka yang menginginkan lingkungan shell. Saya membayangkan beberapa hal berjalan di lingkungan shell jadi, beberapa mungkin berpendapat harus diuji di lingkungan shell mereka.
sumber
Cobalah untuk menegaskan.sh
Semoga membantu!
sumber
Saya tidak percaya tidak ada yang berbicara tentang K3 ! Ini kompatibel dengan baik TAP dan JUnit, itu shell murni (yaitu, tidak ada bahasa lain yang terlibat), ia bekerja mandiri juga, dan itu sederhana dan langsung.
Pengujian terlihat seperti ini (cuplikan diambil dari halaman proyek):
Lari sederhana:
Tes terakhir menunjukkan "tidak ok", tetapi kode keluarnya adalah 0 karena a
TODO
. Seseorang dapat mengatur verbose juga:Ubah namanya untuk menggunakan
.t
ekstensi dan letakkan dit
subdirektori, dan Anda dapat menggunakanprove(1)
(bagian dari Perl) untuk menjalankannya:Atur
OSHT_JUNIT
atau teruskan-j
untuk menghasilkan keluaran JUnit. JUnit juga bisa digabungkan denganprove(1)
.Saya telah menggunakan pustaka ini untuk menguji fungsi dengan mencari file mereka dan kemudian menjalankan pernyataan dengan
IS
/OK
dan negatifnya, dan skrip dengan menggunakanRUN
/NRUN
. Bagi saya, kerangka kerja ini memberikan keuntungan paling banyak dengan overhead paling sedikit.sumber
Saya telah mencoba banyak solusi yang disajikan di sini, tetapi menemukan sebagian besar dari mereka besar dan sulit digunakan, jadi saya membangun kerangka pengujian kecil saya sendiri: https://github.com/meonlol/t-bash
Ini hanya satu file di repo yang dapat Anda jalankan secara langsung, dengan set dasar gaya JUnit menegaskan.
Saya telah menggunakannya secara profesional di beberapa proyek internal dan mampu membuat skrip bash kami sangat stabil dan tahan regresi.
sumber
Anda mungkin ingin melihat bash_unit:
https://github.com/pgrange/bash_unit
sumber
Lihatlah Outthentic , sederhana, dapat dikembangkan oleh banyak bahasa (Perl, Python, Ruby, Bash on choice) dan kerangka kerja lintas platform (Linux, Windows) untuk menguji aplikasi baris perintah apa pun.
sumber
Saya merasa sulit untuk membenarkan penggunaan bash untuk skrip yang lebih besar ketika Python memiliki keuntungan yang sangat besar:
if [ x"$foo" = x"$bar"]; then ...
' yang rentan terhadap kesalahan.getopt
modul (dan ada modul yang lebih mudah untuk mengurai argumen, tetapi namanya luput dari saya).mysql
perintah di bash, tetapi ini bukan cara terbaik untuk menulis kode).$*
atau"$*"
atau"$@"
atau$1
atau"$1"
, spasi dalam nama file tidak menjadi masalah, dll, dll, dll.Sekarang saya hanya menggunakan bash untuk skrip yang paling sederhana.
sumber
if [[ $foo = $bar ]]; then ...
. Ini masih tidak lebih baik dari apa yang ditawarkan python, tapi lebih baik dari apa yang Anda sajikan.trap
(untuk membersihkan / membatalkan jika terjadi kesalahan) serta regex (yaitu[[ $1 =~ ^[1-3]{3}$ ]]
). Saya cukup yakin sintaks tidak jelas yang Anda gunakan mengacu pada implementasi lamatest
, bukan bash. Bash sangat bagus untuk berinteraksi dengan alat baris perintah yang ada ... Seringkali satu pipa keawk
ataugrep
jauh lebih mudah daripada alternatif Python.optparse
atau penerusnyaargparse
. Saya belum pernah melihat seseorang menggunakangetopt
modul ini, dan saya juga belum pernah menggunakannya secara pribadi. Namungetopt
utilitasnya bagus. Penguraian argumen dari shell bukanlah masalah sama sekali setelah Anda mendapatkan pola yang bagus. Kecuali Anda mencoba menerapkan sub-perintah git-style atau semacamnya, itu tidak terlalu merepotkan.