OpenCodeでテストコードを自動生成する:TDDを加速する実践ガイド

OpenCodeを使ってテストコードを自動生成する方法を解説。Jestとの連携、TDDワークフローへの組み込み、品質向上のポイントを具体例で紹介。

OpenCodeテストコード自動生成TDDJest品質2026/5/25

はじめに:テストコード自動生成の価値

テスト駆動開発(TDD)は品質向上に有効だが、テストコードを書く工数は無視できない。OpenCodeはLLMを活用し、自然言語の仕様から自動でテストコードを生成するツールだ。本記事では、OpenCodeを用いてJestテストコードを自動生成し、TDDサイクルを加速する方法を解説する。

OpenCodeの基本セットアップ

まずはOpenCodeを導入する。Node.js環境が必要だ。

<h1>グローバルインストール</h1>
npm install -g @opencode/cli

<h1>プロジェクト初期化</h1> mkdir my-project && cd my-project npm init -y

次に、テストフレームワークとしてJestをインストールする。

npm install --save-dev jest

OpenCodeの設定ファイル.opencode.ymlをプロジェクトルートに作成する。

<h1>.opencode.yml</h1>
testFramework: jest
testPattern: "**/*.test.js"
sourcePattern: "src/**/*.js"

テストコード自動生成の基本フロー

OpenCodeは「Specification(仕様)」からテストコードを生成する。Specificationは自然言語で記述し、Markdownファイルとして管理する。

ステップ1:Specificationファイルを作成

specs/calculator.mdを作成する。

<h1>Calculator</h1>

<h2>add</h2> <li>2つの数値を受け取り、その和を返す</li> <li>引数が数値でない場合はエラーを投げる</li>

<h2>subtract</h2> <li>2つの数値を受け取り、差を返す</li> <li>引数が数値でない場合はエラーを投げる</li>

ステップ2:テストコードを生成

opcode generate specs/calculator.md --output tests/calculator.test.js

生成されるtests/calculator.test.jsは以下のようになる。

const { add, subtract } = require('../src/calculator');

describe('Calculator', () => { describe('add', () => { test('returns sum of two numbers', () => { expect(add(1, 2)).toBe(3); expect(add(-1, 1)).toBe(0); expect(add(0, 0)).toBe(0); });

test('throws error if arguments are not numbers', () => { expect(() => add('a', 1)).toThrow(); expect(() => add(1, null)).toThrow(); }); });

describe('subtract', () => { test('returns difference of two numbers', () => { expect(subtract(5, 3)).toBe(2); expect(subtract(0, 1)).toBe(-1); });

test('throws error if arguments are not numbers', () => { expect(() => subtract('a', 1)).toThrow(); expect(() => subtract(1, undefined)).toThrow(); }); }); });

ステップ3:実装コードを作成しテストを実行

<h1>実装コードのひな形を作成</h1>
mkdir src
touch src/calculator.js

<h1>テストを実行(最初は失敗する)</h1> npm test

実装を書いてテストを通す。

// src/calculator.js
function add(a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new Error('Arguments must be numbers');
  }
  return a + b;
}

function subtract(a, b) { if (typeof a !== 'number' || typeof b !== 'number') { throw new Error('Arguments must be numbers'); } return a - b; }

module.exports = { add, subtract };

TDDワークフローへの統合

TDDのサイクル「Red-Green-Refactor」にOpenCodeを組み込む。

  • Red: Specificationを書き、テストコードを生成して実行(失敗確認)
  • Green: 実装コードを書き、テストを通す
  • Refactor: コードを改善し、テストが通ることを確認
  • SpecificationファイルをGit管理することで、仕様の変更履歴も追跡できる。

    高度な使い方:複数ファイルと依存関係

    大規模プロジェクトでは、Specificationを分割して管理する。OpenCodeは@importディレクティブをサポートしている。

    <h1>specs/user-service.md</h1>
    @import specs/common/errors.md
    

    <h2>createUser</h2> <li>有効なメールアドレスとパスワードを受け取り、ユーザーを作成する</li> <li>メールアドレスが既存の場合はエラーを投げる</li>

    生成コマンドで複数ファイルを指定できる。

    opcode generate specs/ --output tests/
    

    品質を高めるポイント

  • Specificationを具体的に書く: 「正常系」「異常系」を網羅し、境界値も明記する
  • 生成後にレビューする: 自動生成されたテストコードは必ず人間が確認し、不要なテストや誤ったアサーションを修正する
  • モックを活用する: OpenCodeはモックの自動生成も可能。Specificationに外部依存を明記すれば、Jestのモック関数を生成してくれる
  • 継続的に更新する: 仕様変更時はSpecificationを更新し、テストコードを再生成。手動修正との差分を管理する

  • *この記事はOpenCodeを日常的に使用し、AIエージェントにSSH経由でNixOSをインストールさせるなどの実践経験を持つSioが監修しています。DeepSeek APIのヘビーユーザーとして、実際のコスト感や制限事項を反映しています。*

    まとめ

    OpenCodeを使えば、Specificationからテストコードを自動生成でき、TDDの導入障壁を下げられる。ただし、生成されたコードを盲信せず、レビューと修正を怠らないことが重要だ。Specificationを「生きたドキュメント」として育てることで、プロジェクトの品質と開発速度を両立できる。

    ぜひ、あなたのプロジェクトでもOpenCodeを試してみてほしい。