*

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

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

どもです。

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

1.振り返り

前回から、

  • スタブを自動生成して単体テストを効率化するために、スタブで行うべき処理について考える。

というテーマについて考えたことを書いています。
前回のエントリでは、関数/引数の戻り値に着目し、

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

という結論になりました。
今回は、「関数の引数」について考えます。

2.関数の引数

関数の引数、特に組み込み開発で使用されるC言語では、関数の引数は「値を渡す」(値渡し)場合とポインタにより「アドレスを渡す」(アドレス渡し)場合があります。
それぞれの「渡し方」に対してスタブで行うべき処理、実装は異なってくると思います。
そのため、それぞれの場合についてスタブで行うべき処理、実装を検討していきます。

2.1.値渡し

値渡しの場合は、実にシンプルです。
バッファを用意して、引数を代入/コピーして保持しておくのがよいと考えています。
実際のコードは、下記のようになるかと思います。

少し解説すると、最初にバッファ(FuncArg_arg)に値をコピーし、その後に呼び出し回数をインクリメントしています。
この順番で処理を行わないと、引数が正しい順番でバッファに代入/保持がされません。
※処理順を逆にした場合、例えば1回目の呼び出された場合でも、バッファ(FuncArg_arg)の先頭ではなく、2番目に引数の値が代入されます。

2.2.アドレス渡し

アドレス渡し、即ち引数がポインタの場合は、注意すべき点があります。
それは、引数が「入力」なのか「出力」なのか、です。
引数のポインタが「出力」の場合、ポインタの実体に値を設定することで何らかの結果の値を呼び出し元関数に返します。
スタブでは、この「出力」する処理を代替するように実装する必要があります。
これが、「注意すべき点」です。

2.2.1.入力の場合

引数がポインタでも、それが入力の場合は、特に問題がありません。
「値渡し」の場合と同様の処理を行えばよいです。
即ち、スタブの実装は下記の様になるかと思います。

2.2.2.出力の場合

関数が、ポインタを介して(戻り値以外で)値を返す場合です。
この場合、スタブで行うべき処理、実装は「入力」の場合よりも考える必要があるかと思います。
即ち、

  • 引数で渡されたアドレスの保持
  • 出力する値の代入(設定)

の両方の処理、実装が必要になります。
スタブは、下記のように実装することで解決/対応ができると思います。

しかしこの処理、実装では少し問題があります。
上記のスタブで対応できるのは、引数のポインタが指す先が配列ではない場合のみです。
ポインタが配列を指す場合、上記の実装で対応できるのは配列の先頭の値を書き換える場合のみです。
配列の2番目以降の値を書き換える必要がある場合は、上記の方法では対応ができません。
ポインタが配列を指す、かつ配列の先頭以外を書き換える場合には、スタブの処理を以下のように実装することで、対応ができるかと思います。

この例では、先頭から4コ分のデータを連続して引数に代入しています。
実際に何個分のデータをコピーするかについては、適宜変更するのがよいかと思います。
(自動化の際には、別途設定できるようにする…?)

3.続く!!

おなじみですが、長くなってきたので、今回のエントリはこの辺りで終了します。

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

  • ポインタではない場合には、渡された値をそのまま代入/保持するためのバッファを用意する。
  • ポインタの場合は、「入力」であれば渡されたアドレスを代入/保持するためのバッファを用意する。
  • ポインタでありかつ「出力」の場合には、ポインタの実体に設定する値を保持するバッファを用意する。
  • ポインタでありかつ「出力」の場合には、呼び出される度に、用意したバッファの値をポインタの実体に代入して値を返す。
  • ポインタでありかつ「出力」かつポインタが「配列」を指す場合には、用意するバッファは2次元配列がよい。
    (ただし、自動化の際には工夫が必要。)

です。
次回も、引き続きスタブの引数、特にダブルポインタについて書きます。

ではっ!

続きはコチラ

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

関連記事

no image

RaspberryPiのOS:RaspbianをNOOBSでセットアップしてみた

どもです。 今回の内容は、「今更!?」ですがNOOBSでRaspbianをセットアップしたとい

記事を読む

MindStormControl_SprachScreen

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

どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての

記事を読む

toppers

C言語でEV3開発(20)-超音波センサと安全状態

どもです。 前回は、BluetoothでPCとEv3を接続してコマンドの送受信について書きました。

記事を読む

RasPi_Qt

Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。

どもです。 RaspberryPiのOS:Raspbianの新しいバージョンが、少し前(…なの

記事を読む

cygwin_my_image

Windows10/cygwinの音を消す

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

記事を読む

Arduino_DHT11

温度(湿度)センサを使ってみた(1)-ArduinoでDHT11

どもです。 今回は、久しぶりにセンサーを購入して使ってみたので、それについて記載します。 1.使

記事を読む

iot_raspberrypi_gateway_001_eye_catch

IoT開発(8)
RaspberryPiをIoTゲートウェイにする(II)-ex
MariaDBにPHPからアクセス

どもです。 このエントリは、前回のエントリの追加項目です。 前回のエントリ内でMariaDB

記事を読む

raspberry-pi

QtでRaspberryPi/GUI開発(9)-SPI通信をしてみた

どもです。 えー。 「Qtで…」とか書いておきながら、今回はQtは出てきません。 今回のエ

記事を読む

c_sharp_eye_catch

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

どもです。 今回は、C#/OpenXmlの組み合わせで、エクセルのセル内の文字列から 「取り

記事を読む

iot_at_home_eye_catch

IoT開発(3)-ESP-WROOM-02でデータを送信

どもです。 この記事は、IoT開発(1)-ESP-WROOM-02のセットアップ、IoT開発(

記事を読む

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 ↑