*

単体テストの効率化を考える(2)-スタブの戻り値

公開日: : 最終更新日:2020/05/10 徒然, 開発

どもです。

「単体テストの効率化について考える」の2回目です。
(1回目はコチラ:単体テストの効率化を考える(1)-はじめに)

1.振り返り

前回のエントリでは、

  • 単体テストの効率化は、環境構築を効率化することで進めることができる!
  • 環境構築の効率化は、スタブの自動生成から!

という結論になりました。
そして、そのために、

  • スタブで行うべき処理について考える必要がある

となりました。
今回は、この「スタブで行うべき処理」について考えます。

2.スタブとは?

スタブとは

  • 特定のコンポーネント(仮にAと呼ぶ)をテストするため、Aに呼び出される(特定目的のための最小限度の)コンポーネント。

と定義されています。
(出典:ISTQB ソフトウェアテスト標準用語集)
これでは、スタブで行わなければならない具体的な処理を決定できません。
やっぱり自分で考える必要があります。

3.関数のパターン

3.1.最も基本的な関数

まず、「最も基本的な関数」について考えます。
「一番基本的な関数」は、「戻り値なし」/「引数なし」の関数であると、私は考えています。
即ち、以下のような関数です。

この関数のスタブは、どのようになるか考えます。

しかし、これでは実際にこのスタブが呼び出されたのか、さらに言えば「この関数を呼び出すパスを通過したのか」が判断できません。
具体例を挙げると、下記のような関数の単体テストを行う場合です。

この関数では、argの値でFuncNoReturnNoArg()が呼ばれる/呼ばれないが異なります。
しかし、関数SampleFuncCaller()関数からの戻り値は変わりません。
そのため、戻り値を確認しても、FuncNoReturnNoArg()が呼ばれたか否かを判断できません。
この問題を解決するためには、「呼び出し回数をカウントする」ようにするのがよいと考えます。
即ち、以下のように実装します。

「この関数を呼び出すパスを通過したのか」は、カバレッジの測定の際に有用な情報になります。
そのため、この「呼び出し回数のカウント」は戻り値や引数の有無に関わらず保持することがよいかと考えます。

3.2.関数の分類

「最も基本的な関数」として、「戻り値なし」/「引数なし」という関数を挙げました。
そこで、「戻り値」と「引数」に着目して関数を分類して、それぞれの分類ごとにスタブで行うべき処理を考えてみます。

3.3.「戻り値」に着目した分類

関数の戻り値については、基本的に「あり」と「なし」の2つだけです。

3.3.1.「戻り値なし」の場合

「戻り値なし」の場合は、先の「一番基本的な関数」と同様の実装になります。

3.3.2.「戻り値あり」の場合

戻り値を持つ関数については、何か値を返さなければなりません。
この時、「固定値を返す」のか「設定された値を返す」のかで議論が分かれるかと思います。

3.3.2.1.固定値を返す

固定値を返す場合のスタブの実装例を、下記に示します。

スタブの実装は大変シンプルです。
しかし、戻り値によって呼び出し元の関数(テスト対象の関数)の処理が変化する場合には、これでは不十分です。

対応として、「戻り値ごとに異なるスタブを実装する」という方法が考えられます。
しかし、それでは実装量が増大してしまいます。
即ち、テスト対象関数において判定値が追加される度にスタブを新規に追加しなければなりません。
「スタブを自動で作成する」ので、実装の手間は増えませんが(増えないようにしますが)、作成された関数の管理が必要になります。
例えば、「1」と「-1」を返すスタブを実装する場合は、それぞれ

となります。
このような実装にした場合、テストケースごとに適用されるスタブを切り替えるための仕組みが必要になります。
またこの仕組みのメンテナンスも必要になります。
即ち、「固定値を返す」ようなスタブを作成する場合、「戻り値ごとに作成されたスタブ」と「テストケースごとに関数を切り替える仕組み」を管理する必要があります。
管理しなければならないモノが増えるのは、あまりよろしくないです。

3.3.2.2.設定された値を返す

設定された値を返す場合の実装例を、下記に示します。

この実装であれば、戻り値によってテスト対象の関数の処理が変化するとしても、戻り値ごとに関数を追加する必要はありません。
固定値を返す場合に比べて、管理しなければならない項目が少なくなります。
しかし、この方法では「スタブが複数回呼び出された場合」が問題になります。
即ち、「実行される度に異なる値を返す」という場合です。
これには、「スタブが返す値を配列で持たせる」という方法で対応ができます。
実装例としては、下記になります。

4.続く!!

またまた長くなってきたので、今回のエントリはこの辺にしておきます。

今回のエントリでは、自動生成するスタブで行うべき処理について考えました。
結論ですが、

  • スタブでは、呼び出し回数をカウントする。
  • 戻り値がある関数のスタブは、返す値を設定しておくバッファを配列で用意しておく。
  • 戻り値がある関数のスタブは、呼び出される度に配列から値を取得し、それを返す。

とするのがよいかと思います。

次回は、スタブの引数について書きます。

ではっ!

続きはコチラ

単体テストの効率化を考える(3)-スタブの引数
単体テストの効率化を考える(4)-スタブの引数(ダブルポインタ)
単体テストの効率化を考える(5)-スタブの自動生成への入力
単体テストの効率化を考える(6)-スタブの自動生成ツール

関連記事

google_test

C言語でEV3開発(6)

どもです。 今回のエントリーは、前回のエントリーの続き、google testでの単体テスト環境に

記事を読む

no image

QtでRaspberryPi/GUI開発(3):ためしに時計を作ってみた(其の参)-StyleSheetの適用

どもです。 前回のエントリーでは、グループ化されたボタンに対するイベントハンドラについて書きました

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(1)-C#のユーザーコントロール開発

どもです。 突然ですが、今回はC#に関するエントリになります。 具体的には、C#/WPFで、独自

記事を読む

toppers

C言語でEV3開発(25)-Q_Learningを実装してみた…が!?

どもです。 今回の内容は、「失敗しました」という内容です。 最近、流行になっている深層学習/

記事を読む

EF_GRY-OR_png

Eclipseで単体テストするときの注意点(?)

どもです。 今回のエントリは、Eclipse/cygwinで単体テストを行う際にハマってしまっ

記事を読む

think_about_utest

単体テストの効率化を考える(3)-スタブの引数

どもです。 「単体テストの効率化について考える」の3回目です。 1回目、2回目はコチラ:

記事を読む

c_sharp_eye_catch

Windowsでのカバレッジ測定-OpenCoverageを使ってみた

どもです。 以前、OpenCppCoverageを使用してWindows上でカバレッジ測定する方法

記事を読む

RasPi_Qt

Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。(さらにその後)

どもです。 前回の投稿から、かなり時間が空いてしまいましたが、今回は前回の続きとして、「QtC

記事を読む

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

eclipse_cdt_top_100

C言語でEV3開発(3)

どもです。 今回のエントリーの内容は、前回まででセットアップした環境で、実際にEV3上で動く実行フ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

c_sharp_eye_catch
セルに「取り消し線」が設定されているかを判定してみた

どもです。 前回、前々回と、エクセルのセル内の文字列から、「取り

c_sharp_eye_catch
セル内の「取り消し線で消された文字列」の削除を簡単にしてみた

どもです。 前回、C#/OpenXmlを用いて、エクセルのセル内

c_sharp_eye_catch
セル内の「取り消し線で消された文字列」を削除してみた

どもです。 今回は、C#/OpenXmlの組み合わせで、エクセル

c_sharp_eye_catch
C#でバッファの内容を表示する処理を実装してみた-
データ型に従って動的に書式を設定する

どもです。 最近、C#でバッファ/配列の値をコンソールに表示した

arduino_relay_switch_003_self_preservation_circuit_eye_catch
Arduinoでリレースイッチ(3)-自己保存回路

どもです。 前回の記事で、リレースイッチ「AE-G5V-DRV」

→もっと見る

PAGE TOP ↑