シェルスクリプトのテストコードがあるのか調べていたら、ありました。 なかなか使い勝手がよかったので、色々まとめます。

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には機能があるみたいなので、勉強しよう。

参考

以下のサイトを参考にさせていただきました、ありがとうございます。