*

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

関連記事

cygwin_my_image

cygwinでstartコマンド

どもです。 このエントリでは、cygwinでWindows/コマンドプロンプトの「start」

記事を読む

google_test

C言語でEV3開発(6)

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

記事を読む

no image

C言語でEV3開発(11)-opOUTPUT_STEP_POWERコマンド

どもです。 今回のエントリーでは、再びモーターを動かすためのコマンドについて書きます。 コマンド

記事を読む

cygwin_my_image

Windows10/cygwinの音を消す

どもです。 最近、Windows10/cygwinで作業をする場面がありました。 このcyg

記事を読む

eclipse-juno-logo

C言語でEV3開発(2)

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

記事を読む

RasPi_Qt

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

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

記事を読む

toppers

C言語でEV3開発(26)-EV3で機械学習(1)-QLearningをC#に委譲してみた

どもです。 前回の投稿では、Q-LearningをEV3本体に実装してみたら、メモリが足りなくて動

記事を読む

Arduino_Logo

フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。 1.フォトレジスタって何?

記事を読む

no image

自宅で電子工作(1):ブレッドボードでの配線を省略する

どもです。 突然ですが、電子工作を始めてみました。 1.背景 これまで、Raspber

記事を読む

no image

C言語でEV3開発(7)

どもです。 今回のエントリーでは、いよいよ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="">

think_about_utest
VisualStudioで実行した単体テストの結果の出力(3)-テスト実行からレポート生成までをツールで自動化

どもです。 前々回、前回と、VisualStudio/C#での単

think_about_utest
VisualStudioで実行した単体テストの結果の出力(2)-出力ファイルの読める化

どもです。 前回の続きです。 前回は、VisualStud

think_about_utest
VisualStudioで実行した単体テストの結果の出力(1)-ファイルへの出力

どもです。 最近、VisualStudio/C#でよく開発してい

think_about_utest
単体テストの効率化を考える(6)-スタブの自動生成ツール

どもです。 「単体テストの効率化について考える」の6回目です。

think_about_utest
単体テストの効率化を考える(5)-スタブの自動生成への入力

どもです。 「単体テストの効率化について考える」の5回目です。

→もっと見る

PAGE TOP ↑