unit-test — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited unit-test (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
テスト対象コードの分析からテストケース設計、テストコード実装、テスト実行までを一貫して支援するスキル。
本スキルは以下の方針に基づいてテストを作成する:
[Step 1: プロジェクト構成の把握]
→ [Step 2: テスト対象コードの特定]
→ [Step 3: テストケースの設計]
→ [Step 4: ユーザーにテストケース設計を確認]
→ [Step 5: 作業ブランチの作成]
→ [Step 6: テストコードの実装]
→ [Step 7: テストの実行と品質確認]
→ [Step 8: ユーザーにテストコードを確認]
→ [Step 9: 修正・追加対応]
→ [Step 10: リモートプッシュとPR作成]プロジェクトの言語、フレームワーク、テストフレームワーク、既存のテスト構成を把握する。
# ビルドファイル・設定ファイルからの推定
ls package.json tsconfig.json go.mod go.sum Cargo.toml pom.xml build.gradle build.gradle.kts settings.gradle.kts build.sbt project/build.properties Gemfile requirements.txt pyproject.toml setup.py composer.json pubspec.yaml Makefile 2>/dev/null| 言語 | テストフレームワーク例 | 確認方法 |
|---|---|---|
| Go | testing(標準), testify | go.mod で testify 等の依存を確認 |
| Java/Kotlin | JUnit 5, Mockito, MockK | build.gradle / pom.xml の testImplementation |
| Scala | ScalaTest, Specs2, MUnit | build.sbt の libraryDependencies |
| TypeScript/JavaScript | Jest, Vitest, Mocha | package.json の devDependencies / scripts |
| Python | pytest, unittest | pyproject.toml / requirements.txt / setup.cfg |
| Rust | cargo test(標準) | Cargo.toml |
| Ruby | RSpec, Minitest | Gemfile |
| PHP | PHPUnit | composer.json |
# テストファイルの一覧を取得
# Go
find . -name "*_test.go" -not -path '*/vendor/*' | head -20
# Java/Kotlin/Scala
find . -path "*/test/*" -type f \( -name "*.java" -o -name "*.kt" -o -name "*.scala" \) | head -20
# TypeScript/JavaScript
find . -name "*.test.*" -o -name "*.spec.*" | grep -v node_modules | head -20
# Python
find . -name "test_*.py" -o -name "*_test.py" | grep -v __pycache__ | head -20既存テストのスタイル(命名規則、ディレクトリ配置、ヘルパーの使い方等)を確認し、プロジェクトの慣習に合わせる。
データベースを使用するプロジェクトの場合、以下を確認する:
application-test.yml, .env.test, database_test.go 等)# テスト用設定ファイルの検索
find . -name "*test*" -type f \( -name "*.yml" -o -name "*.yaml" -o -name "*.json" -o -name "*.env" -o -name "*.conf" -o -name "*.properties" \) | grep -v node_modules | grep -v vendor | head -10
# Docker Compose でテスト用DBが定義されているか確認
find . -name "docker-compose*" -type f | head -5テスト用DBが未構成の場合はユーザーに確認し、セットアップ方法を提案する。
ユーザーが指定したコードまたは自動的に検出した対象を分析する。
ユーザーが明示的に指定しない場合、以下の基準で対象を提案する:
git diff / git log ベース)# テストが無いファイルの検出例(Go)
for f in $(find . -name "*.go" -not -name "*_test.go" -not -path '*/vendor/*'); do
test_file="${f%.go}_test.go"
if [ ! -f "$test_file" ]; then
echo "テスト無し: $f"
fi
doneテスト対象のコードを読み込み、以下を分析する:
分析結果に基づき、各依存を以下に分類する:
| 依存の種類 | テスト方法 |
|---|---|
| データベースアクセス | テスト用DBに実際にアクセス |
| 外部APIコール | モック |
| ファイルI/O | モックまたはテスト用一時ファイル |
| 時刻取得 | モック(固定時刻を注入) |
| ランダム値生成 | モック(固定値を注入) |
| 他の内部モジュール | 原則モック(対象の単体テストに集中) |
分析結果に基づき、各関数/メソッドに対するテストケースを設計する。
各関数について以下の観点でテストケースを洗い出す:
#### 正常系(Happy Path)
#### 異常系(Error Path)
#### 境界値
以下の形式でテストケース一覧を作成する:
## テスト対象: <ファイルパス>
### 関数: <関数名>
| # | カテゴリ | テストケース名 | 入力 | 期待結果 | モック/DB |
|---|---------|--------------|------|---------|----------|
| 1 | 正常系 | 有効なユーザーを作成できる | name="John", email="[email protected]" | User オブジェクトが返る | DB |
| 2 | 正常系 | 名前が最大長でも作成できる | name="A"*255, email="[email protected]" | 正常に作成される | DB |
| 3 | 異常系 | メールが空の場合エラー | name="John", email="" | ValidationError | モック |
| 4 | 異常系 | 重複メールの場合エラー | name="John", email="[email protected]" | DuplicateError | DB |
| 5 | 異常系 | DB接続失敗時にエラー | name="John", email="[email protected]" | DBConnectionError | モック |必ずユーザーにテストケース設計を提示し、承認を得てからコード実装に進む。 確認なしに実装を開始してはならない。
以下の形式でユーザーに確認する:
上記のテストケース設計について確認をお願いします。
1. テストケースの追加・削除はありますか?
2. テスト方法(モック/DB)の変更はありますか?
3. その他、修正点はありますか?
問題なければ実装に進みます。ユーザーからのフィードバックがあれば、テストケース設計を修正して再度確認する。
テストケース設計が承認されたら、作業ブランチを作成する。
# 最新の状態を取得
git fetch origin
# 作業ブランチを作成
git checkout -b test/add-unit-tests-<target>-<date><target>: テスト対象の概要(例: user-service, order-usecase)<date>: YYYYMMDD 形式(例: test/add-unit-tests-user-service-20260321)プロジェクトの慣習に従ってテストファイルを配置する:
| 言語 | テストファイル配置 |
|---|---|
| Go | 対象ファイルと同じディレクトリに *_test.go |
| Java/Kotlin | src/test/java/ 配下に同パッケージ構造で配置 |
| Scala | src/test/scala/ 配下に同パッケージ構造で配置 |
| TypeScript/JavaScript | 対象ファイルと同じディレクトリまたは __tests__/ |
| Python | tests/ ディレクトリまたは対象と同じディレクトリ |
DB以外の外部依存(API呼び出し、メール送信、ファイルI/O など)にはモックを使用する。テスト対象の内部依存は原則モック差し替えで単体テストに集中する。
モックが適しているケース:
DBにアクセスするテストでは、通常運用のDBとは別に テスト用DB を用意して実際に接続する。
#### テスト用DB設定の原則
myapp_test)モック / DB テストの具体的なコード例は references/patterns.md を参照する。Go / Java・Kotlin / TypeScript・JavaScript / Python のサンプルを収録している。対象プロジェクトの言語に該当する節のみを読み込み、既存テストのスタイルに合わせてアレンジする。
テストの共通処理は、既存のヘルパーがあればそれに従い、無ければ必要に応じて共通化する。ただし過度な抽象化は避ける。
# Go
go test ./... -v -count=1
# Java/Kotlin
./gradlew test
# または
mvn test
# Scala
sbt test
# TypeScript/JavaScript
npm test
# または
npx jest --verbose
# Python
pytest -v
# Rust
cargo test
# Ruby
bundle exec rspecテストが失敗した場合:
テストが全てパスしたら、ユーザーにテストコードの確認を依頼する。
以下の情報を提示する:
テストコードの実装が完了しました。確認をお願いします。
### 作成したテストファイル
- <ファイルパス1>
- <ファイルパス2>
### テスト実行結果
- 全 XX テスト: XX パス / XX 失敗
### 確認事項
1. テストの内容に問題はありますか?
2. 追加が必要なテストケースはありますか?
3. テストコードのスタイルや命名に修正が必要ですか?
問題なければ、ブランチをリモートにプッシュしてPRを作成します。ユーザーからのフィードバックに基づき:
このステップはユーザーが承認するまで繰り返す。
ユーザーの承認が得られたら、作業ブランチをリモートにプッシュしてPRを作成する。
git add <test-files>
git commit -m "$(cat <<'EOF'
test: <テスト対象>のユニットテストを追加
- 正常系テスト: XX件
- 異常系テスト: XX件
- DB統合テスト: XX件
- モックテスト: XX件
Co-Authored-By: Claude Opus 4.7 <[email protected]>
EOF
)"# リモートにプッシュ
git push -u origin <branch-name>
# PR作成
gh pr create --title "test: <テスト対象>のユニットテストを追加" --body "$(cat <<'EOF'
## Summary
- <テスト対象>に対するユニットテストを追加
- 正常系・異常系の両方をカバー
- DBアクセス部分はテスト用DBを使用した統合テスト
- 外部依存はモックを使用
## Test plan
- [ ] 全テストがCIでパスすること
- [ ] テスト用DB設定が正しいこと
🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"PR作成後、PRのURLをユーザーに報告する。
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.