code-review
Freeプロジェクトガイドラインへの準拠をチェックし、バグ、スタイル違反、コード品質問題を検出する。PRレビュー時に使用。
The English summary is being prepared. Showing the original description.
Guides test implementation following the test pyramid (75% unit, 20% integration, 5% E2E), Arrange-Act-Assert pattern, and project coverage thresholds (branches 70%, functions 80%, lines 80%, statements 80%). Covers test naming conventions, test independence, mock and stub patterns, test data management with fixtures and builders, and CI integration. Use when writing tests, reviewing test code, or setting up test infrastructure.
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
プロジェクトのテスト戦略に基づいてテストを実装・レビューするためのスキル。 TESTING.md で定義されたパターンと基準を適用する。
/\
/E2E\ (5%) - クリティカルパス100%
/------\
/統合テスト\ (20%) - 60%以上カバレッジ
/----------\
/ユニットテスト\ (75%) - 80%以上カバレッジ
/--------------\
| テスト種別 | 比率 | カバレッジ目標 | 優先度 |
|---|---|---|---|
| ユニットテスト | 75% | 80%以上 | 高 |
| 統合テスト | 20% | 60%以上 | 中 |
| E2Eテスト | 5% | クリティカルパス100% | 高 |
プロジェクトの最低カバレッジ基準:
| メトリクス | 閾値 |
|---|---|
| branches | 70% |
| functions | 80% |
| lines | 80% |
| statements | 80% |
// jest.config.js
coverageThreshold: {
global: {
branches: 70,
functions: 80,
lines: 80,
statements: 80
}
}
すべてのテストは Arrange-Act-Assert パターンに従うこと:
describe("UserService", () => {
let service: UserService;
let mockRepository: jest.Mocked<IUserRepository>;
beforeEach(() => {
// Arrange: テスト準備(各テストで新しいインスタンス)
mockRepository = mock<IUserRepository>();
service = new UserService(mockRepository);
});
describe("createUser", () => {
it("should create user successfully with valid data", async () => {
// Arrange
const userData = { email: "test@example.com", name: "Test User" };
const expectedUser = { id: "123", ...userData };
mockRepository.save.mockResolvedValue(expectedUser);
// Act
const result = await service.createUser(userData);
// Assert
expect(result).toEqual(expectedUser);
expect(mockRepository.save).toHaveBeenCalledWith(
expect.objectContaining(userData),
);
});
it("should throw ValidationError for invalid email", async () => {
// Arrange
const invalidData = { email: "invalid-email", name: "Test User" };
// Act & Assert
await expect(service.createUser(invalidData)).rejects.toThrow(
ValidationError,
);
expect(mockRepository.save).not.toHaveBeenCalled();
});
});
});
テスト名は具体的で、何をテストしているかが明確であること:
// ✅ 良い例: 具体的で理解しやすい
it("should return 404 when user does not exist", () => {});
it("should validate email format before saving", () => {});
it("should retry 3 times on network failure", () => {});
// ❌ 悪い例: 曖昧で情報が不足
it("works", () => {});
it("test user", () => {});
it("error case", () => {});
各テストは他のテストに依存しないこと:
// ✅ 良い例: 各テストが独立
describe("UserService", () => {
let service: UserService;
beforeEach(() => {
service = new UserService(); // 各テストで新しいインスタンス
});
test("test1", () => {
/* 他のテストに依存しない */
});
test("test2", () => {
/* 他のテストに依存しない */
});
});
// ❌ 悪い例: テスト間で状態を共有
let globalUser;
test("create user", () => {
globalUser = createUser();
});
test("update user", () => {
updateUser(globalUser);
}); // 前のテストに依存
ルール:
beforeEach でインスタンスを再作成型安全なモック生成には jest-mock-extended などのライブラリを使用する:
// jest-mock-extended の使用を推奨
import { mock } from "jest-mock-extended";
const mockRepository = mock<IUserRepository>();
テストデータの構築には Builder パターンを使用する:
class UserBuilder {
private user: Partial<User> = {
id: "123",
email: "default@example.com",
name: "Default User",
};
withEmail(email: string): this {
this.user.email = email;
return this;
}
withName(name: string): this {
this.user.name = name;
return this;
}
build(): User {
return this.user as User;
}
}
// 使用例
const user = new UserBuilder().withEmail("custom@example.com").build();
固定のテストデータはフィクスチャファイルで管理する:
// fixtures/users.ts
export const fixtures = {
validUser: {
id: "123",
email: "john@example.com",
name: "John Doe",
role: "user",
createdAt: new Date("2024-01-01"),
},
adminUser: {
id: "456",
email: "admin@example.com",
name: "Admin User",
role: "admin",
createdAt: new Date("2024-01-01"),
},
};
describe ブロックで論理的にグループ化beforeAll でアプリ・DB セットアップafterAll でリソースクリーンアップbeforeEach でデータベース状態をリセットテストは以下の順序で CI パイプラインに組み込む:
テストが失敗した場合、後続のステップは実行しない。
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
プロジェクトガイドラインへの準拠をチェックし、バグ、スタイル違反、コード品質問題を検出する。PRレビュー時に使用。
The English summary is being prepared. Showing the original description.
Enforces project coding standards during code review: naming conventions (PascalCase for classes, camelCase for methods/variables, UPPER_SNAKE_CASE for constants, kebab-case for files), standard file structure, anti-magic-number policy, file size limits (500/800 lines), security patterns, and design patterns. Use when reviewing code, writing new code, or checking adherence to project conventions.
The English summary is being prepared. Showing the original description.
機能を保持したまま不要な複雑性を排除し、コードの簡潔性と可読性を向上させる。30行超の関数や3段以上のネスト検出時に使用。
The English summary is being prepared. Showing the original description.
コードコメントの正確性、完全性、長期的な保守性を分析する。JSDoc、コメント、README等のドキュメントが変更された場合に使用。
The English summary is being prepared. Showing the original description.
サイレント失敗を検出し、堅牢なエラーハンドリングを確保する。PRレビューでのエラーハンドリング検査時に使用。
The English summary is being prepared. Showing the original description.
Enforces error handling standards: silent error prohibition, custom error class hierarchy (AppError base with category never-fallback / transient / permanent, cause preservation, ValidationError / UnauthorizedError / UpstreamError etc. — canonical definitions in ERRORS.md), external-boundary normalization (normalizeExternalError), Result pattern (Result.ok/Result.fail), proper try-catch with error type checking, structured error logging with a single Logger contract, fallback prohibition categories (isNeverFallback), and HTTP status code mapping. Use when implementing error handling, reviewing catch blocks, or designing error responses.
The English summary is being prepared. Showing the original description.