第4回 「詳細設計書を見る人」にとっての「良い詳細設計」 CASE2(呼び出し関数) 後編

「詳細設計書」はフォーマットではなくどういう情報を載せているかが重要で、詳細設計書を見る人(コーディング者とテスト設計実施者)が質問をするようではダメだというところから、前回は「引数」に着目して「詳細設計書を見る人」にとっての「良い詳細設計」を検討しました。 今回も「詳細設計書を見る人」にとっての「良い詳細設計」を具体的に検討の第3回目です。 「詳細設計書を見る人」でも特に単体テスト設計実施者の側から「呼び出し関数」に着目して検討しています。 前編では呼び出し関数の機能を自関数の機能に含めてはならないと結論づけました。 後編では同じサンプル詳細設計書で呼び出し関数の情報をどこまで記載すべきかについて検討をしていきます。

今日のサンプル

一般的に良くありがちな詳細設計書(関数仕様)のサンプルとして以下を題材にしました。 なお、前編で検討した仕様説明については内容を反映してあります。

<サンプル詳細設計書(関数仕様)>
書式unsigned char chk_date(unsigned short year, unsigned char month, unsigned char day)
仕様説明引数に指定された年月日の範囲チェックを行い、範囲内の場合はchk_date_com関数で年月日が存在するかチェックする。 引数が範囲外の場合はFALSE、chk_date_com関数が正当で戻ってきたらTRUE、不当で戻ってきたらFALSEで関数を終了する。
引数 unsigned short year [入力]
意味チェックしたい年
許容範囲1~2100
 unsigned char month [入力]
意味チェックしたい月
許容範囲1~12
 unsigned char day [入力]
意味チェックしたい日
許容範囲1~31
戻り値正常TRUE(1) :年月日が正当
異常FALSE(0):年月日が不当
備考


しかし、関数の仕様説明を修正しただけでよいのでしょうか。 今回も『呼び出し関数』について検討していきます。

品質が良いと言うためにはどれだけやればいいか

呼び出し関数に着目した場合、どのような情報が詳細設計書に必要でしょうか。 呼び出し関数に関するどれだけの値をテストしたら品質がいいといえるでしょうか。 私たちは次の2つに注目しました。

  • 呼び出し関数に正しい情報を与えているか
  • 呼び出し関数から得られる情報をどう処理しているか

以降でこの2つについて説明します。

呼び出し関数に与える情報はOUTPUTになる

自分に責務が無い処理を他の関数に任せる場合、その処理を依頼するために使用するデータを与えるはずです。 呼び出し関数の引数に「与える値」です。 呼び出し関数の引数は外部へ影響を与えるものと考えられるので「OUTPUT」とみなすことにしました。

004-1

たとえばchk_date関数の場合、chk_date_com関数の呼び出しは引数チェック後、範囲内と確認された引数の値をそのまま使って呼び出されます。 chk_date関数からchk_date_com関数へOUTPUTされる値は引数チェックの範囲内の値のみであるため、そのことが関数のOUTPUTとしてわかるように記載しておきます。

呼び出し関数から得られる情報はテスト対象関数へのINPUTになる

自関数に責務が無い処理は、他関数を呼んで処理をさせます。 自分に責務が無い処理を他の関数に処理させる場合、結果を得たいことが多いです。 結果を得るということは、その結果をもとに何かをします。 結果を無視することもあります。 とにかく結果に対して何らかの判定が仕様としてあるはずです。 仕様網羅をテストする観点でよいテスト設計としては、呼び出し関数から得られる情報をテスト対象関数へのINPUTとして考える必要があります。 つまり、詳細設計書に呼び出し関数の処理結果に対する対応を掲載しておく必要があります。

004-2

たとえばchk_date関数であれば、呼び出される関数chk_date_com関数の戻り値に対する処理は詳細設計に書かれている必要があります。 chk_date_com関数の戻り値はTRUE(1) / FALSE(0) があります。 それぞれ次のように処理を決めます。 TRUE(1) :年月日を表示して正常で関数を終了する FALSE(0):以降処理を行わず異常で関数を終了する

どのようなテストが出来るか

呼び出し関数の処理結果をINPUT、呼び出し関数に与える値はOUTPUTとして扱い、関数仕様に記載することとしました。 前編で修正した仕様説明と合わせて、どのようなテストが出来るようになるでしょうか。 chk_date関数を例に見ていきます。

004-3

<正しいタイミングで関数を呼んでいるか> 引数に指定された年月日の範囲チェックを行ったあと、範囲内の場合はchk_date_com関数で年月日が存在するか判定します。

004-4

次の観点で呼び出しタイミングが確認できます。

  • 引数に指定された年月日のいずれかが範囲外の場合にchk_date_com関数が呼ばれない
  • 引数に指定された年月日が全て範囲内の場合にchk_date_com関数が呼ばれる

<正しい引数で関数を呼んでいるか> 引数に指定された年月日が正当かを判定してもらうために、範囲チェックを終えたyear、month、dayを変更することなくchk_date_com関数に渡します。

004-5

次の観点で呼び出し関数の引数が正しいか確認できます。

・引数に指定された年月日が全て範囲内の場合に引数の値が変化することなくchk_date_com関数に与えられる <結果を正しく処理しているか> 引数に指定された年月日が正当かをchk_date_com関数に判定してもらったらその結果を戻り値で受け取ります。

004-6

受け取った値をINPUTとしてchk_date関数の戻り値が変化するかで確認出来ます。

・引数に指定された年月日が全て範囲内の場合(年月日の組み合わせが実際に存在するかは関係無く)にchk_date関数の戻り値がFALSEならFALSEで終了、TRUEならTRUEで終了する 関数仕様が「機能仕様」で書かれていた場合から比べても格段に意味のある単体テスト項目が立てられるようになります。

情報を追加してみると

上記の情報を追加してみると次の詳細設計になりました。

<サンプル詳細設計書(関数仕様)~情報追加後~>
書式unsigned char chk_date(unsigned short year, unsigned char month, unsigned char day)
仕様説明引数に指定された年月日の範囲チェックを行い、範囲内の場合はchk_date_com関数で年月日が存在するかチェックする 引数が範囲外の場合はFALSE、chk_date_com関数が正当で戻ってきたらTRUE、不当で戻ってきたらFALSEで関数を終了する。
引数 unsigned short year [入力]
意味チェックしたい年
許容範囲1~2100
 unsigned char month [入力]
意味チェックしたい月
許容範囲1~12
 unsigned char day [入力]
意味チェックしたい日
許容範囲1~31
戻り値正常TRUE(1) :年月日が正当
異常FALSE(0):年月日が不当
呼び出し関数条件unsigned char chk_date_com(unsigned short year, unsigned char month, unsigned char day)
対象関数の第1引数を引数チェック後(1~2100)そのまま使用
対象関数の第2引数を引数チェック後(1~12)そのまま使用
対象関数の第3引数を引数チェック後(1~31)そのまま使用
 戻り値の扱いTRUE(1) :年月日を表示して正常で関数を終了する
FALSE(0):以降処理を行わず異常で関数を終了する
備考


コーディング者としても関数の処理範囲が明確になります。 ただし、このように関数仕様に他の関数の関数仕様を足す方法は、複数個所で同じ内容を書くということなので保守が大変になります。 プロジェクトによっては、呼び出し関数の情報を付け足していくのではなく、呼び出し関数の仕様へのリンクで表現することもあります。 リンクを書くことで同じ情報を複数個所で書くことをさけ、保守をしやすくしています。

 
書式unsigned char chk_date(unsigned short year, unsigned char month, unsigned char day)
仕様説明引数に指定された年月日の範囲チェックを行い、範囲内の場合はchk_date_com関数で年月日が存在するかチェックする 引数が範囲外の場合はFALSE、chk_date_com関数が正当で戻ってきたらTRUE、不当で戻ってきたらFALSEで関数を終了する。
引数 unsigned short year [入力]
意味チェックしたい年
許容範囲1~2100
 unsigned char month [入力]
意味チェックしたい月
許容範囲1~12
 unsigned char day [入力]
意味チェックしたい日
許容範囲1~31
戻り値正常TRUE(1) :年月日が正当
異常FALSE(0):年月日が不当
呼び出し関数unsigned char chk_date_com(unsigned short year, unsigned char month, unsigned char day)
備考

 

今日の結論

  • 単体テストでテスト項目を作成するために「詳細設計書」を考えると情報が足りないことがある
  • 詳細設計書の関数設計では次の情報が必要 - 呼び出し関数について - どのような情報を与えるのか - どのような情報を受け取るのか - 受け取った情報をどう処理するのか

 

お問い合わせ

名古屋本社

東京本社

【受付時間】9:00~18:00

pagetop