shellのunitテストとカバレッジ取得

shellテスト Shell
今回はShellを作成した後、内容を確認するため、単体テストとコードのテストカバレッジ取得が必要となります。以下のフレームワークで簡単に実現できます。
shUnit2        xUnit形式の自動テストフレームワーク
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
# 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

業務用のシェルの準備

ファイル名:  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
}

テスト用シェルの準備

ファイル名: 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}”
}
# suite_addTest 関数で定義されたテスト関数
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
 
 
タイトルとURLをコピーしました