効率よく単体テストをする方法

# 目次 #

・投稿しようと思った経緯
・システムの流れを理解する
・効率よくテストを実施する方法、及びテストデータの作成（CSVテスト編）
・効率よくテストを実施する方法、及びテストデータの作成（WEBテスト編）
・その他
・まとめ


## 投稿しようと思った経緯
はるか昔、筆者はテストに関して下記の記事を投稿した。
https://qiita.com/meitantei23/items/3db3131cbca10d6b8cd6
https://qiita.com/meitantei23/items/3fcd70385cd5635f7d9d

それから何年か時が経ち、仕事でテストを担当する機会も増えたが
効率的にテストする為の方法を自分なりに考えてある程度の結論が出たので
それらをまとめていこうと思う。「効率よくテストする為にはどうしよう？」と
悩んでいる方への答えになれば幸いである。


## システムの流れを理解する
効率よくテストする為に最初に行う事は「システムの流れを理解する」ということにある。
言い換えれば、このシステムが何をしたいかという事をまず理解する必要がある。
これを行わないと、テストの知識があっても正しい順番でテストを行う事ができず
時間がかかってしまう可能性がある。具体的な方法としては、システムには必ず
下記のような**システムフロー**というものがあるので、それを元に理解していく。
**※図が雑なのはご愛嬌**
![システムフロー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672842/d22c7d67-8f5f-a244-66d9-b058d21035f6.jpeg)





フローを確認しシステムの流れを理解する為の具体的な手順としては下記になる。
**１：上から順番に読んでいく**
基本的にはシステムで最初に行う事が一番上にくるので、まずは上から順番に何をしているか
というのを確認していく。慣れないうちは時間はかかると思うが、横着をしても理解できないので
**1つずつ確実に確認していくこと**がポイント。

**２：わからない単語等は都度調べる**
フローを確認する中で「発注」・「出荷」等わからない単語が出てくると思う。
放置して進むと、後々になって流れが繋がらなくなり「わからん!!」となるので
**その都度調べるのが大事。**

**３：一通り確認した後、大まかな流れを箇条書きする**
フローを確認した後は、自分が本当にシステムの流れを理解できているかを確認する為
テキストファイル等でシステムの流れを箇条書きしていく。その時のポイントとしては
４：で行うことを踏まえ、人に説明するという意識で書いていくとよい。
上記の図を例にすると下記のように箇条書きする。

・WEB画面から商品を注文する
・注文後に注文テーブルに注文データを登録
・登録後、注文した人に「注文ありがとうメール」を送信する
・システム内で発注判断を行う。発生する場合は仕入先へ発注
　発注しない場合は出荷キャンセルを行う

**４：人にシステムの流れを説明する**
３：で纏めた後は自分の認識が誤っていないかを確認する為、時間を設けてもらい
人にシステムの流れを一から説明していく。基本的にはシステムを作った人に行う事。
上記の図のシステムを説明する場合は「お客様がしたい事としては、WEBから注文したデータを
注文テーブルに登録してメールを注文者に送信。
その後、システム内で仕入先へ発注するか出荷キャンセルかを判断するで合っていますか？」のように
確認する。

ここまで行い問題が無ければ、システムの流れを理解できていると思われる。
逆に理解できていなければ、４：のタイミングでシステムを作った人に確認すればよい。


## 効率よくテストを実施する方法、及びテストデータの作成（CSV編）
上記でシステムの流れを理解した後は、実際にシステムの流れにそってテストを行っていく。
基本的にはCSVのテストから行っていく。理由としてはCSVでデータを作成してから
画面系のテストを行った方が、テストデータがある状態でテストできるので
WEBテストにかかる時間が短くなるからである。

CSV系で代表的なテストとしては、下記のようなCSVの設定シートがあり
このシート通りにCSVがインポートできるかどうかを確認するテストがある。
![CSVテスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672842/f2b52bdd-d9fd-ee19-dae4-699a097cfb90.jpeg)

上記のCSVテストをする際、作成するテストCSVとしては下記のような種類がある。

①エラーが出ないCSV
商品ID、商品名、単価
12345678,正常系テスト,100

②必須確認用のCSV
商品ID、商品名、単価
,,

③桁数確認用のCSV
商品ID、商品名、単価
123456789,123456789012345678901,123456789

④文字種確認用のCSV
商品ID、商品名、単価
abc,123456789012345678901,abc

上記のファイルを用意し順番でテストしても良いが、一個ずつテストしては効率が良くない。
効率良くテストする為には、下記のように一気にテストするのがよい。
商品ID、商品名、単価
12345678,正常系テスト,100
,,
123456789,123456789012345678901,123456789
123456789,あいうえおかきくけこさ,123456789
abc,123456789012345678901,abc

このようなCSVを1つ用意すれば、後は1回インポートするだけで
上記シートで確認しなければならない内容を確認できる。
このように、**複数回必要な手順を1回でまとめて行う事が
効率よくテストする為に必要になってくる。**
CSVテストをする時は参考にしてほしい。



## 効率よくテストを実施する方法、及びテストデータの作成（WEBテスト編）
次はWEBテストを効率よく進める手順を説明していく。
基本的には上記CSVテストで作成したデータを元にテストを進めていく。
WEBテストといっても色んなテストがあると思うが
今回は以前記事にした下記の内容を元にWEBテストを効率化する方法を記載していく。
https://qiita.com/meitantei23/items/3db3131cbca10d6b8cd6

 **①必須チェックの場合**
必須チェックは基本的に **「空欄の場合」・「空欄じゃない場合」** の2パターンのパターンしかない。
それほど効率化する事はできないが、敷いてあげれば「複数項目の必須チェックを一気に行う」
というのがある。例えば下記画面の必須チェックを行うとする。
![必須チェック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672842/25e66f1e-cadb-a25b-cdc6-6830ce63d18a.png)
3項目の必須チェックを行う場合、「①3項目を空欄にして登録ボタンを押す」
「②3項目を空欄以外にして登録ボタンを押す」というように
3項目全部テストするのが最も効率よく必須チェックを行えると思う。

**②最大文字数チェックの場合**
最大文字数チェックは **「設定値桁ちょうどの場合」・「設定値桁より1桁上の場合」** の2パターンのパターンのみ確認すればよい。①の画像でいうと、例えば全項目が最大10桁の場合は
「①3項目を10桁にして登録ボタンを押す」
「②3項目を11桁にして登録ボタンを押す」というように
3項目全部テストするのが最も効率よく必須チェックを行える。
最大桁数が異なる場合は、①の部分をそれぞれの項目の最大桁数を入力してテストすればよい。

**③文字種チェックの場合**

**⑤境界値チェックの場合**
境界値チェックの場合、例えば商品一覧等の画面で商品の在庫数が下記のような状態の時
表示する記号が変わるのを確認するテストを行うとする。
![WEBテスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672842/9d3274d1-2324-3084-0362-4d3f63715401.jpeg)




このようなテストを行う時、DBのデータを更新する等して上記のパターンが網羅できるように
した上でテストすると思う。それでも良いと思うが確認するパターンが多くなると
DBのデータを更新するのに時間がかかってしまう。
一番効率良くテストするには下記の手順でテストをした方が良い。

①全パターンを網羅しているCSVのテストデータを用意。
②①で用意したCSVをインポート
③対象の画面を確認

一例として「値の閾値テスト」を例にあげたが、ある程度のデータが必要なWEBテストを行う場合は
個人的に上記の手順で行うのが一番効率良くテストが出来ると思う。



## その他
上記でCSV・WEBのテストをすればほとんどの単体テストで効率良くテストできると思う。
上記の手順で効率よくテストし時間に余裕ができた場合は
**「運用を想定したテスト」** を行った方が良い。

**「運用を想定したテスト」ってなんやねーーん**というのを、**システムの流れを理解する**で
使用した図を使って説明すると、注文して「注文ありがとうメール」が送られるかどうかのテストを行うと思うが、注文する以前に商品をカートに入れる動きや
注文する前の画面（一般的に注文確認画面と言う）に移動した際の単価の表示に問題がないかの
テストがいる。

**「そのテストいる？」** と思うかもしれないが、実際にシステムを使用する人の事を考えると
1から注文するまでの流れのテストを行った方が良く、これを行う事で不具合の発見漏れというのが
少なくなり、より品質の良いシステムを作るのにつながる・・・はず。
※「効率良く」とは違う話だが、伝えたかったので最後に記載!!


## まとめ
今回の記事の内容を纏めると下記になる。この内容を元に
効率よくテストしていただけると幸いである。

・効率よくテストする為には、最初にシステムの流れを理解しよう
・CSVテスト時は1ファイルでテストする
・WEB画面のテストはCSVテストで用意したデータを元にテストした方が良い
・運用を想定したテストをするのも忘れずに・・・。