スタブ

スタブ（stub）とは、コンピュータプログラムのモジュールをテストする際、そのモジュールが呼び出す下位モジュールの代わりに用いる代用品のこと。下位モジュールが未完成でも代わりにスタブを用いることでテストが可能になる。逆に上位モジュールの代わりに用いる代用品をドライバ（ソフトウェアの場合）またはコントローラ（ハードウェアの場合）と呼ぶ。ただし、仮のモジュールではなく正規のモジュールについてもドライバまたはコントローラと呼ばれることがあるので、区別するために「テストドライバ」や「サンプルドライバ」などと呼ぶことも多い。

なお、stubの原義は使い残し、半券、切り株といった意味である。

概要 
呼び出す側（上位）のモジュールを検査する場合に、呼び出される側（下位）の部品モジュールが未完成であることがある。このとき、呼び出される側の部品モジュールの代用とする仮のモジュールを、「スタブ」と呼ぶ。スタブモジュールは設計仕様に定義されている全ての関数を実装してあるが、関数内部は正規の動作をせず、定数を返すだけという作りになっていることが多い。下位モジュールの関数の戻り値によって、上位モジュールの動作が分岐する場合は、その分岐パターンを満たすための最低限のいくつかの定数を返す、複数のスタブを作る場合もある。あるいは（その関数が引数をとる場合は）与えられる引数によって（正規の処理とは関係ない、最低限の分岐処理だけを実装し）、それらの値を返すスタブを作ることもある。

たとえば複数人でプログラミングをするときなどでは、初めはモジュールごとにプログラムを作成し、後で各モジュールを結合（リンク）して、全体としてうまく動作するかどうかをテストする。この結合テストの前段階で、個々のモジュールは、あらかじめ正当性を検査しておくことが望ましい。その場合、呼び出す部品モジュールがまだ完成していないときには、スタブが用いられる。スタブは、単純で何もしないようなものであってもよく、テストしたい部分とリンクして動作させるのに十分であればよい。

また、このようなスタブは、モジュールの仕様設計の段階で作られる事がほとんどである。とりあえず設計段階で中身のないスタブモジュールを書くことによって、モジュール間の結合の設計に問題がないかを具体的に確かめながら仕様設計ができるからである。また、スタブモジュールのみを作成することもまずありえない。スタブモジュール作成によって工数を消費することはデメリット以外何物でもないからである。

一般にテストする対象が上位階層のモジュールであって下位の部品が未完成の場合、その代用となる仮の下位階層モジュールを、「スタブ」と呼ぶ。

いずれの場合も、全体のプログラムテストを飛躍的に効率よくする役割を果たす。

組み込みシステム 
組み込みシステムのソフトウェアを開発する際には、コンパイラなどの開発ツールを動かすコンピュータ（ホストコンピュータ）と、開発対象となるコンピュータ（ターゲットコンピュータ）は全く異なるものであることが多い。この時、プログラムを実際に動かしながら動作を確かめるデバッガは、ユーザインタフェースを必要とする本体部分をホストコンピュータ上で動作させ、ターゲットコンピュータ上では本体部分から通信線による指示を受けてCPUやメモリの状態を読み書きする小さなプログラムを動かしておくという構成になることが多い。この、ターゲット上の小さなプログラムを「スタブ」と呼ぶ。

このようなデバッガのスタブは、当然のことながらターゲットコンピュータのCPUに強く依存したものになり、しばしばアセンブリ言語を用いて作成される。スタブが行なわなければならない主な内容は、次のようになる。
 ホストコンピュータとの通信回線を初期化する
 任意のメモリ内容を読み出して通信回線に送り出す
 任意のメモリ内容を通信回線から受けたデータで書き換える
 CPUの内部状態（レジスタ）を整えて、実行コードの任意の位置に制御を移す
 実行コード中にソフトウェア割り込み命令を埋め込みターゲットソフトウェアの実行を一時的に停止させスタブに制御を戻す
 上記のソフトウェア割り込み発生時にCPUの内部状態を読み取って通信回線に送り出す

組み込みシステム用ソフトウェア開発においては、このスタブを早い段階で安定動作させることができるかどうかが、その後の開発作業がスムーズに進むかどうかに大きく影響する。なお、スタブ自身のデバッグ作業には、一般にはハードウェア的にCPUの動作を制御するインサーキット・エミュレータを用いる。このインサーキット・エミュレータは比較的高価な装置であるため、開発人員全員の分を用意すると、開発コストが高くなってしまう。このため、スタブを開発する際やソフトウェアデバッガではどうしても検出できない事象を確認する際などの要所にのみインサーキット・エミュレータを用い、それ以外はスタブを活用して開発作業を進めることになる。

脚注

関連項目 

 モックオブジェクト
 テストダブル
 スタブネットワーク

外部リンク 
 IT用語辞典BINARY - スタブ
 IT用語辞典e-Words - スタブ
 情報システム用語辞典 - テストスタブ

ソフトウェアテスティング
ユニットテスティング
イディオム (プログラミング)
ソフトウェア開発