シェルスクリプトのユニットテストフレームワーク "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
おぉ、いけた!
これは、気持ちよくリグレッションテストができそうだ!