ablog

不器用で落着きのない技術者のメモ

shUnit2 を使ってシェルスクリプトのユニットテストをやってみた

シェルスクリプトのユニットテストフレームワーク "shUnit2" を使ってみた - ablog のつづき。
実際に自分で作った bash スクリプトユニットテストを実行してみた。

最初のディレクトリ構成はこんなの。

$ su - oracle
$ cd /home/oracle/scripts
$ tree -pfug
.
|-- [-rwxr-xr-x oracle   oinstall]  ./stop_listener.sh <-- テストしたいスクリプト
`-- [drwxr-xr-x oracle   oinstall]  ./test

1 directory, 1 file

stop_listener.sh のソースコードはこんなの。

#!/bin/bash

if [ "$1" != 'exec' ]; then
        echo "usage: ${BASE_NAME} exec"
        exit 1
fi

source ~/.bash_profile || { echo "Failed to read ~/.bash_profile" ; exit 1 ; }

$ORACLE_HOME/bin/lsnrctl stop
if [ $? -eq 0 ]; then
        echo 'Listener stopped successfully.'
else
        echo 'Failed to stop listener.'
        exit 1
fi

exit 0

shunit2-2.1.5.tgz をダウンロードして解凍して、

$ cd /home/oracle/scripts/test
$ perl -MLWP::Simple -e 'getstore("http://shunit2.googlecode.com/files/shunit2-2.1.5.tgz","shunit2-2.1.5.tgz")';
$ tar xvfz shunit2-2.1.5.tgz 

wget でやったほうが楽ですねw
ディレクトリ構成はざっとこんな感じ。

$ tree -L 3 -pfug /home/oracle/scripts
/home/oracle/scripts
|-- [-rwxr-xr-x oracle   oinstall]  /home/oracle/scripts/stop_listener.sh
`-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test
    |-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5
    |   |-- [-rw-r--r-- oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5/Makefile
    |   |-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5/bin
    |   |-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5/doc
    |   |-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5/examples
    |   |-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5/lib
    |   |-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5/share
    |   `-- [drwxr-xr-x oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5/src
    `-- [-rw-r--r-- oracle   oinstall]  /home/oracle/scripts/test/shunit2-2.1.5.tgz

8 directories, 3 files

テストコードを書いて、

$ vi /home/oracle/scripts/test/test_stop_listener.sh
#!/bin/sh

#-----------------------------------------------------------------------------
# suite tests
#

testNormalEnd()
{
  ../stop_listener.sh exec >${stdoutF} 2>${stderrF}
  rtrn=$?
  assertEquals 'expecting return code of 0' ${rtrn} 0
  assertEquals 'unexpected output to stdout' `grep 'Listener stopped successfully' ${stdoutF}|wc -l` 1
  assertNull   'unexpected output to stderr' "`cat ${stderrF}`"
  assertEquals 'listener is still alive' "`lsnrctl stauts >/dev/null 2>&1; echo $?`" 1
}

#-----------------------------------------------------------------------------
# suite functions
#

oneTimeSetUp()
{
  lsnrctl start > /dev/null
  outputDir="${__shunit_tmpDir}/output"
  mkdir -p "${outputDir}"
  stdoutF="${outputDir}/stdout"
  stderrF="${outputDir}/stderr"
  testDir="${__shunit_tmpDir}/some_test_dir"
}

tearDown()
{
  rm -fr "${testDir}"
}

# load and run shUnit2
[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
#. ../src/shell/shunit2
. shunit2-2.1.5/src/shell/shunit2

Go!

$ chmod +x test_stop_listener.sh 
$ ./test_stop_listener.sh 
testNormalEnd

Ran 1 test.

OK

おぉ、いけた!
これは、気持ちよくリグレッションテストができそうだ!