1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【shunit2】シェルスクリプトでも単体テストがしたい!

Posted at

背景

私は度々、シェルスクリプトを作成し自分の業務の効率化をしており、そのスクリプトが便利だったときは同僚に共有している。
しかし、所詮は自分用に作ったスクリプトのため、他の方が使用した際には意図しないエラーが発生するケースがある。業務効率化のために勧めたスクリプトが逆に無駄なコミュニケーションを生み出してしまった。。。
このようなケースを減らし、より高品質なプログラムを渡せるようにしたいと思い、シェルスクリプトでも単体テストができないかと考えた。そして今回、シェルスクリプトの単体テストが可能なshunit2を知り、試してみた

概要

  • shunit2でシェルスクリプトの単体テスト(Unitテスト)が可能
  • shunit2のGitHubリポジトリ:https://github.com/kward/shunit2.git
  • 1ケース1関数
  • テストの関数名はtest~とする
  • . /<shunit2フォルダのパス>/shunit2でshunit2の起動が可能

shunit2

shunit2を使用する。
shunit2はシェルスクリプトの単体テストを実施できるライブラリであり、シェルスクリプトで作成されている
そのため、他言語の環境構築が必要なく、GitHubからクローンしたらすぐに使用することができる。
最高!

■GitHubリポジトリ
https://github.com/kward/shunit2.git

環境構築

私のPC(ホストマシン)はWindowsなので、まずはDockerでLinuxの環境を用意する

作業ユーザーのルートディレクトリにshunitをダウンロードする

FROM ubuntu:20.04

# gitと便利なパッケージをインストール
RUN apt update && apt upgrade -y
RUN apt-get install -y git
# shunit2をクローン

RUN git clone https://github.com/kward/shunit2.git ~/shunit2

# ユーザー作成なども実施したが本記事と無関係のため割愛

※クローンする場所はどこでも良い。自分がわかりやすいところに置いてください

スクリプトの作成

実行するシェルスクリプトを作成する
今回は「第一引数の名前のフォルダを作成する」スクリプトexe.shを作成した

#! /bin/bash

# フォルダを自動で作成するシェルスクリプト
folderName=$1

mkdir $folderName

テストコードの作成

次にテストコードを作成する
テスト用のファイルtest.shを作成しテストコードを記入する。( ファイル名は任意。今回は便宜上test.shとした )
テストコードは以下の3点

  1. 1ケースごとに1つ関数を作成する
  2. 関数名の頭字句はtestとする
  3. ファイルの末尾にshunit2の実行コマンドを記入する。コマンドは. /<shunit2フォルダのパス>/shunit2

この2つに注意してテストコードを作成する

#! /bin/bash

# 状況:「testFolder」フォルダが存在しない
# 期待値「testFolder」フォルダが作成される(正常終了)
testCanMkdir(){
    # 1. 準備:前提状況を作成
    folderName="testFolder"
    if [ -d $folderName ]; then
        rm -r $folderName
    fi

    # 2. 実施
    # exe.sh:先ほど作成したスクリプト
    . exe.sh $folderName

    # 3. 確認
    
    # 1.正常終了したこと
    assertEquals $? 0
    # 2.フォルダが存在すること
    assertTrue "[ -d $folderName ]"
}

. ~/shunit2/shunit2

実行前確認

1. フォルダ構成

フォルダを作成するスクリプトのテストなので、テスト実行前に現在のフォルダ構成を確認
上で作成したスクリプトが2つ存在する

.
|-- exe.sh   # フォルダを自動生成するスクリプト
`-- test.sh  # テストスクリプト

2. 実行可能に変更

exe.shtest.shに実行可能にする

chmod u+x exe.sh test.sh

テストコードの実行

作成したテストファイルtest.shを実行する。
コマンドは<path>/実行ファイルにする。. <path>/test.shではテストが実行されなかった。

./test.sh

このような出力があれば成功!

testCanMkdir

Ran 1 test.

OK

余談:テストケースの追加

テストケースを増やす場合は、テストファイル内に関数を増やす
実行時に既にフォルダが存在するケース(testDirAlreadyExist)を追加した

#! /bin/bash

# 状況:「testFolder」フォルダが存在しない
# 期待値「testFolder」フォルダが作成される(正常終了)
testCanMkdir(){
    # 省略
}

# 状況:「testFolder」フォルダが存在する
# 期待値「testFolder」フォルダが作成されない(異常終了)
testDirAlreadyExist(){
    folderName="testFolder"
    if [ -d $folderName ]; then
        rm -r $folderName
    fi
    mkdir $folderName

    . exe.sh $folderName

    # 1.異常終了したこと
    assertEquals $? 1
    # 2.フォルダが存在すること
    assertTrue "[ -d $folderName ]"
}

. ~/shunit2/shunit2

実行するとRan 2 test.と出力される

$ ./test.sh
testCanMkdir
testDirAlreadyExist
mkdir: cannot create directory 'testFolder': File exists    

Ran 2 tests.

OK

あとがき

shunit2を使うことでシェルスクリプトの単体テストを行うことができた。これを活用できれば運用で使用するシェルスクリプトの品質を高めることができると思った。
また、もし機会があれば他の人に共有する前にテストを行い、業務効率化とシェルスクリプトのテストの二面でドヤ顔をしたい 笑

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?