OpenCodeでテストコードを自動生成する:TDDを加速する実践ガイド
OpenCodeを使ってテストコードを自動生成する方法を解説。Jestとの連携、TDDワークフローへの組み込み、品質向上のポイントを具体例で紹介。
はじめに:テストコード自動生成の価値
テスト駆動開発(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を組み込む。
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/
品質を高めるポイント
*この記事はOpenCodeを日常的に使用し、AIエージェントにSSH経由でNixOSをインストールさせるなどの実践経験を持つSioが監修しています。DeepSeek APIのヘビーユーザーとして、実際のコスト感や制限事項を反映しています。*
まとめ
OpenCodeを使えば、Specificationからテストコードを自動生成でき、TDDの導入障壁を下げられる。ただし、生成されたコードを盲信せず、レビューと修正を怠らないことが重要だ。Specificationを「生きたドキュメント」として育てることで、プロジェクトの品質と開発速度を両立できる。
ぜひ、あなたのプロジェクトでもOpenCodeを試してみてほしい。