大化通信

大化物流開発合同会社の社員から技術発信をしていきます

成績ランク算出プログラムを設計・製造してみた(プログラム試験設計編)

はじめに

どうも、迷走星人です。 3回目はプログラム試験の設計部分の話を出来たらと思います。 尚、この段階では以下の工程が完了しているものとします。

  • プログラムの設計&レビュー
  • プログラムの実装&レビュー

プログラム試験1

プログラム試験1は、実装した関数単位の試験を行います。 今回は成績ランク算出プログラムで実装した以下の2つの機能が正しく動作するかを確認します。

  • ファイル読み書き機能の動作確認

  • 成績ランク算出機能の動作確認

よって、実装した関数が正常系、異常系の動作を持つ場合はそれら両方を試験する必要があります。 試験漏れを防ぐため、試験方針を設定し、その方針に基づいて試験項目を設計します。 尚、プログラム試験1は関数内部の処理を全て網羅するテストを行うために、「ホワイトボックステスト」と呼ばれる形式を採用します。

試験方針

コーディング作業が完了したら、コーディングが機能詳細仕様に基づいて実装できているかを確認していきます。 プログラム試験1では今回の開発で実装した機能が正しく動作することを確認したいので、以下の確認を試験方針に設定します。

  1. ファイル読み書き機能の動作確認
    • 正常系のパターンでファイルの読込/書込が仕様通りに動作することを確認する。
    • 異常系のパターンでファイルの読込/書込が仕様通りに動作することを確認する。
  2. 成績ランク算出機能の動作確認
    • 正常系のパターンで成績ランク算出が仕様通りに動作することを確認する。
    • 異常系のパターンで成績ランク算出が仕様通りに動作することを確認する。

試験要領

試験方針が決まったら試験要領を考えます。 試験要領では自分が試験を実施する時、どこに着目したかが大事になります。 試験要領を今回実装した機能で下表の通り振り分け、それぞれの要領でどのように確認していくかを整理します。

確認内容 試験要領
ファイルの読み書き機能の動作確認 試験要領1
成績ランク算出機能の動作確認 試験要領2

正常系/異常系それぞれのケースで実装した機能が正しく動作することを確認するために、機能詳細仕様で書いた処理フローを活用します。 機能詳細仕様に書いた処理フロー内の制御(分岐、ループ等)箇所を着目点として洗い出し、洗い出した着目点の組み合わせを考えていきます。

試験要領1(ファイルの読み書き機能の動作確認)

試験項目設計のために、1回目の記事で書いたファイルの読み書き機能の処理フローで着目点になる箇所を確認します。

ファイル読み書き機能処理フロー図ファイル名がNULL?(着目点1)yes動作モードで分岐(着目点2)読込書込結果ファイルを開く行データ取得行データ分割配列にデータ格納(点数)yes分割成功?(着目点6)行データループ(着目点4)noファイルオープン失敗?(着目点3)yes結果ファイルを閉じる結果ファイルを開く配列データ取得結果ファイルにデータ(点数、ランク)書込配列データループ(着目点5)noファイルオープン失敗?(着目点3)yes結果ファイルを閉じる戻り値を返す

フロー図から、ファイル読み書き機能は以下の項目を着目点として考えることが出来ます。

着目点No. 内容 制御パターン
1 ファイル名 分岐
2 動作モード 分岐
3 ファイルオープン 分岐
4 行データループ ループ
5 配列データループ ループ
6 分割結果 分岐

上の表で「制御パターン」が「分岐」に属する着目点の場合、分岐の条件を満たすケース(真; TRUE)と満たさないケース(偽; FALSE)の2パターンが考えられます。 例えば、着目点No.1(項目:ファイル名)の場合、以下の2パターンのケースを確認します。

  • ファイル名がNULLである(分岐条件の内容に対して「真(TRUE)」)
    • 戻り値「COM_FAILED(-1)」を返して処理を終了
  • ファイル名がNULLでない(分岐条件の内容に対して「偽(FALSE)」)
    • 次の処理に移行

また、「制御パターン」が「ループ」に属する着目点の場合は、ループ内のケースとループ外のケースの2パターンが考えられます。 着目点No.4(項目:行データループ)の場合、以下の2パターンのケースを確認します。

  • 行データの末尾に到達していない(ループ条件の内容に対して「真(TRUE)」)
    • ループ内の処理を実施する
  • 行データの末尾に到達した(ループ条件の内容に対して「偽(FALSE)」)
    • ループを抜けて、ループ外の処理に移行

以上の様にそれぞれの着目点について試験で確認するパターンを洗い出し、必要な試験パターンを設計していきます。

試験パターンを設計するために、以下の様な表を用意します。

着目点 試験パターン
⇒パターン内容 [1] [2]
着目点でのロジック
⇒パターン1 ---
⇒パターン2 ---

1列目には実装した機能での着目点の内容及び、その着目点で考えられるパターンを書き出します。 2列目以降は実施する試験がどの着目点のパターンと紐づくかを「〇」で表しています。 この様な表を活用し、必要な試験パターンを見積もっていきます。

着目点 試験パターン
⇒パターン内容 [1] [2] [3] [4] [5] [6] [7] [8]
ファイル名
⇒NULL --- --- --- --- --- --- ---
⇒Not NULL ---
動作モード
⇒読取 --- --- --- ---
⇒書込 --- --- --- --- ---
ファイルオープン
⇒失敗 --- --- --- --- --- ---
⇒成功 --- --- ---
行データループ
⇒ループ終了 --- --- --- --- --- --- ---
⇒ループ継続 --- --- --- --- --- ---
配列データループ
⇒ループ終了 --- --- --- --- --- --- ---
⇒ループ継続 --- --- --- --- --- --- ---
行データ分割
⇒失敗 --- --- --- --- --- --- ---
⇒成功 --- --- --- --- --- --- ---

表の見方ですが、試験パターン1の場合、ファイル名がNullの時点で処理を終了するので、着目点No.1だけが紐づきます。 一方、試験パターン[4]、[5]の場合は全ての着目点が紐づいた試験パターンになります。 上記の表から、ファイルの読み書き機能の場合、8パターンの試験を実施する必要がありそうです。 その内訳は

  • 読み書き共通で1パターン(試験パターン[1])
  • 読取で4パターン(試験パターン[2]~[5])
  • 書込で3パターン(試験パターン[6]~[8])

となります。

必要な試験パターンを見積もれたので、各試験パターンで期待する動作を整理していきます。

試験パターン 着目点No. 期待する動作
1 2 3 4 5 6 戻り値 試験成績の有無
(配列データ)
成績ランクの有無
(結果ファイル)
[1] NULL --- --- --- --- --- COM_FAILED
(失敗)
--- ---
[2] Not NULL 読取 失敗 --- --- --- COM_FAILED
(失敗)
--- ---
[3] Not NULL 読取 成功 ループ
終了
--- --- COM_SUCCESS
(成功)
---
[4] Not NULL 読取 成功 ループ
継続
--- 失敗 COM_SUCCESS
(成功)
---
[5] Not NULL 読取 成功 ループ
継続
--- 成功 COM_SUCCESS
(成功)
---
[6] Not NULL 書込 失敗 --- --- --- COM_FAILED
(失敗)
--- ---
[7] Not NULL 書込 成功 --- ループ
終了
--- COM_SUCCESS
(成功)
---
[8] Not NULL 書込 成功 --- ループ
継続
--- COM_SUCCESS
(成功)
---

各試験パターンの期待する動作から、ファイル読み書き機能の試験パターンは正常系(戻り値が「COM_SUCCESS」)が5パターン、異常系(戻り値が「COM_FAILED」)が3パターンになります。 上記の表からファイルの読み書き機能の試験要領が完成しました。 後はこの試験要領を元に、具体的な値を用いてファイルの読み書き機能の試験項目を設計していきます。

試験要領2(成績ランク算出機能の動作確認)

成績ランク算出機能もファイルの読み書き機能と同様に試験要領を完成させていきます。 まずは、成績ランク算出機能の処理フロー処理フローで着目点になる箇所を確認します。

成績ランク算出機能処理フロー図配列がNULL?(着目点1)yes配列データ(点数)取得データの「型」で分岐(着目点2)整数 or 実数それ以外読み取った点数(着目点3)成績ランク:「A」成績ランク:「B」成績ランク:「C」成績ランク:「D」成績ランク:「E」配列データ格納(ランク:「E」)配列ループ(着目点1で確認するので、この箇所は着目点にならない)戻り値を返す90点以上100点以下 その他75点以上90点未満60点以上75点未満0点以上60点未満

フロー図から、ファイル読み書き機能は以下の項目を着目点として考えることが出来ます。

着目点No. 内容 制御パターン
1 配列 分岐
2 データの「型」 分岐
3 読み取った点数 分岐

成績ランク算出機能の着目点が確認出来たので、必要な試験パターンを見積もっていきます。

着目点 試験パターン
⇒パターン内容 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
配列
⇒NULL(空) --- --- --- --- --- --- --- --- --- --- ---
⇒Not NULL
(空でない)
---
データの「型」
⇒整数 --- --- --- --- --- --- ---
⇒実数 --- --- --- --- --- --- ---
⇒上記以外 --- --- --- --- --- --- --- --- --- --- ---
読み取った点数
⇒90点以上
100点以下
--- --- --- --- --- --- --- --- --- ---
⇒75点以上
90点未満
--- --- --- --- --- --- --- --- --- ---
⇒60点以上
75点未満
--- --- --- --- --- --- --- --- --- ---
⇒0点以上
60点未満
--- --- --- --- --- --- --- --- --- ---
⇒上記以外 --- --- --- --- --- --- --- --- --- ---

上記の表から、成績ランク算出機能の場合、12パターンの試験を実施する必要がありそうです。 その内訳は

  • 配列が空の状態で1パターン(試験パターン[1])
  • 整数値で5パターン(試験パターン[2]~[6])
  • 実数値で5パターン(試験パターン[7]~[11])
  • 整数値、実数値以外で1パターン(試験パターン[12])

となります。

必要な試験パターンを見積もれたので、各試験パターンで期待する動作を整理していきます。

試験パターン 着目点No. 期待する動作
1 2 3 戻り値 成績ランク
[1] NULL --- --- COM_FAILED
(失敗)
---
[2] Not NULL 整数 90点以上
100点以下
COM_SUCCESS
(成功)
A
[3] Not NULL 整数 75点以上
90点未満
COM_SUCCESS
(成功)
B
[4] Not NULL 整数 60点以上
75点未満
COM_SUCCESS
(成功)
C
[5] Not NULL 整数 0点以上
60点未満
COM_SUCCESS
(成功)
D
[6] Not NULL 整数 0~100点の
範囲外
COM_SUCCESS
(成功)
E
[7] Not NULL 実数 90点以上
100点以下
COM_SUCCESS
(成功)
A
[8] Not NULL 実数 75点以上
90点未満
COM_SUCCESS
(成功)
B
[9] Not NULL 実数 60点以上
75点未満
COM_SUCCESS
(成功)
C
[10] Not NULL 実数 0点以上
60点未満
COM_SUCCESS
(成功)
D
[11] Not NULL 実数 0~100点の
範囲外
COM_SUCCESS
(成功)
E
[12] Not NULL その他 --- COM_SUCCESS
(成功)
E

各試験パターンの期待する動作から、成績ランク算出機能の試験パターンは正常系(戻り値が「COM_SUCCESS」)が11パターン、異常系(戻り値が「COM_FAILED」)が1パターンになります。 これで成績ランク算出機能の試験要領も完成しました。 ただし、試験パターン[7]~[11]に関して、今回開発するプログラムは小数点第1位までを有効にした実数値を扱うので、試験項目では小数点第2位の四捨五入を考慮して試験項目を設計します。 また、試験パターン[12]では、半角の「数字列」以外の文字列(全角文字、特殊文字等)を入力データとして試験で動作確認をしていきます。

試験項目

試験要領が完成したら、いよいよ試験項目の設計に入ります。 試験項目では試験要領での着目点に基づいた具体的な値を入力し、試験実施後、期待通りの動作をしているかを整理します。 大抵の現場では試験項目はエクセルドキュメントで設計します。 なので、このプログラムでもエクセルで試験項目を設計していきます。 今回の試験項目は以下のフォーマットで設計します。

ケースNo. 分類 操作方法 テスト確認項目 テスト日 結果
各試験項目に割り振られた試験番号 ・機能名
・正常系/異常系
具体的な実施方法 試験実施時に確認する内容 試験実施日 試験良否結果

試験項目の設計例は以下の様になります。

  • ファイル読み書き機能

    プログラム試験1試験項目設計例(ファイル読み書き機能)

  • 成績ランク算出機能

    プログラム試験1試験項目設計例(成績ランク算出機能)

上記の様に、試験項目では1行毎に確認する内容を1つ書いていきます。 なので、1つの試験項目で複数の確認事項がある時はケースNo.1-3、1-4の様に「テスト項目」の欄は1行毎に書き、分類や操作方法等、一括りに出来るところはセルを結合しています。 また、成績ランク算出機能の試験項目は隣に下図の様な試験パターンのイメージを添えておきます。

プログラム試験1試験イメージ例(成績ランク算出機能)

試験項目の近くに試験パターンのイメージがあると、レビューも進みやすくなります。

プログラム試験2

プログラム試験2では、1回目の記事で書いた以下の要求内容が満たせているかを確認します。

プログラム試験2要求内容確認

この時点でプログラム試験1で実装した機能は機能単体で設計通りに動作することを確認した、という前提になります。 よって、プログラム試験2はプログラム試験1で確認した機能を嚙み合わせた試験を設計していきます。 プログラム試験2はプログラムの内部構造(ここでは関数)には関知せず、入力と出力の対応が正しいことを確認するために、「ブラックボックステスト」と呼ばれる形式を採用します。 プログラム試験2もプログラム試験1と同様、先に試験方針、試験要領を設定してから試験項目を設計していきます。

試験方針

プログラム試験2の試験方針は、1回目の記事で書いた、要求内容を参考に設定します。 ユーザーの要求内容を満たしているかを確認したいので、同じく1回目の記事で書いた、運用フロー図を活用します。

プログラム運用フロー①:結果ファイルをプログラムがあるフォルダに格納する②:プログラムを実行する第1引数:結果ファイル名③:結果ファイルから成績を読み取る④:成績ランクを算出する⑤:プログラムが算出した成績ランクを結果ファイルに追記する⑥:結果ファイルを確認するyes成績ランク追記成功?(着目点4)noyes成績ランク算出成功?(着目点3)noyesファイル読み取り成功?(着目点2)noyesプログラムと結果ファイルは同じ場所に設置?(着目点1)no

運用フロー図から、以下の着目点を洗い出しました。

着目点No. 内容 制御パターン
[1] 結果ファイルの格納場所 分岐
[2] ファイル読み取り結果 分岐
[3] 成績ランク算出結果 分岐
[4] 成績ランク追記結果 分岐

これらの着目点を元に、プログラム試験2の試験方針を以下の通り設定します。

  • 成績ランク算出プログラム動作確認
    • 以下の点に着目して、プログラムが期待通りに動作することを確認する。
      [1] プログラム引数(結果ファイル名)指定有無
      [2] ファイル読み取り結果
      [3] 成績ランク算出結果
      [4] 成績ランク追記結果

試験要領

試験方針が決まったので、この方針に基づいて試験要領を設定します。 上記の着目点の組み合わせて試験を実施した時、プログラムに期待する動作を整理します。

着目点 試験パターン
⇒パターン内容 [1] [2] [3] [4] [5]
結果ファイルの格納場所
⇒プログラムと異なる --- --- --- ---
⇒プログラムと同じ ---
ファイル読み取り結果
⇒失敗 --- --- --- ---
⇒成功 --- ---
成績ランク算出結果
⇒失敗 --- --- --- ---
⇒成功 --- --- ---
成績ランク追記結果
⇒失敗 --- --- --- ---
⇒成功 --- --- --- ---

試験パターンが見積もれたので、各試験パターンで期待する動作を整理していきます。

試験パターン 着目点No. 期待する動作
1 2 3 4 標準出力 結果ファイル
[1] --- --- --- ファイルがプログラムと
同じ場所にありません。
---
[2] 失敗 --- --- ファイル読込に失敗しました。 成績ランク追記無
[3] 成功 失敗 --- 成績ランク算出に失敗しました。 成績ランク追記無
[4] 成功 成功 失敗 ファイル書込みに失敗しました。 成績ランク追記無
[5] 成功 成功 成功 大化技術通信用プログラム終了 成績ランク追記有

試験項目

試験要領が完成したら、次は試験項目の設計に入ります。 プログラム試験1の時と同じく、試験要領での着目点に基づいた具体的な値を入力します。 試験実施後、プログラムの出力結果が期待通りの出力になっているかを整理します。 プログラム試験2の試験項目は以下のフォーマットで設計します。

ケースNo. シナリオ 試験の流れ 期待される出力結果 テスト日 結果
各試験項目に割り振られた試験番号 試験で確認したいプログラムの運用フロー 試験手順 試験実施後に確認する内容 試験実施日 試験良否結果
  • 「シナリオ」には各試験パターンに紐づく着目点の組み合わせを書いていきます。
  • 「試験の流れ」には実際の運用を想定した、プログラムの運用手順を書いていきます。
  • 「期待される出力結果」には試験要領でまとめた、期待される標準出力と結果ファイルの内容を書いていきます。

試験項目の設計例は以下の様になります。

プログラム試験2試験項目設計例

プログラム試験1でもそうでしたが、試験項目中の文言の表記は試験仕様書内で統一するようにします。 一つの仕様書内で同じものを別々に言い表している時、レビューアーは混乱し、レビューに時間が掛かる要因になります。 また、時間を置いて後で見返す時、自分で書いたにも関わらず、自分自身でも分からなくなる時があります。 それらを避けるためにも、試験仕様書中の文言の表記には注意する必要があります。

レビュー

試験項目が設計出来たら、ソースコードと同じくレビューアーにレビューしてもらいます。 レビューで指摘事項があれば、それを試験項目に反映し、再度レビューしてもらいます。 この作業をレビューアーからフォローが貰えるまで繰り返します。

次回予告

ここまでプログラム試験設計について発表しました。
次回は以下のタイトルで続きを発表して行こうと思います。

  • 成績ランク算出プログラムを設計・製造してみた(プログラム試験実践編)