Serverspecのテスト結果を集計するバッチファイルを作成した

# はじめに

テスト終了時に画面にサーバ毎の成功数／失敗数を表示したくなったので対応してみました。

exampleの行を集計するだけですが、こんな感じで最後に表示します。

```serverspec
PS C:\serverspec\sample> rake

（省略：Serverspecのメッセージ出力）

##################################################
SUMMARY
##################################################
DEV-WEB01 : CASE=132 / OK=132 / NG=0
DEV-WEB02 : CASE=132 / OK=132 / NG=0
STG-WEB01 : CASE=128 / OK=128 / NG=0
STG-WEB02 : CASE=128 / OK=128 / NG=0
DEV-DB01 : CASE=91 / OK=91 / NG=0
DEV-DB02 : CASE=91 / OK=91 / NG=0
STG-DB01 : CASE=91 / OK=91 / NG=0
STG-DB02 : CASE=91 / OK=91 / NG=0
TOTAL=884 / OK=884 / NG=0
##################################################

PS C:\serverspec\sample>
```

# 集計スクリプトの作成

```awk:$TEST_HOME\sample\lib\sum.awk
# 前処理
BEGIN {
    num_ng = 0
    sum = 0
    target = ""
}
# ホスト名の判定
/^HOST: / {
    target = $2
}
# カウント
/examples,.*failure/ {
    num_ng += $3
    sum += $1
    printf("%s : CASE=%s / OK=%s / NG=%s\n", target, $1, $1 - $3, $3)
}
# 後処理
END {
    printf("TOTAL=%s / OK=%s / NG=%s\n", sum, sum - num_ng, num_ng)
}
```

# spec_helper.rbの修正

上述のawkスクリプトでホスト名で集計できるように「spec_helper.rb」で「HOST: ホスト名」を出力するようにします。

```ruby:C：\serverspec\sample\spec\spec_helper.rb
require 'serverspec'
#（省略）
params['hostname'] = ENV['TARGET_HOST']
puts ""
puts "##################################################"
puts "HOST: #{params['hostname']} : #{params['run_env']}"
puts "##################################################"
#（省略）
```


# Windowsの場合：バッチファイルの作成

※事前にlogディレクトリの作成が必要です。
※catやteeなど「Gow」を使っていますのであらかじめインストールが必要です。

```bat:$TEST_HOME\sample\ExecTest.cmd
@ECHO OFF
:: Serverspec
SET PATH_D_SCR=%~dp0
SET PATH_D_SCR=%PATH_D_SCR:~0,-1%
SET YYYYMMDD=%DATE:~-10,4%%DATE:~-5,2%%DATE:~-2,2%
SET TIME_HMMSS=%TIME: =0%
SET HHMMSS=%TIME_HMMSS:~0,2%%TIME_HMMSS:~3,2%%TIME_HMMSS:~6,2%
SET PATH_F_LOG=%PATH_D_SCR%\log\Result.%YYYYMMDD%.%HHMMSS%.log
SET PATH_F_SUM=%PATH_D_SCR%\log\Summary.%YYYYMMDD%.%HHMMSS%.txt
SET PATH_D_GOW=C:\Tool\Gow\bin
ECHO.
ECHO PATH_D_SCR = %PATH_D_SCR%
ECHO YYYYMMDD   = %YYYYMMDD%
ECHO HHMMSS     = %HHMMSS%
ECHO PATH_F_LOG = %PATH_F_LOG%
ECHO.
cd %PATH_D_SCR%
ruby -e "puts Time.now.to_i"  | %PATH_D_GOW%\tee.exe %PATH_F_LOG%
rake | %PATH_D_GOW%\tee.exe -a %PATH_F_LOG%
ruby -e "puts Time.now.to_i"  | %PATH_D_GOW%\tee.exe -a %PATH_F_LOG%
ECHO.
ECHO.
ECHO ############################################################
ECHO SUMMARY
ECHO ############################################################
%PATH_D_GOW%\cat.exe %PATH_F_LOG% | %PATH_D_GOW%\awk.exe -f %PATH_D_SCR%\lib\sum.awk | %PATH_D_GOW%\tee.exe %PATH_F_SUM%
ECHO.
ECHO ############################################################
```

# Linuxの場合：シェルスクリプトの作成

※事前にlogディレクトリの作成が必要です。

```bash:$TEST_HOME/sample/ExecTest.sh
#!/bin/sh
NOW=`date '+%Y%m%d.%H%M%S'`
PATH_D_SH="$(cd $(dirname $0) && pwd)"
PATH_F_LOG="${PATH_D_SH}/log/serverspec.${NOW}.log"
PATH_F_SUM="${PATH_D_SH}/log/summry.${NOW}.txt"
cd "${PATH_D_SH}"
NOW_UNIXTIME=`ruby -e "puts Time.now.to_i"`
echo "#----------------------------------------------------------------------" | tee -a ${PATH_F_LOG}
echo "# START : ${NOW} ${NOW_UNIXTIME}" | tee -a ${PATH_F_LOG}
echo "#----------------------------------------------------------------------" | tee -a ${PATH_F_LOG}
rake | tee -a ${PATH_F_LOG}
cd "${PATH_D_SH}"
NOW_UNIXTIME=`ruby -e "puts Time.now.to_i"`
echo "#----------------------------------------------------------------------" | tee -a ${PATH_F_LOG}
echo "# E N D : ${NOW} ${NOW_UNIXTIME}" | tee -a ${PATH_F_LOG}
echo "#----------------------------------------------------------------------" | tee -a ${PATH_F_LOG}
echo ""
echo ""
echo "#----------------------------------------------------------------------"
echo "# SUMMRY"
echo "#----------------------------------------------------------------------"
cat ${PATH_F_LOG} | awk -f ./lib/sum.awk | tee ${PATH_F_SUM}
echo "#----------------------------------------------------------------------"
exit 0
```