*

単体テストの効率化を考える(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)-スタブの自動生成ツール

関連記事

no image

Windows/EclipseでRaspberryPiのクロス環境を構築してみた

どもです。 今回は、Windows/EclipseでRaspberry Piのクロス環境を構築した

記事を読む

c_sharp_eye_catch

外部からMariaDbにアクセスする(1)-データベースの設定

どもです。 今回は、Linux上のMariaDbにWindowsからアクセスしてデータを取得で

記事を読む

eclipse_4.3_kepler

eclipse/CDTにおけるgdbでのデバッグ中に発生するpythonのエラー

どもです。 今回のエントリーは、Eclipse上でのデバッグの際に「pythonのエンコードエラー

記事を読む

raspberry-pi

RaspberryPi3を購入しました

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

記事を読む

MY_MFC_LOGO

MFCプログラミング(1):CFileまたはCStdioFileクラスを使用してファイル出力

どもです。 突然ですが、仕事でMFCを使用することになりました。 MFCはこれまで触ったことがな

記事を読む

RasPi_Qt

QtでRaspberryPi/GUI開発(5):pigpioを使ってみた

どもです。 RaspberryPiを購入して、LEDも手に入れたのでコレをチカらせてみようと思いま

記事を読む

OpenCvLogo

OpenCvによる画像サイズ変更

どもです。 最近、カメラの動画をOpenCvで加工する、ということに挑戦し始めました。 しか

記事を読む

DIY_eye_catch

自宅で電子工作(2)-ラズパイのSPIコネクタ自作

どもです。 今回は、電子工作です。 1.何を作った 今回紹介(?)するのは、Raspber

記事を読む

eclipse-juno-logo

C言語でEV3開発(2)

どもです。 今回のエントリーの内容は、前回に引き続き「EV3の開発環境の構築」の追記です。

記事を読む

no image

C言語でEV3開発(15)-TOPPERS/HRP2 EV3 で PID制御

どもです。 今回のエントリーは、コレまでのエントリーから内容を変えて、モーターの動作の制御をします

記事を読む

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="">

arduino_relay_switch_002_ae_g5v_drv_eye_catch
Arduinoでリレースイッチ(2)-AE-G5V-DRV

どもです。 前回の記事では、「フォトカプラリレー」を使用したLチ

tlp222af_001_eye_catch
Arduinoでリレースイッチ(1)-TLP222AF

どもです。 つい先日、やっとのことでリレースイッチを手に入れるこ

c_sharp_eye_catch
外部からMariaDbにアクセスする(2)-C#からMariaDbにアクセスする。

どもです。 前回のエントリで、外部からMariaDbにアクセスす

c_sharp_eye_catch
外部からMariaDbにアクセスする(1)-データベースの設定

どもです。 今回は、Linux上のMariaDbにWindows

think_about_utest
middle_unit
最小…よりも(ほんの)少し大きいテストフレームワーク

どもです。 今回は、単体テストのフレームワークについて書きます。

→もっと見る

PAGE TOP ↑