シェルスクリプトのテストコードがあるのか調べていたら、ありました。 なかなか使い勝手がよかったので、色々まとめます。
batsは、こちらのgithubで公開されています。 https://github.com/sstephenson/bats
インストール
mac
$ brew install bats
other
$ git clone https://github.com/sstephenson/bats.git
$ cd bats
$ ./install.sh /usr/local
サンプルソースを実行してみる
作成
$ vi sample.bats
#!/usr/bin/env bats
@test "addition using bc" {
result="$(echo 2+2 | bc)"
[ "$result" -eq 4 ]
}
@test "addition using dc" {
result="$(echo 2 2+p | dc)"
[ "$result" -eq 4 ]
}
実行
$ bats sample.bats
実行結果
$ bats sample.bats
✓ addition using bc
✓ addition using dc
2 tests, 0 failures
$
外部ファイルを実行した場合
外部ファイルの作成
$ vi common.sh
#!/bin/bash
function test_function() {
echo "$1が引数です。"
}
テストコードの作成
$ vi common_test.bats
#!/usr/bin/env bats
@test "common.sh test" {
source ./common.sh
run test_function aaaa
echo $output
echo $lines[0]
[ "${lines[0]}" = "aaaaが引数です。" ]
}
実行
$ bats common_test.bats
テンプレート的な何か
テストコードで問題を検知した場合、 こう書いておいたらその時の変数の値を出力してくれました。
作成
$ vi template.bats
#!/usr/bin/env bats
@test "テスト内容" {
run echo "success message"
local answer="error message"
local compare="${lines[0]}"
echo "status = ${status}"
echo "output = ${output}"
echo "answer = ${answer}"
echo "compare = ${compare}"
[ "${answer}" = "${compare}" ]
}
実行
$ bats template.bats
結果
$ bats template.bats
✗ テスト内容
(in test file template.bats, line 13)
`[ "${answer}" = "${compare}" ]' failed
status = 0
output = success message
answer = error message
compare = success message
1 test, 1 failure
$
他に使えそうなコマンド、書き方とか
実行結果の最後から二行目を取得
local answer=${lines[((${#lines[@]}-2))]}
findコマンドのヒット件数を取得
local compare=`find /home/myhome/count/ -type f | wc -l`
batsでmysqlのSQL実行結果を取得して比較する場合
MYSQL_PWD="mysql_password"
echo "select * from user_table" > tmp.sql
local sql_result=`mysql -h 127.0.0.1 -u root -B -N database_name < tmp.sql`
local compare="${sql_result}件ヒットしました。"
rm -f tmp.sql
mysqlの実行結果の取得件数のみ取得
local sql_result=`mysql -h 127.0.0.1 -u root -B -N database_name < tmp.sql | wc -l`
シンプルで非常に書きやすいし、Linuxコマンドと組み合わせれば色々幅が広がりそう。 これはいいのを見つけました。 他にもbatsには機能があるみたいなので、勉強しよう。
参考
以下のサイトを参考にさせていただきました、ありがとうございます。