シェルスクリプトをテストする

シェルスクリプトにテスト導入、コード品質の向上

Bats でシェルスクリプトをテストする

Install

ubuntu

sudo apt-get install bats

Mac

brew install bats

exec bats

source test.bats

Good pattern

@test 'add test' {
 var_01=5
 var_02=15
 [[ var_01+var_02 -eq 20 ]]
}
@test 'div test' {
 var_01=5
 var_02=15
 [[ var_02/var_01 -eq 3 ]]
}
bats test.bats

結果

add test
✓ div test

2 tests, 0 failures

Bad pattern

@test 'add test' {
 var_01=5
 var_02=15
 [[ var_01+var_02 -eq 20 ]]
}
@test 'div test' {
 var_01=5
 var_02=15
 [[ var_02/var_01 -eq 2 ]]  # Here
}
bats test.bats

結果

add test
✗ div test
  (in test file test.bats, line 9)
    `[[ var_02/var_01 -eq 2 ]]' failed

2 tests, 1 failure

複数ファイルの実行

├── tests
│   ├── test.bats
│   └── test2.bats
bats tests

本来の シェルスクリプトを読み込んでテスト

構成

├── test.sh
└── test.bats

test.sh

#!/usr/bin/env bash

if [[ $1 == test ]]; then
 param='test'
else
 param='not test'
fi

echo "$param"

test.bats

@test 'param test ok' {
  run ./test.sh test
  [[ $status -eq 0 ]]
  [[ $output == 'test' ]]
}

@test 'param test ng' {
  run ./test.sh tst
  [[ $status -eq 0 ]]
  [[ $output == 'not test' ]]
}

テストスクリプトを別ディレクトリで管理したい

構成

├── test.sh
└── tests
    ├── test.bats

bats には bats を実行している絶対パスを BATS_TEST_DIRNAME という環境変数もっている。 でもこの場合は一つ上のディレクトリを指定したい

PATH="${BATS_TEST_DIRNAME%/*}:$PATH"

%/*で一つ上のディレクトリを Path に追加

test.sh

#!/usr/bin/env bash

if [[ $1 == test ]]; then
 param='test'
else
 param='not test'
fi

echo "$param"

tests/test.bats

PATH="${BATS_TEST_DIRNAME%/*}:$PATH"

@test 'param test ok' {
  run test.sh test
  [[ $status -eq 0 ]]
  [[ $output == 'test' ]]
}

@test 'param test ng' {
  run test.sh tst
  [[ $status -eq 0 ]]
  [[ $output == 'not test' ]]
}

run 後の変数

変数 内容
status 終了ステータス
output スクリプトの出力
lines outputを分割した配列

通常は status と output で判定

c


おっさんWEBエンジニア奮闘記©2007 WEBDIMENSION