「単体テストのUI部分のテスト項目と結合テストのテスト項目が一緒になっちゃうんですけど・・」
とかいう話を聞くが、「なぜ一緒になるのか」とか、「どこに違いがあるのか」については、
学校でも、職場でも教えてもらえないような気がする。
ので、単体テスト項目と、結合テスト項目を書いて説明してみる。
そうすると、これは、「テスト項目合成の話」ということが分かると思う。
■お題
・以下のWebシステムの単体・結合テスト項目を考える
画面Aは、表示後、項目a,bを入力し、ボタンAをクリックすると、
サーバーのサービス1とサービス2にアクセスし、
サービス1,2が正常終了すると、画面Bを表示する
サービス1,2ともに正常終了しないと、エラーメッセージを表示する
サービス1は、DB1を検索し、項目a,bのレコードが存在すればOK、ない・異常時 エラー
サービス2は、DB2に項目a,b,現在時刻cをキーとするレコードを生成できればOK、異常時 エラー
(例:画面A:ログイン画面、a=ユーザー名、b=パスワード、ボタンA=ログイン、
画面B:メニュー、サービス1:ログインチェック、サービス2:ログイン初期化
DB1=ユーザーテーブル DB2=セッションテーブル)
■単体テスト【C0,C1,100%】
・画面のポイント
画面Aの単体テスト
画面Aがa,bからで表示されるときを平常状態、
イベントが上がったら、(平常状態からの)分岐と考える。
各項目の入力チェックは、
チェック自体は別関数をつかわず(C0項目にはならない)
結果はOK,NGのみ→C1項目
ボタンAクリック後、
入力チェック
サービス1実行
サービス2実行
となる(C1)。各ステップで、OK、NGの2種類がある。
・サーバー側(サービス)について
マイクロサービス化されていて、
サービス1、2とも、正常、異常の分岐しかないとする→C1項目
「テストでのC0、C1、C2に対応した仕様書の書き方」って、学校で教えないよね
https://blog.goo.ne.jp/xmldtp/e/55d32a4a623e92481567a9b477521556
に書いた感じで、合成した状態で書いてみる
テスト項目1
テスト観点:画面A表示(C0 & C1正常)
テスト条件:特になし(初期状態)
テスト内容:画面Aが表示されている
テスト項目2
テスト観点:画面A 項目a入力(フォーカス喪失イベント) :正常(C1)
テスト条件:画面A表示
テスト内容:項目aに適切な値を入力、タブを入力
テスト項目3
テスト観点:画面A 項目a入力(フォーカス喪失イベント) :異常(C1)
テスト条件:画面A表示
テスト内容:項目aになにも入力しないで、タブを入力
→項目aの字種チェック(不適切な値入力)等は、ここにテスト項目が追加されるが、今回はその話題
ではないので省略
テスト項目4
テスト観点:画面A 項目b入力(フォーカス喪失イベント) :正常(C1)
テスト条件:画面A表示
テスト内容:項目bに適切な値を入力、タブを入力
テスト項目5
テスト観点:画面A 項目b入力(フォーカス喪失イベント) :異常系(C1)
テスト条件:画面A表示
テスト内容:項目bになにも入力しないで、タブを入力
→項目bの字種チェック(不適切な値入力)等は、ここにテスト項目が追加されるが、今回はその話題
ではないので省略
テスト項目7
テスト観点:画面A ボタンA(クリックイベント)(c0) &入力チェック正常(C1)
テスト条件:画面A表示、項目a,bに適切な値を入力
テスト内容:ボタンAをクリックして、入力チェックを行う
予測結果:サービス1を呼び出す(ログ確認)
※ここは合成したけど、合成しないほうがふつうかなあ~
テスト項目8
テスト観点:画面A ボタンA(クリックイベント) :入力チェック異常(C1)
テスト条件:画面A表示、項目a,bに「不適切」な値を入力(または入力しない)
テスト内容:ボタンAをクリックして、入力チェックを行う
予測結果:エラー表示
テスト項目9
テスト観点:画面A ボタンA(クリックイベント):サービス1正常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力し、ボタンAをクリックして、入力チェック正常で通過
(スタブ利用する場合、サービス1に正常値がかえるように設定)
テスト内容:サービス1を呼び出す
予測結果:サービス2を呼び出す(ログ確認)
テスト項目10
テスト観点:画面A ボタンA(クリックイベント):サービス1異常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力し、ボタンAをクリックして、入力チェック正常で通過
(スタブ利用する場合、サービス1に異常値がかえるように設定)
テスト内容:サービス1を呼び出す
予測結果:エラー表示
テスト項目11
テスト観点:画面A ボタンA(クリックイベント):サービス2正常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力、ボタンAクリック、入力チェック・サービス1正常で通過
(スタブ利用する場合、サービス2に正常値がかえるように設定)
テスト内容:サービス2を呼び出す
予測結果:画面B表示
テスト項目12
テスト観点:画面A ボタンA(クリックイベント):サービス2異常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力、ボタンAクリック、入力チェック・サービス1正常で通過
(スタブ利用する場合、サービス2に異常値がかえるように設定)
テスト内容:サービス2を呼び出す
予測結果:エラー表示
※画面Bの話は、今回は関係ないので省略
サービス1の単体項目は、101から採番することにします。
テスト項目101
テスト観点:正常(C1)
テスト条件:特になし
テスト内容:適切なパラメータを設定して、サービス1を実行する
予測結果:正常値を返す
テスト項目102
テスト観点:異常(C1)
テスト条件:特になし
テスト内容:不適切なパラメータを設定して、サービス1を実行する
予測結果:異常値を返す
→実際には異常値には、DBエラーとか、該当件数0件のときとかいろいろあるけど、今回は、
話を簡単にするため省略(「お題」で、そういう単純ケースを設定した)
サービス2の単体項目は、201から採番することにします。
テスト項目201
テスト観点:正常(C1)
テスト条件:特になし
テスト内容:適切なパラメータを設定して、サービス2を実行する
予測結果:正常値を返す。DB2が更新される
テスト項目202
テスト観点:異常(C1)
テスト条件:特になし
テスト内容:不適切なパラメータを設定して、サービス2を実行する
予測結果:異常値を返す
→実際には異常値には、DBエラーとか、該当件数0件のときとかいろいろあるけど、今回は、
話を簡単にするため省略(「お題」で、そういう単純ケースを設定した)
■結合テストの合成について
画面から行うものとする。
そうすると、テスト項目7「ボタンAをクリックして、入力チェックを行う」は、その後
テスト項目9→テスト項目101→テスト項目11→テスト項目201
と進むので、結合テストでは、テスト項目7が
テスト項目7
テスト観点:画面A ボタンA(クリックイベント)(c0)
テスト条件:画面A表示、項目a,bに適切な値を入力
テスト内容:ボタンAをクリック
予測結果:画面Bを表示、DB2が更新される
(ログで、サービス1、2が起動されていることを確認する場合も多い)
となる。そして、テスト項目9、テスト項目101、テスト項目11、テスト項目201は、
結合テストでは書かれない(結合してしまった場合、これらを単体では調べられないため)
→消すというのは原則:残る場合もある。それについては、別にまた今度かく
■単体テストのUI部分のテスト項目と結合テストのテスト項目が一緒になる場合/違う箇所
このように、画面から操作して結合テストを行う場合、
・クリックするというテストの操作までは単体と結合で、項目は一緒になる。
・しかし、その後、サーバーアクセスを行って何か処理をする場合、
テストの操作に対する項目の予測結果は、DB更新など、サーバ処理結果が追加される
・画面から操作し、エラー表示など、画面で完結してしまう場合は、
テストの操作に対する項目の予測結果まで一致する(単体とまったく同じ項目になる)
→テスト項目自体が省略可能となる。
ここで、異常系の合成は、実は問題が起こる。それが「実行不能」問題になるんだけど、
話が長くなるので、また別の機会で・・
また、「結合テストの合成」のところでも、別の機械で・・と書いたので、気が向いたら、その辺をいつかかく。
P.S むかし、こんなの書いてたのでメモ
単体テスト、結合テスト、総合テストの違い
https://blog.goo.ne.jp/xmldtp/e/109e2e397ff8484af0b8ab1a5c1d040e
とかいう話を聞くが、「なぜ一緒になるのか」とか、「どこに違いがあるのか」については、
学校でも、職場でも教えてもらえないような気がする。
ので、単体テスト項目と、結合テスト項目を書いて説明してみる。
そうすると、これは、「テスト項目合成の話」ということが分かると思う。
■お題
・以下のWebシステムの単体・結合テスト項目を考える
画面Aは、表示後、項目a,bを入力し、ボタンAをクリックすると、
サーバーのサービス1とサービス2にアクセスし、
サービス1,2が正常終了すると、画面Bを表示する
サービス1,2ともに正常終了しないと、エラーメッセージを表示する
サービス1は、DB1を検索し、項目a,bのレコードが存在すればOK、ない・異常時 エラー
サービス2は、DB2に項目a,b,現在時刻cをキーとするレコードを生成できればOK、異常時 エラー
(例:画面A:ログイン画面、a=ユーザー名、b=パスワード、ボタンA=ログイン、
画面B:メニュー、サービス1:ログインチェック、サービス2:ログイン初期化
DB1=ユーザーテーブル DB2=セッションテーブル)
■単体テスト【C0,C1,100%】
・画面のポイント
画面Aの単体テスト
画面Aがa,bからで表示されるときを平常状態、
イベントが上がったら、(平常状態からの)分岐と考える。
各項目の入力チェックは、
チェック自体は別関数をつかわず(C0項目にはならない)
結果はOK,NGのみ→C1項目
ボタンAクリック後、
入力チェック
サービス1実行
サービス2実行
となる(C1)。各ステップで、OK、NGの2種類がある。
・サーバー側(サービス)について
マイクロサービス化されていて、
サービス1、2とも、正常、異常の分岐しかないとする→C1項目
「テストでのC0、C1、C2に対応した仕様書の書き方」って、学校で教えないよね
https://blog.goo.ne.jp/xmldtp/e/55d32a4a623e92481567a9b477521556
に書いた感じで、合成した状態で書いてみる
テスト項目1
テスト観点:画面A表示(C0 & C1正常)
テスト条件:特になし(初期状態)
テスト内容:画面Aが表示されている
テスト項目2
テスト観点:画面A 項目a入力(フォーカス喪失イベント) :正常(C1)
テスト条件:画面A表示
テスト内容:項目aに適切な値を入力、タブを入力
テスト項目3
テスト観点:画面A 項目a入力(フォーカス喪失イベント) :異常(C1)
テスト条件:画面A表示
テスト内容:項目aになにも入力しないで、タブを入力
→項目aの字種チェック(不適切な値入力)等は、ここにテスト項目が追加されるが、今回はその話題
ではないので省略
テスト項目4
テスト観点:画面A 項目b入力(フォーカス喪失イベント) :正常(C1)
テスト条件:画面A表示
テスト内容:項目bに適切な値を入力、タブを入力
テスト項目5
テスト観点:画面A 項目b入力(フォーカス喪失イベント) :異常系(C1)
テスト条件:画面A表示
テスト内容:項目bになにも入力しないで、タブを入力
→項目bの字種チェック(不適切な値入力)等は、ここにテスト項目が追加されるが、今回はその話題
ではないので省略
テスト項目7
テスト観点:画面A ボタンA(クリックイベント)(c0) &入力チェック正常(C1)
テスト条件:画面A表示、項目a,bに適切な値を入力
テスト内容:ボタンAをクリックして、入力チェックを行う
予測結果:サービス1を呼び出す(ログ確認)
※ここは合成したけど、合成しないほうがふつうかなあ~
テスト項目8
テスト観点:画面A ボタンA(クリックイベント) :入力チェック異常(C1)
テスト条件:画面A表示、項目a,bに「不適切」な値を入力(または入力しない)
テスト内容:ボタンAをクリックして、入力チェックを行う
予測結果:エラー表示
テスト項目9
テスト観点:画面A ボタンA(クリックイベント):サービス1正常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力し、ボタンAをクリックして、入力チェック正常で通過
(スタブ利用する場合、サービス1に正常値がかえるように設定)
テスト内容:サービス1を呼び出す
予測結果:サービス2を呼び出す(ログ確認)
テスト項目10
テスト観点:画面A ボタンA(クリックイベント):サービス1異常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力し、ボタンAをクリックして、入力チェック正常で通過
(スタブ利用する場合、サービス1に異常値がかえるように設定)
テスト内容:サービス1を呼び出す
予測結果:エラー表示
テスト項目11
テスト観点:画面A ボタンA(クリックイベント):サービス2正常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力、ボタンAクリック、入力チェック・サービス1正常で通過
(スタブ利用する場合、サービス2に正常値がかえるように設定)
テスト内容:サービス2を呼び出す
予測結果:画面B表示
テスト項目12
テスト観点:画面A ボタンA(クリックイベント):サービス2異常(C1)
テスト条件:画面A表示項目a,bに適切な値を入力、ボタンAクリック、入力チェック・サービス1正常で通過
(スタブ利用する場合、サービス2に異常値がかえるように設定)
テスト内容:サービス2を呼び出す
予測結果:エラー表示
※画面Bの話は、今回は関係ないので省略
サービス1の単体項目は、101から採番することにします。
テスト項目101
テスト観点:正常(C1)
テスト条件:特になし
テスト内容:適切なパラメータを設定して、サービス1を実行する
予測結果:正常値を返す
テスト項目102
テスト観点:異常(C1)
テスト条件:特になし
テスト内容:不適切なパラメータを設定して、サービス1を実行する
予測結果:異常値を返す
→実際には異常値には、DBエラーとか、該当件数0件のときとかいろいろあるけど、今回は、
話を簡単にするため省略(「お題」で、そういう単純ケースを設定した)
サービス2の単体項目は、201から採番することにします。
テスト項目201
テスト観点:正常(C1)
テスト条件:特になし
テスト内容:適切なパラメータを設定して、サービス2を実行する
予測結果:正常値を返す。DB2が更新される
テスト項目202
テスト観点:異常(C1)
テスト条件:特になし
テスト内容:不適切なパラメータを設定して、サービス2を実行する
予測結果:異常値を返す
→実際には異常値には、DBエラーとか、該当件数0件のときとかいろいろあるけど、今回は、
話を簡単にするため省略(「お題」で、そういう単純ケースを設定した)
■結合テストの合成について
画面から行うものとする。
そうすると、テスト項目7「ボタンAをクリックして、入力チェックを行う」は、その後
テスト項目9→テスト項目101→テスト項目11→テスト項目201
と進むので、結合テストでは、テスト項目7が
テスト項目7
テスト観点:画面A ボタンA(クリックイベント)(c0)
テスト条件:画面A表示、項目a,bに適切な値を入力
テスト内容:ボタンAをクリック
予測結果:画面Bを表示、DB2が更新される
(ログで、サービス1、2が起動されていることを確認する場合も多い)
となる。そして、テスト項目9、テスト項目101、テスト項目11、テスト項目201は、
結合テストでは書かれない(結合してしまった場合、これらを単体では調べられないため)
→消すというのは原則:残る場合もある。それについては、別にまた今度かく
■単体テストのUI部分のテスト項目と結合テストのテスト項目が一緒になる場合/違う箇所
このように、画面から操作して結合テストを行う場合、
・クリックするというテストの操作までは単体と結合で、項目は一緒になる。
・しかし、その後、サーバーアクセスを行って何か処理をする場合、
テストの操作に対する項目の予測結果は、DB更新など、サーバ処理結果が追加される
・画面から操作し、エラー表示など、画面で完結してしまう場合は、
テストの操作に対する項目の予測結果まで一致する(単体とまったく同じ項目になる)
→テスト項目自体が省略可能となる。
ここで、異常系の合成は、実は問題が起こる。それが「実行不能」問題になるんだけど、
話が長くなるので、また別の機会で・・
また、「結合テストの合成」のところでも、別の機械で・・と書いたので、気が向いたら、その辺をいつかかく。
P.S むかし、こんなの書いてたのでメモ
単体テスト、結合テスト、総合テストの違い
https://blog.goo.ne.jp/xmldtp/e/109e2e397ff8484af0b8ab1a5c1d040e