Lチカで始めるテスト自動化(4)テストスクリプトの保守性向上(2)

##1. はじめに
Lチカで始めるテスト自動化シリーズ第四弾です。

オシロスコープ用の単機能テストスクリプトを作成していて次のようなことが気になりました。

- とってもよく似たファイルを量産することになりそう
- 手作業だとファイル名と中身の不一致を起こしそう

```sh:例1)dso_query_vmax_gt1700-lt1900.csv
#
# 1.80V +/- 0.10V
dso,:MEASure:VMAX? CHANnel1
eval_dbl_gt,1.70
eval_dbl_lt,1.90
```

```sh:例2)dso_query_freq_gt995-lt1005.csv
#
# 1000Hz +/- 5Hz
dso,:MEASure:FREQuency? CHANnel1
eval_dbl_gt,995
eval_dbl_lt,1005
```

そこで単機能スクリプトの生成ツールを作成して異なる部分は引数で与えるようにし、保守性を向上します。

これまでの記事はこちらをご覧ください。

1. [Lチカで始めるテスト自動化](https://qiita.com/pbjpkas/items/fd4bd2689deda2d793aa)
2. [Lチカで始めるテスト自動化(2)テストスクリプトの保守性向上](https://qiita.com/pbjpkas/items/337bce392281ee5f0526)
3. [Lチカで始めるテスト自動化(3)オシロスコープの組込み](https://qiita.com/pbjpkas/items/b80b7e199a5aed4688a4)

##2. 作るもの

1. オシロに対してwriteコマンドを発行し、設定を行うための単機能スクリプト生成ツール(dso_write_generator.bat)
2. オシロに対してqueryコマンドを発行し、測定値の取得や期待値と比較するための単機能スクリプト生成ツール(dso_query_generator.bat)
3. 1および2のツールを呼び出す、親玉スクリプト生成ツール(script-generator.bat)の改修

1と2はscript-partsフォルダへ配置します。

###2.1 write系単機能スクリプト生成ツール
visaコマンドを""で囲んで引数として与えます。生成する単機能スクリプトのファイル名は引数をテキスト処理して自動生成します。

```bat:dso_write_generator.bat
@echo off
pushd %~dp0

REM script-parts generator for dso_write
REM %1          : dso command
REM script_brief: Character string in which "double quotes", ":", and "?" are deleted and spaces are replaced with "_" for %1
REM script_name : The name of the generated file

set script_brief=%~1
set script_brief=%script_brief::=%
set script_brief=%script_brief:?=%
set script_brief=%script_brief: =_%
set script_name=dso_write_%script_brief%.csv

echo #>%script_name%
echo # %script_brief%>>%script_name%
echo dso,%~1>>%script_name%

echo %script_name%
type %script_name%

popd
```

```bat:dso_write_generator.bat実行例
>dso_write_generator.bat ":TIMebase:SCALe 0.0002"
dso_write_TIMebaseSCALe_0.0002.csv
#
# TIMebaseSCALe_0.0002
dso,:TIMebase:SCALe 0.0002
```

###2.2 query系単機能スクリプト生成ツール
visaコマンドを""で囲むほか、期待結果の下限値、上限値を一緒に与えます。生成する単機能スクリプトのファイル名は引数をテキスト処理して自動生成します。

```bat:dso_query_generator.bat
@echo off
pushd %~dp0

REM script-parts generator for dso_query
REM %1          : dso command
REM %2          : expected value (lower)
REM %3          : expected value (upper)
REM script_brief: Character string in which "double quotes", ":", and "?" are deleted and spaces are replaced with "_" for %1
REM script_name : The name of the generated file

set script_brief=%~1
set script_brief=%script_brief::=%
set script_brief=%script_brief:?=%
set script_brief=%script_brief: =_%
set script_name=dso_query_%script_brief%_gt%~2-lt%~3.csv

echo #>%script_name%
echo # %script_brief% expected range:%~2-%~3>>%script_name%
echo dso,%~1>>%script_name%
echo eval_dbl_gt,%~2>>%script_name%
echo eval_dbl_lt,%~3>>%script_name%

echo %script_name%
type %script_name%

popd
```

```bat:dso_query_generator.bat実行例
>dso_query_generator.bat ":MEASure:VMAX? CHANnel1" 1.70 1.90
dso_query_MEASureVMAX_CHANnel1_gt1.70-lt1.90.csv
#
# MEASureVMAX_CHANnel1 expected range:1.70-1.90
dso,:MEASure:VMAX? CHANnel1
eval_dbl_gt,1.70
eval_dbl_lt,1.90
```

###2.3 親玉スクリプト生成ツール(script-generator.bat)の改修
2.1、2.2で作成したスクリプト生成ツールをcallします。生成された単機能スクリプトのファイル名は環境変数%script_name%から取得します。

```bat:script-generator.bat
@echo off
REM script generator for LED Light Test Bench

set script_parts_dir=script-parts
set script_file_name=script.csv

（略）

REM デジタルオシロスコープのセットアップ
（略）
call %script_parts_dir%\dso_write_generator.bat ":TIMebase:SCALe 0.0002"
copy /b %script_file_name% + %script_parts_dir%\%script_name%

REM リレーをONし、
copy /b %script_file_name% + %script_parts_dir%\operation_relay_on.csv
REM 1. LEDの点灯電圧が1700mVより大きく1900mVより小さいこと
call %script_parts_dir%\dso_query_generator.bat ":MEASure:VMAX? CHANnel1" 1.70 1.90
copy /b %script_file_name% + %script_parts_dir%\%script_name%

（略）
```

##3. おわりに
以下に示すように保守性を向上することができました。

- 単機能スクリプト生成ツールのおかげで、ファイル名が自動的に一意に決まってファイル名と中身の不一致のようなトラブルを予防できるようになりました。
- 生成されたファイルの名前を環境変数%script_name%で取得することで、手作業によるミスの混入を予防できるようになりました。

##x. 付録
script-generator.batの全文と生成されたscript.csvを掲載します。

```bat:script-generator.bat
@echo off
REM script generator for LED Light Test Bench

set script_parts_dir=script-parts
set script_file_name=script.csv

REM テストベンチのセットアップ
copy /b %script_parts_dir%\setup.csv %script_file_name%

REM デジタルオシロスコープのセットアップ
copy /b %script_file_name% + %script_parts_dir%\setup_dso.csv
call %script_parts_dir%\dso_write_generator.bat ":TIMebase:SCALe 0.0002"
copy /b %script_file_name% + %script_parts_dir%\%script_name%

REM LEDが点灯していないこと(LEDの電圧が200mVより小さいこと)
copy /b %script_file_name% + %script_parts_dir%\eval_int_lt0200.csv

REM リレーをONし、
copy /b %script_file_name% + %script_parts_dir%\operation_relay_on.csv
REM 1. LEDの点灯電圧が1700mVより大きく1900mVより小さいこと
call %script_parts_dir%\dso_query_generator.bat ":MEASure:VMAX? CHANnel1" 1.70 1.90
copy /b %script_file_name% + %script_parts_dir%\%script_name%
REM 2. LEDの点灯周波数が995Hzより大きく1005Hzより小さいこと
call %script_parts_dir%\dso_query_generator.bat ":MEASure:FREQuency? CHANnel1" 995 1005
copy /b %script_file_name% + %script_parts_dir%\%script_name%

REM リレーをOFFし、LEDの電圧が200mVより小さいこと
copy /b %script_file_name% + %script_parts_dir%\operation_relay_off.csv
copy /b %script_file_name% + %script_parts_dir%\eval_int_lt0200.csv
```

```sh:script.csv
# setup
# wait for if restart Arduino Uno
sleep,2
#
# Open UART
open_uart,COM3
#
# model and version check
send,i
rcvd
eval_str_eq,Arduino Test Bench Ver.100
#
# relay assigned Pin number check
send,p
rcvd
eval_int_eq,12
#
# Setup DSO
open_dso,
dso,*IDN?
eval_str_eq,RIGOL TECHNOLOGIES-DS1104Z-DS1ZA200602029-00.04.04.SP3
#
# TIMebaseSCALe_0.0002
dso,:TIMebase:SCALe 0.0002
#
# eval_int_lt0200
send,v
rcvd
eval_int_lt,200
#
# relay ON
send,n
sleep,1
#
# MEASureVMAX_CHANnel1 expected range:1.70-1.90
dso,:MEASure:VMAX? CHANnel1
eval_dbl_gt,1.70
eval_dbl_lt,1.90
#
# MEASureFREQuency_CHANnel1 expected range:995-1005
dso,:MEASure:FREQuency? CHANnel1
eval_dbl_gt,995
eval_dbl_lt,1005
#
# relay OFF
send,f
sleep,1
#
# eval_int_lt0200
send,v
rcvd
eval_int_lt,200
```