2025/02/21
Jest で実装する ChatGPT API のユニットテスト

はじめに
ChatGPT API 呼び出しを含むコードのユニットテストは、レスポンスが一定でないため難しいと思われがちですが、いくつかのポイントを押さえることで実装可能です。本記事では、Jest を用いた ChatGPT API のユニットテスト実装方法について、実例を交えながら解説します。
対象読者
- ChatGPT API を利用する開発者
- Jest を用いたユニットテストの経験者
- API 連携を含むコードのテストに課題を感じている方
前提知識
- JavaScript の基本的な知識
- Jest を用いたユニットテストの経験
- ChatGPT API の利用経験
実装例
ChatGPT API を利用したコードのテスト実装例として、2 つの入力を比較して大きい方を返す関数 greaterOf
のテストコードを作成します。
テスト対象のコード (greaterOf.js)
1import OpenAI from "openai"; 2 3/** 4 * OpenAIのAPIを使用して2つの入力を比較し、大きい方を返します。 5 */ 6const greaterOf = async ( 7 openai: OpenAI, 8 a: string, 9 b: string 10): Promise<string> => { 11 const chatCompletion = await openai.chat.completions.create({ 12 model: "gpt-4o-mini", 13 response_format: { type: "text" }, 14 messages: [ 15 { 16 role: "system", 17 content: `1件目の入力と2件目の入力を比較して大きい方の入力をそのまま返してください。`, 18 }, 19 { 20 role: "user", 21 content: a, 22 }, 23 { 24 role: "user", 25 content: b, 26 }, 27 ], 28 }); 29 30 return chatCompletion?.choices?.[0]?.message?.content?.trim() ?? ""; 31}; 32 33export default greaterOf;
テストコード (greaterOf.test.js)
1import OpenAI from "openai"; 2import greaterOf from "./greaterOf"; 3 4const runTests = process.env.CHAT_GPT_TEST; 5 6(runTests ? describe : describe.skip)("greaterOf", () => { 7 const openai = new OpenAI({ 8 organization: "********", // API接続情報を外部から注入 9 project: "********", // API接続情報を外部から注入 10 apiKey: "********", // API接続情報を外部から注入 11 }); 12 13 test.each` 14 a | b | expected 15 ${"木星"} | ${"土星"} | ${"木星"} 16 ${"北海道"} | ${"スコットランド"} | ${"スコットランド"} 17 ${"セーム・シュルト"} | ${"シャキール・オニール"} | ${"シャキール・オニール"} 18 `("greaterOf($a, $b) should return $expected", async ({ a, b, expected }) => { 19 for (let i = 0; i < 3; i++) { 20 const result = await greaterOf(openai, a, b); 21 expect(result).toBe(expected); // 結果を検証 22 } 23 }); 24});
実装のポイント解説
- テスト対象の関数は同じ入力に対して同じ出力を返すように設計する: 出力が一定にならない関数の動作はテストケースで確認するのが難しいです。
- API 接続情報の外部注入: テストコードでは、API キーなどの接続情報を環境変数から取得しています。これにより、本番環境とテスト環境で異なる設定を使用できます。
- 対応箇所: テストコードの
const openai = new OpenAI({ ... });
- 対応箇所: テストコードの
- テストデータの準備:
test.each
を用いて、複数のテストケースを簡潔に記述しています。各テストケースでは、入力値a
、b
と期待される出力値expected
を定義しています。- 対応箇所: テストコードの
test.each
- 対応箇所: テストコードの
- 繰り返し実行: 各テストケースを 3 回繰り返して実行しています。ChatGPT API のレスポンスは変動する可能性があるため、複数回実行することで結果の安定性を確認しています。
- 対応箇所: テストコードの
for (let i = 0; i < 3; i++) { ... }
- 対応箇所: テストコードの
- テストのスキップ: 環境変数
CHAT_GPT_TEST
が設定されている場合のみテストが実行されるようにしています。これにより、CI 環境などで API キーを保護し、テスト実行時間を短縮できます。- 対応箇所: テストコードの
(runTests ? describe : describe.skip)("greaterOf", () => { ... });
- 対応箇所: テストコードの
まとめ
本記事では、Jest を用いた ChatGPT API のユニットテスト実装方法について解説しました。API 接続情報の外部注入、テストデータの準備、繰り返し実行、テストのスキップなどのポイントを押さえることで、ChatGPT API を含むコードのテストを効果的に行うことができます。
ユニットテストはコードの品質向上に不可欠です。ChatGPT API を利用したアプリケーション開発においても、ユニットテストを積極的に導入し、より信頼性の高いソフトウェア開発を目指しましょう。
Author Profile

ARIKAWA
バックエンドエンジニアです。 自転車が好きです。
SHARE