今回はShellを作成した後、内容を確認するため、単体テストとコードのテストカバレッジ取得が必要となります。以下のフレームワークで簡単に実現できます。
shUnit2 xUnit形式の自動テストフレームワーク
shUnit2 + shcov/kcov shUnit2に加えてshcovまたはkcovを使ってコードカバレッジも計測
shUnit2 + shcov/kcov shUnit2に加えてshcovまたはkcovを使ってコードカバレッジも計測
shunit2とは
シェルスクリプト向け自動テストフレームワークとなり、シェルスクリプト版Log4jとなるLog4shのテストのために開発されたものだそう。
bashだけではなく、bsh、ksh、zshなどにも対応しています。
shunit2とshcovのダウンロード&解凍
shunit2とshcovのtarファイルをダウンロードする。
shunit2の各バージョンファイルを参照してください。
shcovの各バージョンファイルを参照してください。
コマンドは以下の内容を参照してください。
# shunit2ダウンロード
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz
# shunit2解凍
tar -xvf shunit2-2.1.6.tgz
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shunit2/shunit2-2.1.6.tgz
# shunit2解凍
tar -xvf shunit2-2.1.6.tgz
# shcovダウンロード
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shcov/shcov-5.tar.gz
# shcov解凍
tar -xvf shcov-5.tar.gz
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/shcov/shcov-5.tar.gz
# shcov解凍
tar -xvf shcov-5.tar.gz
業務用のシェルの準備
ファイル名: shunit2_test.sh
#!/bin/bash
function shunit2_test() {
local valA=$1
local valB=$2
if [[ $valA > $valB ]]; then
echo “parameter1 > parameter2”
else
echo “parameter1 < parameter2”
fi
exit 0
}
function shunit2_test() {
local valA=$1
local valB=$2
if [[ $valA > $valB ]]; then
echo “parameter1 > parameter2”
else
echo “parameter1 < parameter2”
fi
exit 0
}
テスト用シェルの準備
ファイル名: shunit2_test.shunit2
#!/bin/bash
readonly TESTEE=’shunit2_test’
# 全てのテストに対する共通の環境を準備する
function oneTimeSetUp() {
cat <<__EOC__
——————————————————————————–
shUnit2 開始 バージョン: ${SHUNIT_VERSION} テスト対象: ${TESTEE}
——————————————————————————–
__EOC__
. ./shunit2_test.sh
}
# 全てのテストが完了した後、環境をきれいにする
function oneTimeTearDown() {
cat <<__EOC__
——————————————————————————–
shUnit2 終了
——————————————————————————–
__EOC__
}
# 各テストの前に環境を再設定する
function setUp() {
echo -n “”
}
# 各テストの後に環境をきれいにする
function tearDown() {
echo -n “”
}
# suite 関数の中で suite_addTest 関数を使用してテスト関数とするテスト関数名を定義します。
function suite() {
#suite_addTest shunit2_test_2
#echo “suite OK”
echo -n “”
}
# テスト関数のテスト名をtestで始める。
function testFunc1() {
result=”$(shunit2_test 1 2)”
expected=”parameter1 < parameter2″
assertEquals “result error” “${expected}” “${result}”
}
function testFunc2() {
result=”$(shunit2_test 2 1)”
expected=”parameter1 > parameter2″
assertEquals “result error” “${expected}” “${result}”
}
readonly TESTEE=’shunit2_test’
# 全てのテストに対する共通の環境を準備する
function oneTimeSetUp() {
cat <<__EOC__
——————————————————————————–
shUnit2 開始 バージョン: ${SHUNIT_VERSION} テスト対象: ${TESTEE}
——————————————————————————–
__EOC__
. ./shunit2_test.sh
}
# 全てのテストが完了した後、環境をきれいにする
function oneTimeTearDown() {
cat <<__EOC__
——————————————————————————–
shUnit2 終了
——————————————————————————–
__EOC__
}
# 各テストの前に環境を再設定する
function setUp() {
echo -n “”
}
# 各テストの後に環境をきれいにする
function tearDown() {
echo -n “”
}
# suite 関数の中で suite_addTest 関数を使用してテスト関数とするテスト関数名を定義します。
function suite() {
#suite_addTest shunit2_test_2
#echo “suite OK”
echo -n “”
}
# テスト関数のテスト名をtestで始める。
function testFunc1() {
result=”$(shunit2_test 1 2)”
expected=”parameter1 < parameter2″
assertEquals “result error” “${expected}” “${result}”
}
function testFunc2() {
result=”$(shunit2_test 2 1)”
expected=”parameter1 > parameter2″
assertEquals “result error” “${expected}” “${result}”
}
# suite_addTest 関数で定義されたテスト関数
function shunit2_test_2() {
expected=”testResult”
result=”testResult”
assertEquals “test error” “${expected}” “${result}”
}
# shUnit2のロード
. ./shunit2-2.1.6/src/shunit2
function shunit2_test_2() {
expected=”testResult”
result=”testResult”
assertEquals “test error” “${expected}” “${result}”
}
# shUnit2のロード
. ./shunit2-2.1.6/src/shunit2
テスト実行
./shunit2_test.shunit2
実行結果:
実行結果:
——————————————————————————–
shUnit2 開始 バージョン: 2.1.6 テスト対象: shunit2_test
——————————————————————————–
testFunc1
testFunc2
——————————————————————————–
shUnit2 終了
——————————————————————————–
Ran 2 tests.
OK
カバレッジ取得で実行
# ./shcov-5/scripts/shcov shunit2_test.shunit2
実行結果:
——————————————————————————–
shUnit2 開始 バージョン: 2.1.6 テスト対象: shunit2_test
——————————————————————————–
testFunc1
testFunc2
——————————————————————————–
shUnit2 終了
——————————————————————————–
Ran 2 tests.
OK
カバレッジ結果をHTMLに出力
outputディレクトリをダウンロードし、index.htmlを開き、シェルのテストカバレッジを確認できました。
./shcov-5/scripts/shlcov /tmp/shcov output
結果:
ls -ltr output
total 32
drwxrwxr-x 3 ec2-user ec2-user 17 May 25 16:50 root
-rw-rw-r– 1 ec2-user ec2-user 3277 May 25 16:56 index.html
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 snow.png
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 ruby.png
-rw-rw-r– 1 ec2-user ec2-user 167 May 25 16:56 glass.png
-rw-rw-r– 1 ec2-user ec2-user 7290 May 25 16:56 gcov.css
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 emerald.png
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 amber.png
結果:
ls -ltr output
total 32
drwxrwxr-x 3 ec2-user ec2-user 17 May 25 16:50 root
-rw-rw-r– 1 ec2-user ec2-user 3277 May 25 16:56 index.html
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 snow.png
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 ruby.png
-rw-rw-r– 1 ec2-user ec2-user 167 May 25 16:56 glass.png
-rw-rw-r– 1 ec2-user ec2-user 7290 May 25 16:56 gcov.css
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 emerald.png
-rw-rw-r– 1 ec2-user ec2-user 141 May 25 16:56 amber.png