Saat ini saya sedang menulis kerangka pengujian bash, di mana dalam fungsi pengujian, baik pengujian bash standar ( [[
) serta pencocokan yang telah ditentukan sebelumnya dapat digunakan. Pencocokan adalah pembungkus untuk '[[' dan selain mengembalikan kode kembali, setel beberapa pesan bermakna yang mengatakan apa yang diharapkan.
Contoh:
string_equals() {
if [[ ! $1 = $2 ]]; then
error_message="Expected '$1' to be '$2'."
return 1
fi
}
Jadi, saat matcher digunakan, dan gagal, baru error_message ditetapkan.
Sekarang, di beberapa titik kemudian, saya menguji apakah tes tersebut berhasil. Jika berhasil, saya cetak ekspektasi dengan warna hijau, jika gagal dengan warna merah.
Selain itu, mungkin ada kumpulan error_message, jadi saya menguji apakah ada pesan, mencetaknya, dan kemudian membatalkannya (karena pengujian berikut mungkin tidak menetapkan error_message
):
if [[ $error_message ]]; then
printf '%s\n' "$error_message"
unset -v error_message
fi
Sekarang pertanyaan saya adalah, apakah lebih baik untuk menghapus variabel, atau hanya mengaturnya ke '', seperti
error_message=''
Mana yang lebih baik? Apakah itu benar-benar membuat perbedaan? Atau mungkin saya harus memiliki bendera tambahan yang menunjukkan bahwa pesan tersebut telah disetel?
error_message
dengan hal lain, saya akan mengatakan itu tidak masalah. Namun, saya pikir Anda menginginkannya[[ $error_message ]]
, jika tidak Anda menguji bahwa string literal "error_message" ada.Jawaban:
Sebagian besar Anda tidak melihat perbedaan, kecuali Anda menggunakan
set -u
:Jadi sungguh, itu tergantung pada bagaimana Anda akan menguji variabel.
Saya akan menambahkan bahwa cara pengujian yang saya sukai jika disetel adalah:
atau
sumber
var=
tidak "tidak disetel". Itu hanya string kosong yang tidak diberi tanda kutip. Selain ituset -u
, berbagai bentuk perluasan parameter bash juga dapat membedakan antara nilai tidak disetel dan null:${foo:bar}
meluas ke "bar" jikafoo
tidak disetel, tetapi "" saatfoo
null, sementara${foo:-bar}
meluas ke "bar" jika foo tidak disetel atau null.[[ -n $var ]]
bernilai false jikavar
disetel ke string kosong.${foo-bar}
bukan${foo:bar}
. tes sendiri:unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
Seperti yang telah dikatakan, penggunaan unset juga berbeda dengan array
sumber
Jadi, dengan membatalkan pengaturan indeks array 2, Anda pada dasarnya menghapus elemen tersebut dalam array dan mengurangi ukuran array (?).
Saya membuat tes sendiri ..
Yang mengakibatkan..
Jadi hanya untuk mengklarifikasi bahwa menghapus seluruh array sebenarnya akan menghapusnya seluruhnya.
sumber
Berdasarkan komentar di atas, berikut adalah tes sederhana:
Contoh:
sumber