テストと品質
AI を活用してテストの効率と品質を向上させる方法を学び、AI によるテストケース生成、テストコード作成、テスト最適化などのベストプラクティスを習得します。
Sequential Thinking を使って AI 駆動のテストを学ぶ
AI のテストへの応用は複数の側面にまたがり、使用構造化思考の方法次の内容を体系的に習得するのに役立ちます:
テストタイプの概要
テストの種類を素早く理解し、AI実践のための背景知識を提供します。
単体テスト
単一の関数またはコンポーネントをテストし、迅速なフィードバックと高いカバレッジを実現。
統合テスト
複数モジュールの連携をテストし、インターフェースとデータフローを検証する。
E2E テスト
エンドツーエンドテストで、実際のユーザー操作をシミュレートします。
性能テスト
システムの性能と負荷耐性をテストする。
テストにおけるAIのベストプラクティス
AI を活用してテストの効率と品質を向上させ、テストケース生成からテスト自動化までの全工程で AI を支援として活用する実践。
AI 支援によるテストケース生成
AI を使って単体テストのテストケースを生成する
AI に関数の機能を説明し、完全なテストケースを生成させる:
Prompt テンプレート:
以下の関数の単体テストケースを生成したいです:
// utils/calculateTotal.ts
export function calculateTotal(items: Item[]): number {
if (!items || items.length === 0) return 0
return items.reduce((sum, item) => {
if (item.price && item.quantity) {
return sum + item.price * item.quantity
}
return sum
}, 0)
}
interface Item {
price?: number
quantity?: number
}
Jest/Vitest を使用してテストケースを生成してください。含める内容:
- 正常系のテスト
- 境界値テスト(空配列、null、undefined)
- 異常系テスト(price または quantity が不足している場合)
- describe と it を使ってテストを整理する
- 分かりやすいテスト説明を使用するAI 生成のテストケース例
// utils/calculateTotal.test.ts
import { describe, it, expect } from 'vitest'
import { calculateTotal } from './calculateTotal'
describe('calculateTotal', () => {
it('should return 0 for empty array', () => {
expect(calculateTotal([])).toBe(0)
})
it('should return 0 for null or undefined', () => {
expect(calculateTotal(null as any)).toBe(0)
expect(calculateTotal(undefined as any)).toBe(0)
})
it('should calculate total for valid items', () => {
const items = [
{ price: 10, quantity: 2 },
{ price: 5, quantity: 3 }
]
expect(calculateTotal(items)).toBe(35) // 10*2 + 5*3 = 35
})
it('should ignore items without price', () => {
const items = [
{ price: 10, quantity: 2 },
{ quantity: 3 }
]
expect(calculateTotal(items)).toBe(20)
})
it('should ignore items without quantity', () => {
const items = [
{ price: 10, quantity: 2 },
{ price: 5 }
]
expect(calculateTotal(items)).toBe(20)
})
it('should handle zero price or quantity', () => {
const items = [
{ price: 0, quantity: 2 },
{ price: 10, quantity: 0 }
]
expect(calculateTotal(items)).toBe(0)
})
})AI による統合テストシナリオの生成
Prompt:
ユーザー登録 API の統合テストシナリオを生成する必要があります:
API: POST /api/users/register
リクエストボディ: { email, password, name }
レスポンス: { id, email, name, createdAt }
次の内容を含むテストケースを生成してください:
- 登録成功シナリオ
- メールアドレスが既に存在するシナリオ
- パスワード強度不足シナリオ
- 必須フィールド欠落シナリオ
- テストデータベースを使用する
- テストデータをクリーンアップするAI が E2E テストフローを生成
Prompt: ショッピングカートのフロー用に E2E テストを生成したいです: ユーザーフロー: 1. ホームページにアクセス 2. 商品を検索 3. 商品をカートに追加 4. カートを確認 5. 決済 6. 注文情報を入力 7. 注文を送信 Playwright を使用して、以下を含む完全な E2E テストコードを生成してください: - ページ遷移 - 要素の特定 - ユーザー操作 - アサーション検証 - エラー処理
TDD 実践の基礎
コア概念を保持し、AI がどのように TDD を支援するかに重点を置いて示します。AI を使用すると、テストケース、実装コード、リファクタリング提案を素早く生成できます。
赤(Red)
失敗するテストを書き、期待される動作を定義する
グリーン(Green)
最小実装を記述して、テストを通す
リファクタリング(Refactor)
コードを最適化し、テストの合格を維持する
AI支援TDD
AI は TDD の各段階で支援できます:テストケースの生成、迅速な実装、リファクタリングの提案。詳細な例と Prompt テンプレートについては、上記の「AI支援 TDD 実践」セクションを参照してください。
テストツールの基礎
コアツールの紹介は残し、AI がツール選択をどのように支援するかを重点的に示す。
Jest
JavaScript テストフレームワーク。組み込みのアサーションと Mock を備えています
Vitest
高速テストフレームワーク、Vite ネイティブサポート、TypeScript フレンドリー
Playwright
E2Eテストフレームワーク、マルチブラウザ対応
AI支援ツールの選定
AI を使用して、プロジェクト要件に基づき適切なテストツールを選択します。プロジェクトの特徴(Next.js、TypeScript、E2E テストが必要など)を AI に説明すると、適切なツールの組み合わせと設定案を提案してくれます。
品質保証の基礎
コアコンセプトはそのままに、AI がどのように品質保証を支援するかを重点的に示す。
テスト戦略
- • テストピラミッド:大量の単体テスト + 適量の統合テスト + 少量の E2E テスト
- • 重要なパスを優先する:コア業務ロジックを優先的にテスト
- • 境界テスト:境界条件と異常ケースをテストする
コードカバレッジ
- • 行カバレッジ:実行されたコード行数の割合
- • ブランチカバレッジ:実行されるコード分岐の割合
- • 目標:主要コード80%以上、全体60%以上
AI支援品質保証
AI はテスト戦略を分析し、品質レポートを生成し、未カバーのコードパスを特定できます。詳細な例と Prompt テンプレートについては、上記の「AI 支援のカバレッジ分析」と「AI 駆動のテスト自動化」セクションを参照してください。
実践例
実際のコード例を通して、AI を使ってテストの効率と品質を高める方法を学びます。
AI 生成のテストケース
完全なテストケース生成の例(Prompt + 結果):
// 1. AI に要件を提示する
Prompt: "calculateTotal 関数の単体テストを生成してください。正常系、境界値、例外系を含めて..."
// 2. AI が生成したテストケース
describe('calculateTotal', () => {
it('should return 0 for empty array', () => {
expect(calculateTotal([])).toBe(0)
})
it('should calculate total for valid items', () => {
const items = [
{ price: 10, quantity: 2 },
{ price: 5, quantity: 3 }
]
expect(calculateTotal(items)).toBe(35)
})
// ... more test cases
})AI によるテストコード最適化
テストコード最適化の例(最適化前後の比較):
// すべてのテストが実際の API を呼び出す
describe('UserService', () => {
it('should fetch user', async () => {
const user = await fetchUser('1') // 実際の API 呼び出し
expect(user.id).toBe('1')
})
it('should update user', async () => {
const user = await fetchUser('1') // 繰り返し呼び出し
await updateUser('1', { name: 'New' })
expect(user.name).toBe('New')
})
})// AI の提案:実際の API の代わりに Mock を使用する
vi.mock('./api', () => ({
fetchUser: vi.fn().mockResolvedValue({ id: '1', name: 'Test' }),
updateUser: vi.fn().mockResolvedValue({ id: '1', name: 'New' })
}))
describe('UserService', () => {
it('should fetch user', async () => {
const user = await fetchUser('1')
expect(user.id).toBe('1')
})
it('should update user', async () => {
await updateUser('1', { name: 'New' })
expect(updateUser).toHaveBeenCalledWith('1', { name: 'New' })
})
})AI 分析カバレッジ
カバレッジ分析と補足提案の例:
// AI によるカバレッジレポート
カバレッジ:65%
未カバーのコード:
- utils/validation.ts:45%
- validateEmail のエラー処理分岐が未テスト
- validatePassword の境界ケースが未テスト
AI が追加を提案したテストケース:
it('should return false for invalid email', () => {
expect(validateEmail('invalid')).toBe(false)
expect(validateEmail('invalid@')).toBe(false)
expect(validateEmail('@domain.com')).toBe(false)
})学習成果
この章を終えると、あなたは:
- 1テストの種類の概要(単体テスト、統合テスト、E2Eテスト、性能テスト)とその適用シーンを理解する
- 2AI でテストケースを生成する方法をマスターする(単体テスト、統合テスト、E2E テストケース生成)
- 3AI を使ってコード作成のテストを補助できる(テストフレームワークの構文、Mock データ生成、テストデータ準備)
- 4AI を使用してテスト性能を分析・最適化できる(性能ボトルネック分析、テスト実行速度の最適化、テストリファクタリング)
- 5AI 支援のカバレッジ分析の方法を習得する(カバレッジレポートの分析、未カバーのコードパスの特定、追加テストケースの提案)
- 6AI 駆動のテスト自動化を使用できる(CI/CD 設定生成、テストレポート分析、テスト失敗原因予測)
- 7AI支援TDD実践を習得する(テストケース生成、最小実装コード生成、リファクタリングの提案)