Imported from xtone/ai_development_tools (
android_development/.claude/skills/android-test-runner/SKILL.md). Install upstream withnpx skills add xtone/ai_development_tools --skill android-test-runner. Copyright stays with the author.
Android Test Runner
Android ãã¹ãå®è¡ãèªååãããã¹ã倱æãåæããå®è¡å¯èœãªä¿®æ£ææ¡ãæäŸãã Claude Code ã¹ãã«ã§ãã
ç®ç
ãã®ã¹ãã«ã¯ Android éçºè ãæ¯æŽããŸã:
- Claude Code ããçŽæ¥ãã¹ããå®è¡
- ãã¹ã倱æã®æ ¹æ¬åå ãèªåçã«åæ
- 倱æãããã¹ãã«å¯Ÿããå ·äœçãªä¿®æ£ææ¡ãååŸ
- ãããã°æéã30%以äžåæž
Quick Reference
æãäžè¬çãªãšã©ãŒ
| ãšã©ãŒã¡ãã»ãŒãž | Pattern | ã¯ã€ãã¯ãã£ãã¯ã¹ |
|---------------|---------|-----------| | Unable to locate a Java Runtime | 6, 12 | export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" |
| Unknown command-line option '--tests' | 5, 11 | ./gradlew :module:testVariantDebugUnitTest |
| No answer found for: (MockK) | 2 | every { mock.method() } returns value |
| No value passed for parameter | 7, 13 | äžè¶³ããŠããã³ã³ã¹ãã©ã¯ã¿ãã©ã¡ãŒã¿ã远å |
| Test not found (Compose UI) | 17 | androidTest/ ã«ç§»å |
| NoSuchElementException (Flow) | 19 | Turbine ã® .test {} ãäœ¿çš |
| expected: X but was: Y | 8, 14 | Mock ããŒã¿ãç¢ºèª |
| CI倱æãããŒã«ã«æå | 16, 18 | ãã¹ãŠã®ããªã¢ã³ãããã¹ã ./gradlew test |
詳现㯠knowledge/test-failure-patterns.md ãåç
§
äœ¿ãæ¹
ãã¹ãå®è¡
User: ãã¹ãŠã®unit testãå®è¡ããŠ
Assistant: [./gradlew test ãå®è¡ãçµæãåæ]
User: UserRepositoryã®ãã¹ããå®è¡ããŠ
Assistant: [./gradlew test --tests "*UserRepositoryTest" ãå®è¡ãçµæãåæ]
倱æåæ
ãã¹ãã倱æãããšããã®ã¹ãã«ã¯èªåçã«:
- ãã¹ãåºåãã°ãè§£æ
- 倱æãã¿ãŒã³ãç¹å®ïŒNullPointerException, Mockèšå®åé¡çïŒ
- ã³ãŒãäŸä»ãã®å ·äœçãªä¿®æ£ææ¡ãæäŸ
ä¿®æ£ææ¡ã®ååŸ
User: LoginViewModelTestã倱æããçç±ã¯?
Assistant: [ãã¹ã倱æãã°ãåæã以äžãæäŸ:
- æ ¹æ¬åå ã®èª¬æ
- é¢é£ããã³ãŒãã¹ãããã
- ã³ãŒãäŸä»ãã®å
·äœçãªä¿®æ£]
System Instructions
ãŠãŒã¶ãŒã Android ãã¹ãã®å®è¡ããã¹ã倱æã®åæããªã¯ãšã¹ãããå Žåã以äžã®æé ã«åŸã£ãŠãã ãã:
0. ç°å¢ã»ããã¢ãã & ãããžã§ã¯ãæ€åºïŒå¿ é - åžžã«æåã«å®è¡ïŒ
ãã¹ããå®è¡ããåã«ãç°å¢ã確èªã»èšå®ããŠãã ãã:
ã¹ããã1: JAVA_HOME 確èª
# JAVA_HOMEãèšå®ãããŠããã確èª
if [ -z "$JAVA_HOME" ]; then
# macOS: Android Studio JBR ãèªåæ€åº
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
fi
# 確èª
$JAVA_HOME/bin/java -version
ãšã©ãŒæ€åº:
- "Unable to locate a Java Runtime" ã衚瀺ãããå Žå â JAVA_HOMEãèšå®ããŠå詊è¡
ã¹ããã2: ãããžã§ã¯ãæ§é æ€åº
# ãã«ãããªã¢ã³ããæ€åºïŒååšããå ŽåïŒ
./gradlew tasks --all | grep "test.*UnitTest"
# åºåäŸïŒmulti-variantãããžã§ã¯ãïŒ:
# :app:testDevelopDebugUnitTest
# :app:testDevelopReleaseUnitTest
# :app:testProductionDebugUnitTest
ãã«ãããªã¢ã³ãæ€åº:
- è€æ°ã®
testXxxDebugUnitTestã¿ã¹ã¯ãååš â ãããžã§ã¯ãã«ãã«ãããªã¢ã³ããã Unknown command-line option '--tests'ãšã©ãŒ â ããªã¢ã³ãåºæã¿ã¹ã¯ã䜿çšããå¿ èŠãã
BuildTypeèªè: æ¬çªãããžã§ã¯ãã«ã¯è€æ°ã®Build Typeãååšããããšãå€ã:
Debug: éåžžã®ãã¹ãå®è¡ïŒæãäžè¬çïŒRelease: ãªãªãŒã¹ãã«ãCiRelease: CIå°çšãªãªãŒã¹ãã«ãMinified: é£èªåãã¹ããã«ã
ç·ããªã¢ã³ãæ° = Product Flavors à Build Types
- äŸ: 4 flavors à 3 build types = 12 variants
- æ¥åžžéçº:
Debugãã«ãã¿ã€ãã®ã¿ãã¹ã - ã³ãããå: ãã¹ãŠã®flavorsã
Debugã§ãã¹ãïŒ./gradlew :module:testDebugïŒ - ãªãªãŒã¹å: ãã¹ãŠã®ããªã¢ã³ãããã¹ãïŒ
./gradlew :module:testïŒ
ã¹ããã3: ãã¹ãã¿ã¹ã¯æ±ºå®
ãã«ãããªã¢ã³ãããã®ãããžã§ã¯ã:
# åäžããªã¢ã³ãïŒæéãã¯ã€ãã¯ãã§ãã¯çšïŒ
./gradlew :module:testVariantDebugUnitTest
# ãã¹ãŠã®ããªã¢ã³ãïŒCIçžåœãã³ãããåæšå¥šïŒ
./gradlew :module:test
ãã«ãããªã¢ã³ããªãã®ãããžã§ã¯ã:
# æšæºã³ãã³ããåäœ
./gradlew test
./gradlew test --tests "*TestClass"
1. ãã¹ãå®è¡ïŒæ¡åŒµçïŒ
BashããŒã«ã䜿çšããŠGradleãã¹ãã³ãã³ããå®è¡ããŠãã ãããéèŠ: åžžã«æåã«JAVA_HOMEãèšå®ããŠãã ããïŒã¹ããã0ããïŒã
ãã¿ãŒã³A: æšæºãããžã§ã¯ãïŒãã«ãããªã¢ã³ããªãïŒ
# ãã¹ãŠã®unit test
./gradlew test
# ç¹å®ã®ãã¹ãã¯ã©ã¹
./gradlew test --tests "*UserRepositoryTest"
# ç¹å®ã®ãã¹ãã¡ãœãã
./gradlew test --tests "*UserRepositoryTest.testGetUser"
# 詳现åºåä»ã
./gradlew test --info
ãã¿ãŒã³B: Multi-Variantãããžã§ã¯ãïŒæ¬çªç°å¢ã§äžè¬çïŒ
# JAVA_HOMEèšå® + åäžããªã¢ã³ããã¹ã
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" && \
./gradlew :module:testVariantDebugUnitTest
# ãã¹ãŠã®ããªã¢ã³ãïŒCIçžåœãã³ãããåæšå¥šïŒ
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" && \
./gradlew :module:test
# ç¹å®ã¢ãžã¥ãŒã«ã®ç¹å®ããªã¢ã³ã
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home" && \
./gradlew :data:testProductionDebugUnitTest
ãšã©ãŒãã³ããªã³ã° & èªåå詊è¡
ãšã©ãŒ1: Unknown command-line option '--tests'
- åå : ãããžã§ã¯ãã«è€æ°ã®ãã«ãããªã¢ã³ããã
- ä¿®æ£: ããªã¢ã³ãåºæã¿ã¹ã¯ã«åãæ¿ã
# ããªã¢ã³ããæ€åº
./gradlew tasks --all | grep "test.*UnitTest"
# ããªã¢ã³ãã¿ã¹ã¯ã䜿çš
./gradlew :module:testVariantDebugUnitTest
ãšã©ãŒ2: Unable to locate a Java Runtime
- åå : JAVA_HOMEæªèšå®
- ä¿®æ£: JAVA_HOMEãèšå®ããŠå詊è¡
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
./gradlew :module:testVariantDebugUnitTest
éèŠ:
- åžžã«ãããžã§ã¯ãã«ãŒããã£ã¬ã¯ããªããå®è¡
- åžžã«Androidãããžã§ã¯ãã§JAVA_HOMEãèšå®
- ãã¹ãã³ãã³ããéžæããåã«ãã«ãããªã¢ã³ããæ€åº
- æšæºåºåãšæšæºãšã©ãŒåºåã®äž¡æ¹ããã£ããã£
- ã³ãããåã«ãã¹ãŠã®ããªã¢ã³ãã®ãã¹ããæšå¥šïŒCIããªãã£ïŒ
2. ãã¹ãçµæã®è§£æ
ãã¹ãå®è¡åŸãåºåãåæ:
æåã€ã³ãžã±ãŒã¿:
- "BUILD SUCCESSFUL"
- "X tests completed, X passed"
倱æã€ã³ãžã±ãŒã¿:
- "BUILD FAILED"
- "X tests completed, X failed"
- åºåäžã®ã¹ã¿ãã¯ãã¬ãŒã¹
æœåº:
- 倱æãããã¹ãã¯ã©ã¹å
- 倱æãããã¹ãã¡ãœããå
- äŸå€ã¿ã€ããšã¡ãã»ãŒãž
- ã¹ã¿ãã¯ãã¬ãŒã¹ã®å Žæ
3. 倱æãã¿ãŒã³åæ
倱æãäžè¬çãªãã¿ãŒã³ãšç
§åïŒå®å
šãªãªã¹ã㯠knowledge/test-failure-patterns.md ãåç
§ïŒ:
äžè¬çãªãã¿ãŒã³:
- Pattern 1: NullPointerException
- Pattern 2: MockK: No Answer Found
- Pattern 3-10: æšæºçãªãã¹ã倱æ
- Pattern 11-16: Multi-variantãããžã§ã¯ãåºæã®åé¡
- Pattern 17-19: é«åºŠãªãã¿ãŒã³ïŒCompose UI, BuildType, FlowïŒ
4. ä¿®æ£ææ¡ã®æäŸ
ã¬ã¹ãã³ã¹ã以äžã®åœ¢åŒã§ãã©ãŒããã:
## ãã¹ã倱æåæ
**倱æãããã¹ã**: `UserRepositoryTest.testGetUser()`
**æ ¹æ¬åå **: MockK mock ã `userApi.getUser()` ã«å¯ŸããŠèšå®ãããŠããªã
**ä¿®æ£æ¹æ³**:
`UserRepositoryTest.kt:45` ã§ãmockèšå®ã远å :
```kotlin
@Before
fun setup() {
every { userApi.getUser() } returns Result.success(mockUser)
}
説æ:
ãã¹ãã userApi.getUser() ãåŒã³åºããŠããŸãããMockKã¯äœãè¿ãã¹ããåãããŸããã
every { ... } returns ... ã䜿çšããŠmockã®åäœãå®çŸ©ããå¿
èŠããããŸãã
### 5. ãã¬ããžåç
§
äžè¬çãªãã¿ãŒã³ã«ã€ããŠã¯ã以äžã®ãã¬ããžãã¡ã€ã«ãåç
§:
- `knowledge/test-failure-patterns.md` - äžè¬çãªAndroidãã¹ã倱æãã¿ãŒã³ïŒ19ãã¿ãŒã³ïŒ
- `knowledge/project-template.md` - ãããžã§ã¯ãåºæã®ã«ã¹ã¿ãã€ãºçšãã³ãã¬ãŒã
- `templates/fix-suggestions.md` - ä¿®æ£ææ¡çšãã³ãã¬ãŒã
## éèŠäºé
- åžžã«ãããžã§ã¯ãã«ãŒãããå®è¡
- ãã°ãæ³šææ·±ãè§£æããŠæ£ç¢ºãªå€±æå Žæãç¹å®
- ãã¡ã€ã«ãã¹ãšè¡çªå·ãæäŸïŒäŸ: `UserRepository.kt:25`ïŒ
- ä¿®æ£ææ¡æã«å®éã®ãã¹ããã¡ã€ã«ããã³ãŒãã¹ãããããå«ãã
- ãã¹ãä¿®æ£ã¯æå°éã§çŠç¹ãçµã£ããã®ã«
- ãããžã§ã¯ãåºæã®ãã¿ãŒã³ã«ã€ããŠã¯ããããžã§ã¯ãåºæã®ãã¬ããžãã¡ã€ã«ãåç
§
## ã«ã¹ã¿ãã€ãº
### ãããžã§ã¯ãåºæçã®äœæ
æå€§ã®ç²ŸåºŠïŒ80% â 98%ïŒãåŸãããã«ããããžã§ã¯ãåºæçãäœæ:
1. ãã®ã¹ãã«ããããžã§ã¯ãã«ã³ããŒ:
```bash
cp -r android-test-runner your-project/.claude/skills/
knowledge/project-specific.mdã以äžã®å 容ã§äœæ:- ãã«ãããªã¢ã³ããšãã«ãã¿ã€ã
- ãããžã§ã¯ãæšæºã®ãã¹ãã©ã€ãã©ãª
- ã¢ãŒããã¯ãã£ãã¿ãŒã³ïŒResultåãFlowåçïŒ
- CI/CDèšå®
- ãããžã§ã¯ãåºæã®äžè¬çãªå€±æãã¿ãŒã³
éçºã¯ãŒã¯ãããŒã«ã€ããŠã¯ ~/.config/claude-code/AI_DEVELOPMENT_GUIDELINES.md ãåç
§ã
æååºæº
- â Gradleçµç±ã§ãã¹ããå®è¡å¯èœ
- â 倱æã®æ ¹æ¬åå ãæ£ç¢ºã«ç¹å®ïŒ70%以äžã®ç²ŸåºŠïŒ
- â å®è¡å¯èœãªä¿®æ£ææ¡ãæäŸ
- â ãããã°æéã30%以äžåæž
äºææ§
Agent Skills (Open Standard)
ãã®ã¹ãã«ã¯ Agent Skills ãªãŒãã³ã¹ã¿ã³ããŒãã«æºæ ããŠããŸãã
察å¿ããŒã«:
- Claude Code â
- GitHub Copilot â
- VS Code â
- Cursor (Nightly) â
- OpenAI Codex â
.claude/skills/ ãã£ã¬ã¯ããªã«é
眮ããããšã§ãäžèšãã¹ãŠã®ããŒã«ã§äœ¿çšå¯èœã§ãã
ããŒãžã§ã³
v1.1 - Agent Skillså¯Ÿå¿ (2025-12-23)
- â Agent Skills ãªãŒãã³ã¹ã¿ã³ããŒãæºæ ã確èª
- â äºææ§ã»ã¯ã·ã§ã³è¿œå
- â è€æ°ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ãã§äœ¿çšå¯èœ
v1.0 - æ±çšçãªãªãŒã¹ (2025-11-20)
- â Pattern 1-19 ãå®è£
- â Multi-variantãããžã§ã¯ããµããŒã
- â JAVA_HOME èªåèšå®
- â Quick Reference 远å
- â å æ¬çãªããã¥ã¡ã³ã
- â ãã¹ãŠã®èª¬æãæ¥æ¬èªã§èšè¿°ïŒèŠèªæ§ã»ã¡ã³ããã³ã¹æ§åäžïŒ
android-test-runner v0.2ïŒãããžã§ã¯ãåºæçã98%粟床ïŒãããŒã¹ã«ããŠããŸã
