マニュアルテストのエビデンス取得効率化話【vol.1】


株式会社オズビジョンのユッコ (@terra_yucco) です。

今日はプライベートな用事があってあんまりしっかりした記事がかけないので、自分がマニュアルで PHP スクリプトのテストをするとき、エビデンス取得用に使っている bash スクリプトを晒してみます。
画面が無いバッチ処理のテスト実施は、このスクリプトを作って随分簡易化されました。
※画面要件には適しません。

エビデンス取得用スクリプト

要件

  • そのテストがいつ行われたものか知りたい
  • そのテストで実行されたコマンドが知りたい
  • 事前事後で比較する必要があるものは自動的に取得しておきたい
    • DB 内容
    • ls 結果 など
  • 引数違いのテストなどは同じスクリプトで対応したい

実コード

DB 接続先や実際の起動スクリプトはさすがに書けないのですが、こんな感じのテンプレートを用意し、テスト対象に応じて書き換えて使っています。

#!/bin/bash -u

condition="${1}"
timestamp=$( date +'%Y%m%d%H%M%S' )
base_date=$( date +'%Y-%m-%d 00:00:00' )

c_main_db="mysql --default-character-set=utf8 --verbose -h {{main_endpoint}} -u {{main_user}} -p{{main_password}} -D {{main_database}}"
c_sub_db=" mysql --default-character-set=utf8 --verbose -h {{sub_endpoint}}  -u {{sub_user}}  -p{{sub_password}}  -D {{sub_database}}"

get_evidence() {
  type="${1}"

  ${c_main_db} -e"
  status;
  set session time_zone = 'asia/tokyo'; set names 'utf8';
  select now();
  {{対象データを select する SQL, 条件に ${condition}${base_date} を使ったり}}
  select now();
  " > ./${timestamp}_DB_${type}_main.txt 2>&1

  ${c_sub_db} -e"
  status;
  set session time_zone = 'asia/tokyo'; set names 'utf8';
  select now();
  {{対象データを select する SQL, 条件に ${condition}${base_date} を使ったり}}
  select now();
  " > ./${timestamp}_DB_${type}_sub.txt 2>&1
}

get_evidence "01"

set "-x"
date
echo "file timestamp=[${timestamp}]"
/usr/bin/php {{テスト対象スクリプト}} ${condition}
echo $?
date

set "+x"

get_evidence "02"

exit 0

実行すると何ができるのか

今回は php をインストールしていない windows 上で実施したのでエラーも出ていますが、結果に示すように、タイムスタンプと事前(01)事後(02)でネーミングされたログが取得されます。
bash の内容は set "-x" で表示させているので、呼び出したスクリプトとその戻り値も確認可能です。
なので、これにより、

  • いつ実施したテストなのか: タイムスタンプ及びスクリプト実行前後の date で確認可能
  • 何をテストしたのか: 実行スクリプトで確認可能
  • 事前事後でどのようにデータなどが変わったのか
  • 引数で渡す ${condition} により例えば dollar yen euro などのパターンをテスト可能

という要件を満たすことができます。

owner@DESKTOP-H70OCAI MINGW64 ~/Desktop/qiita
$ pwd
/c/Users/owner/Desktop/qiita

owner@DESKTOP-H70OCAI MINGW64 ~/Desktop/qiita
$ ls -l
total 4
-rwxr-xr-x 1 owner 197609 1091 5月  14 22:52 get_evidence.sh*

owner@DESKTOP-H70OCAI MINGW64 ~/Desktop/qiita
$ bash get_evidence.sh dollar
+ date
2019年 5月 14日 火曜日 22:54:33
+ echo 'file timestamp=[20190514225433]'
file timestamp=[20190514225433]
+ /usr/bin/php '{{テスト対象スクリプト}}' dollar
get_evidence.sh: line 35: /usr/bin/php: No such file or directory
+ echo 127
127
+ date
2019年 5月 14日 火曜日 22:54:34
+ set +x

owner@DESKTOP-H70OCAI MINGW64 ~/Desktop/qiita
$ ls -l
total 8
-rw-r--r-- 1 owner 197609   51 5月  14 22:54 20190514225433_DB_01_main.txt
-rw-r--r-- 1 owner 197609   51 5月  14 22:54 20190514225433_DB_01_sub.txt
-rw-r--r-- 1 owner 197609   51 5月  14 22:54 20190514225433_DB_02_main.txt
-rw-r--r-- 1 owner 197609   51 5月  14 22:54 20190514225433_DB_02_sub.txt
-rwxr-xr-x 1 owner 197609 1091 5月  14 22:52 get_evidence.sh*

owner@DESKTOP-H70OCAI MINGW64 ~/Desktop/qiita
$

普段どう使っているか

Windows 使いな私は、スクリプトの出力があるならそれを見るのと、取得したログを WinMerge で差分確認してテスト結果を確認していることが多いです。

Next Action

diff を取得するところまでスクリプトに組み込み、スクリプト全体の出力結果も別ファイルに書き出せば、それだけでエビデンス取得をほぼ自動化できそうだなあ…なんて考えていたりします。
※繰り返しますが、画面要件には適しません。