きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

Bash × bats × VS Codeでbashの単体テスト環境を構築してみた

この記事の目的

この記事では、
Bashの自動テストツール(bats)環境の構築
を目的としています。

本題

★batsとは

Bash Automated Testing Systemです。
GitHubのURL↓
github.com


batsは、TAP(後述します)に準拠したbash用のテストフレームワークです。
batsによって、実装したbashが期待通りに動作することを簡単に検証することができます。
batsのテストケースは、bashスクリプトと、batsによって提供される構文で実装します。
こんな感じです(GitHubから拝借しています)。

	#!/usr/bin/env bats
	
	@test "addition using bc" {
	  result="$(echo 2+2 | bc)"
	  [ "$result" -eq 4 ]
	}
	
	@test "addition using dc" {
	  result="$(echo 2 2+p | dc)"
	  [ "$result" -eq 4 ]
	}


上記の例だと、2件のテストケースが定義されています。
resultに格納された値が4になることの検証を行っています。

★環境

以下の環境で作業を行いました。
Virtual Boxで用意したUbuntu(18.04)
Visual Studio Code(1.24.1)
bats(VS Code拡張機能 v.0.1.2)
bats(batsコマンドv.0.4.0)
GNU Bash(4.4.19)

★batsのVSCode拡張機能のインストール

Visual Studio Code拡張機能でbatsを検索し、インストールします。
f:id:kinakomotitti:20180704222150p:plain

★batsコマンドのインストール

batsを実行するためのコマンドをインストールします。
ubuntuのターミナルで以下のコマンドを実行します。
※管理者パスワードが要求されます。

	sudo apt install bats

★動作確認用のbatsファイルとプログラムの用意

batsのコードを実装する環境と、実行する環境が整いました。
引き続き、batsのテストコードと、テスト対象のコードを実装していきます。
テスト対象のコードは以下の通りです。
ファイル名は、Program001.shとします。

	#!/bin/bash
	echo "hello"
	exit 0


単純明快w

続いて、テストコードを実装します。
ファイル名は、Program001.batsとします。

	#!/usr/bin/env bats
	@test "test  name"{
		Run ./Program001.sh       #<-テスト対象のスクリプトを実行します。 
		echo {$lines[0]}                #<- 失敗時の確認用に標準出力の1行目の文字を出力します。
		[ "${lines[0]}"="hello" ]    #<- 標準出力の1行目の文字の検証を行います。
		[ "$status" -eq 0 ]             #<- 終了コードが0であることの検証を行います。
	}


各ファイルは以下のように配置しました。
f:id:kinakomotitti:20180704222202p:plain

これで、準備が完了しました。

★テスト実行

早速テストを実行します。
VSCodeエクスプローラで、対象のファイルが格納されたパスでターミナルを開きます。
f:id:kinakomotitti:20180704222208p:plain

batsコマンドに、対象のテストファイルを渡して実行します。
f:id:kinakomotitti:20180704222215p:plain

実行結果↓
f:id:kinakomotitti:20180704222219p:plain

なお、$statsuの期待値を9にして、わざと失敗させた場合は以下の通りの出力となります。
f:id:kinakomotitti:20180704222224p:plain
わかりやすい!

★実行がうまくいかないとき

自分がbats環境を構築していてはまった点を忘備録として残しておきます。

上記の通りにスクリプトを準備しても、テストが成功しないことがありました。
f:id:kinakomotitti:20180704222252p:plain

何が悪いのかわからないので、テストコードを変更し、
検証に失敗しているlines変数に何が入っているか確認してみました。
f:id:kinakomotitti:20180704222256p:plain

実行してみます。
f:id:kinakomotitti:20180704222302p:plain
許可がない・・・だと・・・

いろいろ調べてみると、ファイルの実行権限が内容だということがわかりました。
参考)http://nasunu-i.b.la9.jp/LinuxBeginner/ExecPermission.htm
おもむろにllコマンドでファイルの権限を調べてみると
権限設定は以下のようになっていました。
f:id:kinakomotitti:20180704222340p:plain

rwだけ・・・
ファイルのプロパティで見ても、読み書きだけ権限になっています。
f:id:kinakomotitti:20180704222345p:plain

確かに権限がなかったです。

結局この問題は、上記画像の「プログラムとして実行可能」チェックをつけるか、
「chmod u+x Program001.shコマンドを実行することで解決します。
↓コマンドを実行し、実行可能権限を付与したところ。
f:id:kinakomotitti:20180704222355p:plain
無事権限が付与され、実行可能を意味する「x」が付きました。
ファイル名の色も変わっています(´▽`)

再度テストを実行すると・・・


無事成功させることができた!(∩´∀`)∩ワーイ
f:id:kinakomotitti:20180704222403p:plain

★TAPとは

TAP(Test Anything Protocol)。
シンプルなテスト出力についての仕様・・らしい。
もともとは、Perlのテストフレームワークとして作られたようですが、
今ではC,C++,Python,Java,JavaScriptなどに守備範囲が広がっています。
いずれ使うこともあるかも・・・

まとめ

batsを使えばbashで実装したスクリプトに対して自動テストを構築することができます。
デグレ防止、要件実装漏れを防ぐためにもとても役立ちます!
Windows開発者としては、同様のことをbatに対してもやれるようにしたい(´▽`)
batの手動テスト減らしたい!