【一発で理解】スタブとは?“テスト用の仮データ”の正体をわかりやすく解説

スタブとは

「スタブって何?」「モックと何が違うの?」──開発を学び始めた段階で、多くの人がぶつかる壁です。

  • スタブという言葉を聞いたけど意味がよく分からない
  • モックとの違いが曖昧で整理できない
  • テストでスタブを使う理由がピンとこない

本記事ではスタブの意味・使い方・モックとの違いまで体系的に解説します。読み終えた時点で、スタブの役割と使い分けが明確になります。

結論:スタブは「テストを成立させるための必須技術」です。

スタブとは?一発でわかる意味

スタブとは、テスト用に用意する仮の処理や仮のデータを指します。外部システムの代わりに動作する簡易的な部品です。

システム開発では、すべての機能が完成する前にテストを行います。未完成の機能がある状態では通常の処理が動きません。スタブを使うことで未完成の部分を仮の処理で補い、開発途中でもテストが可能になります。

ポイント

スタブは本物の処理を再現する必要はありません。最低限の結果だけを返すのが役割です。たとえばログイン機能のテストでは、データベース認証の代わりにスタブが固定の結果を返します。認証処理を省略しながらテストを進められるため、テスト速度が大幅に向上します。

スタブの語源と由来

stubは英語で「切り株」「半券」を意味する単語です。映画の半券(チケットスタブ)のように、本体の代わりとなる控え・代用品というニュアンスがあります。IT分野でもこの意味が転用され、「本物の処理の代わりに使う仮の部品」としてスタブという名称が定着しました。

なぜスタブが必要なのか──依存を切り離すため

スタブが必要な理由は、依存関係を排除するためです。

システムは複数の機能が連携して動作します。外部APIやデータベースに依存するケースも多く、依存が残ったままではテストが不安定になります。通信エラーや環境差異によって結果が変わるためです。

スタブを使うと依存を完全に切り離せます。安定した環境でテストを実行でき、バグの原因特定も容易になります。

一言でいうと

スタブ =「テストを成立させるための代用品」

スタブの仕組みを図解で理解する

スタブは概念だけでは理解しにくい技術です。「あり」と「なし」の比較で流れを見ると一気に理解が深まります。

スタブがない場合──テストが止まる

スタブなしの場合

テスト対象
機能A
外部API
未完成 / 不安定
結果
テスト失敗・停止

外部APIが未完成または不安定な状態では、データ取得ができずに機能全体のテストが停止します。開発が進まない原因になります。

スタブがある場合──テストが安定する

スタブありの場合

テスト対象
機能A
スタブ
固定データを返す
結果
テスト成功・安定

APIの代わりにスタブが固定データを返すため、外部通信がなくても処理が成立します。テストが止まらなくなります。

本物の処理とスタブの違い

本物の処理は複雑なロジックを含みます。一方でスタブは結果だけを返す簡易的な仕組みです。目的が異なるため、精度より安定性が重視されます。

スタブとモックの違い【最重要】

スタブとモックは混同されやすい用語ですが、役割が明確に異なります。

  • スタブ:値を返す(返すことが目的)
  • モック:呼び出しを検証する(確認することが目的)

正しく使い分けることで、テストの精度が大きく向上します。

比較表でわかるスタブとモックの違い

項目 スタブ モック
役割 データを返す 呼び出しを検証する
主な用途 出力の確認 挙動の確認
テスト観点 結果が正しいか 呼び出しが正しいか
複雑さ シンプル やや複雑
初心者向け 理解しやすい 少し難しい
具体例 価格計算テスト メール送信テスト

どちらを使うべきか──使い分けの基準

使い分けは次の基準で判断します。

  • 結果だけ確認したい場合 → スタブを使う
  • 呼び出しの正しさを確認したい場合 → モックを使う

たとえば、計算結果の数値が正しいかを確認するテストにはスタブが適しています。一方で「メール送信関数が正しく呼ばれたか」を確認する場合にはモックを使います。目的を明確にすると選択に迷いません。

スタブの具体例(コード付き)

スタブは具体例で見ると一気に理解できます。実際の開発でよく使われる2つのパターンを紹介します。

例1:APIをスタブ化するケース

外部APIを利用する処理を想定します。通常はAPIにリクエストを送りデータを取得しますが、APIが不安定な場合はテストが失敗します。スタブを使えば通信を行わず固定データを返せるため、テストが安定します。

Python

# 本来の処理(外部APIに接続)
def get_weather(city):
    response = requests.get(f"https://api.example.com/weather/{city}")
    return response.json()

# スタブ(固定データを返す)
def get_weather_stub(city):
    return {"city": city, "temp": 20, "condition": "晴れ"}

JavaScript

// 本来の処理(外部APIに接続)
async function getWeather(city) {
  const res = await fetch(`https://api.example.com/weather/${city}`);
  return res.json();
}

// スタブ(固定データを返す)
function getWeatherStub(city) {
  return { city, temp: 20, condition: "晴れ" };
}

例2:データベースをスタブ化するケース

データベースに依存する処理も同様です。通常はデータの読み書きで動作しますが、環境によって結果が変わるリスクがあります。スタブを使えば決まったデータを返せるため、環境差を完全に排除できます。

Python

# 本来の処理(DBに接続)
def get_user(user_id):
    return db.query(f"SELECT * FROM users WHERE id = {user_id}")

# スタブ(固定データを返す)
def get_user_stub(user_id):
    return {"id": user_id, "name": "テストユーザー", "role": "admin"}

# テストコード
def test_greet():
    user = get_user_stub(1)
    result = f"こんにちは、{user['name']}さん"
    assert result == "こんにちは、テストユーザーさん"

JavaScript

// 本来の処理(DBに接続)
async function getUser(userId) {
  return await db.query("SELECT * FROM users WHERE id = ?", [userId]);
}

// スタブ(固定データを返す)
function getUserStub(userId) {
  return { id: userId, name: "テストユーザー", role: "admin" };
}

// テストコード
function testGreet() {
  const user = getUserStub(1);
  const result = `こんにちは、${user.name}さん`;
  console.assert(result === "こんにちは、テストユーザーさん");
}

スタブを使うメリット・デメリット

スタブは便利な技術ですが、注意点も存在します。メリットとデメリットの両面を理解しておく必要があります。

メリット

  • テストが高速・安定する
    外部通信やDB処理が不要になり、処理速度が向上。テスト時間が短縮される
  • 外部依存を排除できる
    外部サービスの状態やネットワークエラーに影響されない。テスト環境を完全にコントロールできる
  • バグ特定が容易になる
    安定した結果が得られるため、原因の切り分けがしやすい

デメリット

  • 本番との差異が出る
    簡易的な処理のため、本番環境の挙動と差が生まれる可能性がある
  • 使いすぎると危険
    実際の処理を検証しない状態が続き、本番でエラーが発生する原因になる
  • 想定外のバグを見逃す
    スタブでは再現できないエッジケースが存在する

スタブが使われるシーン

スタブは多くの開発現場で活用されています。代表的な3つのシーンを押さえておきましょう。

単体テスト(ユニットテスト)

スタブは単体テストで最も頻繁に使われます。単体テストは機能単位で動作を確認する工程であり、外部依存を排除する必要があります。スタブを使うことで対象機能だけを検証でき、余計な影響を受けずにテストできます。

外部API連携のテスト

API連携は不安定になりやすい領域です。通信エラーやレスポンス遅延が発生するため、安定したテストが難しくなります。スタブを使えば通信を省略でき、常に同じ結果を返すため検証が容易になります。

開発初期の仮実装

開発初期では機能が揃っていません。未完成の部分が多く動作確認が難しい状態です。スタブを使うことで仮の処理を用意し、開発を止めずに進行できます。

スタブを使うべきか迷ったときの判断基準

スタブの利用は判断基準を持つと迷いません。以下のポイントを確認してください。

外部依存があるかどうか

外部依存がある場合はスタブが有効です。APIやデータベースが対象になります。依存を切ることでテストが安定します。

テストの目的は「結果」か「挙動」か

結果の正しさを確認する場合はスタブが適しています。挙動の確認が目的ならモックを使います。

チェックリスト:スタブ vs モック

スタブが適しているケース

  • 戻り値だけ確認したい
  • 処理の流れは重要ではない
  • テストを高速化したい
  • 外部通信を排除したい

複数当てはまる場合、スタブが最適な選択肢です。

よくある誤解とNGパターン

スタブは誤解されやすい技術です。間違った使い方は品質低下につながります。

NG 1

スタブ = モックだと思っている

スタブとモックは別物です。役割を混同するとテスト設計が崩れます。目的を明確にして使い分ける必要があります。

NG 2

スタブを使いすぎる

スタブに頼りすぎると、実際の処理を検証しない状態になります。本番で不具合が発生する原因です。

NG 3

本番と違いすぎるテストになっている

スタブは簡易的な処理です。現実の挙動と乖離するとテスト結果が信用できなくなります。適切な範囲で使うことが重要です。

スタブに関するよくある質問(FAQ)

スタブとフェイクの違いは?

スタブは固定の結果を返す仕組みです。フェイクは簡易的ながらも実際の動作を再現する実装を持ちます。スタブは「結果だけを返す」、フェイクは「動作を模倣する」という点が異なります。

スタブは本番コードに影響する?

スタブはテスト専用の仕組みです。本番環境のコードには含まれないため、影響を与えることはありません。

初心者はスタブから覚えるべき?

はい。スタブは構造がシンプルで理解しやすい特徴があります。テスト技法の基礎を固める第一歩として最適です。スタブを理解した後にモックやフェイクへ進むと効率的に学べます。


まとめ|スタブは「テストを成立させるための土台」

スタブは開発効率を大きく向上させる技術です。

  • テストを安定させる
  • 依存関係を排除できる
  • 開発を止めずに進められる

正しく理解することでテスト設計の質が上がります。まずは小さな機能からスタブを導入してください。実践を通じて理解が深まります。

より高度なテスト設計を学びたい場合は、モックやフェイクの理解も進めていきましょう。