1. 結論(この記事で得られること)
Cursor の agent 機能を使えば、テストコードの土台作りを数分で終わらせられます。ただし「生成して終わり」では危険です。
この記事では、私が実際にチームで運用している以下のポイントをお伝えします。
- Cursor agent にテストを書かせる具体的なプロンプト設計
- 生成されたコードをどこまで信用して良いかの判断基準
- レビューで見るべき観点と、実装者が手直しすべき箇所
- CI/CD に組み込むまでのチェックリスト
昔、私もテストを「後で書く」と言いながら放置して、本番障害を起こした経験があります。AI でテストの初速を上げられる今だからこそ、正しい使い方を押さえておきましょう。
2. 前提(環境・読者層)
想定する読者
- Cursor を業務で使い始めたエンジニア
- テストコード文化を根付かせたいチームリーダー
- AI 生成コードのレビュー観点を知りたい人
前提環境
- Cursor Pro 契約済み(agent 機能は Pro 限定)
- 言語:TypeScript / Python あたりを想定(他言語でも応用可)
- テストフレームワーク:Jest / pytest など主流のもの
3. Before:よくあるつまずきポイント
3-1. 「とりあえず生成してもらった」で満足してしまう
agent に「このファイルのテスト書いて」と頼むと、確かに一瞬でテストファイルが生まれます。でもカバレッジだけ高くて中身がスカスカなことが多い。
// agent が生成しがちなダメな例
describe('UserService', () => {
it('should create instance', () => {
const service = new UserService();
expect(service).toBeDefined();
});
});
これ、実質何もテストしてません。昔の私もこれを「テストあるからOK」と言い張って、レビューで指摘された苦い思い出があります。
3-2. モック設定を丸投げして壊れたテストができる
外部 API やデータベースへの依存が絡むと、agent は適当なモックを作りがちです。
# 生成されたが動かない例
@patch('requests.get')
def test_fetch_user(mock_get):
mock_get.return_value = None # ← これじゃ AttributeError 起きる
result = fetch_user(1)
assert result is not None
3-3. エッジケースを生成しない
正常系だけ書いて、異常系・境界値・タイムアウトなどは指示しないと書かないのが agent の特性です。
4. After:基本的な解決パターン
4-1. agent へのプロンプト設計が全て
単に「テスト書いて」ではなく、テスト設計の観点まで含めた指示を出します。
@agent 以下の UserService.ts に対してテストを作成してください。
【要件】
- 正常系、異常系、境界値を網羅
- 外部 API (fetchUserFromAPI) は必ずモック化
- モックの戻り値は型定義に従って正確に
- テストケース名は「〜の場合、〜になる」形式で日本語OK
- setup / teardown で DB 状態をリセット
これだけで生成品質が段違いに上がります。
4-2. 生成後は必ず「実行 → 失敗 → 修正」のサイクルを回す
$ npm test -- UserService.test.ts
agent が作ったテストは8割は動くが2割は壊れてる前提で見ます。私は必ず以下を確認します。
- import パスが正しいか
- モックが実際の型と合っているか
- 非同期処理の await 漏れがないか
- エラーハンドリングが雑でないか
4-3. 最低限のテンプレートを用意しておく
agent が毎回ゼロから考えるのは非効率なので、チーム内でテストコードのテンプレートを決めておきます。
// tests/template.test.ts
import { describe, it, expect, beforeEach, afterEach } from '@jest/globals';
describe('【対象クラス名】', () => {
beforeEach(() => {
// 初期化処理
});
afterEach(() => {
// クリーンアップ
});
describe('【メソッド名】', () => {
it('正常系:〜の場合、〜を返す', () => {
// Arrange
// Act
// Assert
});
it('異常系:〜の場合、エラーをthrowする', () => {
});
it('境界値:〜', () => {
});
});
});
これを agent に渡して「このテンプレに従って埋めて」と指示すると、品質が安定します。