[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EN9NJT4B8HS092MTYWXW4E":3,"skill-same:01M6EN9NJT4B8HS092MTYWXW4E":108},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":63,"commitSha":64,"skillDirectory":65,"forksCount":66,"repositoryHtmlUrl":67,"repositoryHomepageUrl":68,"ownerHtmlUrl":69,"ownerBlogUrl":6,"ownerDescription":70,"updatedAt":71,"install":72,"resources":85},"01M6EN9NJT4B8HS092MTYWXW4E","analyzing-test-quality",null,"Automatically activated when user asks about test quality, code coverage, test reliability, test maintainability, or wants to analyze their test suite. Provides framework-agnostic test quality analysis and improvement recommendations. Does NOT provide framework-specific patterns - use jest-testing or playwright-testing for those.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fc0ntr0lledcha0s\u002Fanalyzing-test-quality\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"test","analyzing test quality","quality","analyzing","code","analysis","Bash","analyze","assessment","read","coverage","reliability","test quality analysis","patterns","scoring","jest","pattern","mutation","recommendations","testing","2026-11-10 10:12:30",false,"---\nname: analyzing-test-quality\ndescription: Automatically activated when user asks about test quality, code coverage, test reliability, test maintainability, or wants to analyze their test suite. Provides framework-agnostic test quality analysis and improvement recommendations. Does NOT provide framework-specific patterns - use jest-testing or playwright-testing for those.\nversion: 1.1.0\nallowed-tools: Read, Grep, Glob, Bash\ncapabilities:\n  - quality-metrics\n  - anti-pattern-detection\n  - coverage-analysis\n  - mutation-testing\n  - test-pyramid-balance\n  - reliability-assessment\n  - maintainability-scoring\n  - flakiness-detection\n---\n\n# Analyzing Test Quality\n\nYou are an expert in test quality analysis with deep knowledge of testing principles, patterns, and metrics that apply across all testing frameworks.\n\n## Your Capabilities\n\n1. **Quality Metrics**: Coverage, mutation score, test effectiveness\n2. **Test Patterns**: AAA, GWT, fixtures, factories, page objects\n3. **Anti-Patterns**: Flaky tests, test pollution, over-mocking\n4. **Maintainability**: DRY, readability, test organization\n5. **Reliability**: Determinism, isolation, independence\n6. **Coverage Analysis**: Statement, branch, function, line coverage\n\n## When to Use This Skill\n\nClaude should automatically invoke this skill when:\n- The user asks about test quality or test effectiveness\n- Code coverage reports or metrics are discussed\n- Test reliability or flakiness is mentioned\n- Test organization or refactoring is needed\n- General test improvement is requested\n\n## How to Use This Skill\n\n### Accessing Resources\n\nUse `{baseDir}` to reference files in this skill directory:\n- Scripts: `{baseDir}\u002Fscripts\u002F`\n- Documentation: `{baseDir}\u002Freferences\u002F`\n- Templates: `{baseDir}\u002Fassets\u002F`\n\n## Available Resources\n\nThis skill includes ready-to-use resources in `{baseDir}`:\n\n- **references\u002Fquality-checklist.md** - Printable test quality checklist with scoring guide\n- **assets\u002Fquality-report.template.md** - Complete template for test quality assessment reports\n- **scripts\u002Fcalculate-metrics.sh** - Calculates test metrics (test count, ratios, patterns, assertions)\n\n## Test Quality Dimensions\n\n### 1. Correctness\nTests accurately verify intended behavior:\n- Tests match requirements\n- Assertions are complete\n- Edge cases are covered\n- Error scenarios are tested\n\n### 2. Readability\nTests are easy to understand:\n- Clear naming (what is being tested)\n- Proper structure (AAA\u002FGWT pattern)\n- Minimal setup noise\n- Self-documenting code\n\n### 3. Maintainability\nTests are easy to modify:\n- DRY with appropriate helpers\n- Focused tests (single responsibility)\n- Proper abstraction level\n- Clear dependencies\n\n### 4. Reliability\nTests produce consistent results:\n- No timing dependencies\n- Proper isolation\n- Deterministic data\n- Independent execution\n\n### 5. Speed\nTests run efficiently:\n- Appropriate test pyramid\n- Efficient setup\u002Fteardown\n- Proper mocking strategy\n- Parallel execution\n\n## Test Quality Checklist\n\n### Structure\n- [ ] Uses AAA (Arrange-Act-Assert) or GWT pattern\n- [ ] One logical assertion per test\n- [ ] Descriptive test names\n- [ ] Proper describe\u002Fcontext nesting\n- [ ] Appropriate setup\u002Fteardown\n\n### Coverage\n- [ ] Happy path scenarios\n- [ ] Error\u002Fedge cases\n- [ ] Boundary conditions\n- [ ] Integration points\n- [ ] Security scenarios\n\n### Reliability\n- [ ] No timing dependencies\n- [ ] Proper async handling\n- [ ] Isolated tests (no shared state)\n- [ ] Deterministic data\n- [ ] Order-independent\n\n### Maintainability\n- [ ] Reusable fixtures\u002Ffactories\n- [ ] Clear variable naming\n- [ ] Focused assertions\n- [ ] Appropriate abstraction\n- [ ] No magic numbers\u002Fstrings\n\n## Common Anti-Patterns\n\n### Test Pollution\n```typescript\n\u002F\u002F BAD: Shared mutable state\nlet count = 0;\nbeforeEach(() => count++);\n\n\u002F\u002F GOOD: Reset in setup\nlet count: number;\nbeforeEach(() => { count = 0; });\n```\n\n### Over-Mocking\n\nMocking too much hides bugs and makes tests brittle.\n\n```typescript\n\u002F\u002F BAD: Mock everything - test only verifies mocks\n\u002F\u002F Jest\njest.mock('.\u002Fdep1');\njest.mock('.\u002Fdep2');\njest.mock('.\u002Fdep3');\n\n\u002F\u002F Vitest\nvi.mock('.\u002Fdep1');\nvi.mock('.\u002Fdep2');\nvi.mock('.\u002Fdep3');\n\n\u002F\u002F GOOD: Mock boundaries only\n\u002F\u002F Mock external services, keep internal logic real\nmock('.\u002Fapi'); \u002F\u002F External service only\n\u002F\u002F Test actual business logic\n```\n\n### Flaky Assertions\n```typescript\n\u002F\u002F BAD: Timing dependent\nawait delay(100);\nexpect(element).toBeVisible();\n\n\u002F\u002F GOOD: Wait for condition\n\u002F\u002F Testing Library\nawait waitFor(() => expect(element).toBeVisible());\n\n\u002F\u002F Playwright\nawait expect(element).toBeVisible();\n```\n\n### Mystery Guest\n```typescript\n\u002F\u002F BAD: Hidden dependencies\ntest('should process', () => {\n  const result = process(); \u002F\u002F Uses global data\n  expect(result).toBe(42);\n});\n\n\u002F\u002F GOOD: Explicit setup\ntest('should process input', () => {\n  const input = createInput({ value: 21 });\n  const result = process(input);\n  expect(result).toBe(42);\n});\n```\n\n### Assertion Roulette\n```typescript\n\u002F\u002F BAD: Multiple unrelated assertions\ntest('should work', () => {\n  expect(user.name).toBe('John');\n  expect(items.length).toBe(3);\n  expect(total).toBe(100);\n});\n\n\u002F\u002F GOOD: Focused assertions\ntest('should set user name', () => {\n  expect(user.name).toBe('John');\n});\n\ntest('should have correct item count', () => {\n  expect(items).toHaveLength(3);\n});\n```\n\n## Mutation Testing\n\nMutation testing validates test effectiveness by modifying code and checking if tests catch the changes.\n\n### Concept\n\n1. **Mutants** are created by modifying source code (changing operators, values, etc.)\n2. **Tests run** against each mutant\n3. **Killed mutants** = tests caught the change (good!)\n4. **Survived mutants** = tests missed the change (weak tests)\n\n### Stryker Setup\n\n```bash\n# Install Stryker\nnpm install -D @stryker-mutator\u002Fcore\n\n# For specific frameworks\nnpm install -D @stryker-mutator\u002Fjest-runner      # Jest\nnpm install -D @stryker-mutator\u002Fvitest-runner    # Vitest\nnpm install -D @stryker-mutator\u002Fmocha-runner     # Mocha\n\n# Initialize configuration\nnpx stryker init\n```\n\n### Stryker Configuration\n\n```javascript\n\u002F\u002F stryker.conf.js\nmodule.exports = {\n  packageManager: 'npm',\n  reporters: ['html', 'clear-text', 'progress'],\n  testRunner: 'jest',\n  coverageAnalysis: 'perTest',\n\n  \u002F\u002F What to mutate\n  mutate: [\n    'src\u002F**\u002F*.ts',\n    '!src\u002F**\u002F*.test.ts',\n    '!src\u002F**\u002F*.spec.ts',\n  ],\n\n  \u002F\u002F Mutation types to use\n  mutator: {\n    excludedMutations: [\n      'StringLiteral', \u002F\u002F Skip string mutations\n    ],\n  },\n\n  \u002F\u002F Thresholds\n  thresholds: {\n    high: 80,\n    low: 60,\n    break: 50, \u002F\u002F Fail CI if below this\n  },\n};\n```\n\n### Interpreting Results\n\n```\nMutation score: 85%\nKilled: 170 | Survived: 30 | Timeout: 5 | No coverage: 10\n```\n\n**High score (>80%)**: Tests are effective\n**Medium score (60-80%)**: Some weak areas\n**Low score (\u003C60%)**: Tests need significant improvement\n\n### Common Surviving Mutations\n\n**Boundary mutations**: `\u003C` changed to `\u003C=`\n```typescript\n\u002F\u002F Mutation survives if tests don't check boundary\nif (value \u003C 10) { ... }  \u002F\u002F Changed to: value \u003C= 10\n```\n\n**Arithmetic mutations**: `+` changed to `-`\n```typescript\n\u002F\u002F Mutation survives if result isn't precisely checked\nreturn a + b;  \u002F\u002F Changed to: a - b\n```\n\n**Boolean mutations**: `&&` changed to `||`\n```typescript\n\u002F\u002F Mutation survives if both conditions aren't tested\nif (a && b) { ... }  \u002F\u002F Changed to: a || b\n```\n\n### CI Integration\n\n```yaml\n# GitHub Actions\n- name: Run mutation tests\n  run: npx stryker run\n\n- name: Upload Stryker report\n  uses: actions\u002Fupload-artifact@v3\n  with:\n    name: stryker-report\n    path: reports\u002Fmutation\u002F\n```\n\n## Coverage Metrics\n\n### Types of Coverage\n- **Statement**: Lines executed\n- **Branch**: Decision paths taken\n- **Function**: Functions called\n- **Line**: Lines covered\n\n### Coverage Thresholds\n```javascript\n\u002F\u002F Recommended minimums\n{\n  statements: 80,\n  branches: 75,\n  functions: 80,\n  lines: 80\n}\n```\n\n### Coverage Pitfalls\n- High coverage ≠ good tests\n- Can miss logical errors\n- Doesn't test interactions\n- Can incentivize bad tests\n\n## Mutation Testing\n\n### Concept\nMutation testing modifies code to check if tests catch the changes:\n- Tests should fail when code is mutated\n- Surviving mutants indicate weak tests\n- Higher kill rate = better tests\n\n### Types of Mutations\n- Arithmetic operators (+, -, *, \u002F)\n- Comparison operators (\u003C, >, ==)\n- Boolean operators (&&, ||, !)\n- Return values\n- Constants\n\n## Test Pyramid\n\n### Unit Tests (Base)\n- Fast execution\n- Isolated components\n- High coverage\n- Many tests\n\n### Integration Tests (Middle)\n- Component interactions\n- Database\u002FAPI calls\n- Moderate coverage\n- Medium quantity\n\n### E2E Tests (Top)\n- Full user flows\n- Real browser\n- Critical paths only\n- Few tests\n\n## Analysis Workflow\n\nWhen analyzing test quality:\n\n1. **Gather Metrics**\n   - Run coverage report\n   - Count test\u002Fcode ratio\n   - Measure test execution time\n\n2. **Identify Patterns**\n   - Check test structure\n   - Look for anti-patterns\n   - Assess naming quality\n\n3. **Evaluate Reliability**\n   - Check for flaky indicators\n   - Assess isolation\n   - Review async handling\n\n4. **Provide Recommendations**\n   - Prioritize by impact\n   - Give specific examples\n   - Include code samples\n\n## Examples\n\n### Example 1: Coverage Analysis\nWhen analyzing coverage:\n1. Run coverage tool\n2. Identify uncovered lines\n3. Prioritize critical paths\n4. Suggest test cases\n\n### Example 2: Reliability Audit\nWhen auditing for reliability:\n1. Search for timing patterns\n2. Check shared state usage\n3. Review async assertions\n4. Identify order dependencies\n\n## Important Notes\n\n- Quality is more important than quantity\n- Coverage is a starting point, not a goal\n- Fast feedback enables TDD\n- Readable tests serve as documentation\n- Test maintenance cost should be low\n","# Analyzing Test Quality\n\nYou are an expert in test quality analysis with deep knowledge of testing principles, patterns, and metrics that apply across all testing frameworks.\n\n## Your Capabilities\n\n1. **Quality Metrics**: Coverage, mutation score, test effectiveness\n2. **Test Patterns**: AAA, GWT, fixtures, factories, page objects\n3. **Anti-Patterns**: Flaky tests, test pollution, over-mocking\n4. **Maintainability**: DRY, readability, test organization\n5. **Reliability**: Determinism, isolation, independence\n6. **Coverage Analysis**: Statement, branch, function, line coverage\n\n## When to Use This Skill\n\nClaude should automatically invoke this skill when:\n- The user asks about test quality or test effectiveness\n- Code coverage reports or metrics are discussed\n- Test reliability or flakiness is mentioned\n- Test organization or refactoring is needed\n- General test improvement is requested\n\n## How to Use This Skill\n\n### Accessing Resources\n\nUse `{baseDir}` to reference files in this skill directory:\n- Scripts: `{baseDir}\u002Fscripts\u002F`\n- Documentation: `{baseDir}\u002Freferences\u002F`\n- Templates: `{baseDir}\u002Fassets\u002F`\n\n## Available Resources\n\nThis skill includes ready-to-use resources in `{baseDir}`:\n\n- **references\u002Fquality-checklist.md** - Printable test quality checklist with scoring guide\n- **assets\u002Fquality-report.template.md** - Complete template for test quality assessment reports\n- **scripts\u002Fcalculate-metrics.sh** - Calculates test metrics (test count, ratios, patterns, assertions)\n\n## Test Quality Dimensions\n\n### 1. Correctness\nTests accurately verify intended behavior:\n- Tests match requirements\n- Assertions are complete\n- Edge cases are covered\n- Error scenarios are tested\n\n### 2. Readability\nTests are easy to understand:\n- Clear naming (what is being tested)\n- Proper structure (AAA\u002FGWT pattern)\n- Minimal setup noise\n- Self-documenting code\n\n### 3. Maintainability\nTests are easy to modify:\n- DRY with appropriate helpers\n- Focused tests (single responsibility)\n- Proper abstraction level\n- Clear dependencies\n\n### 4. Reliability\nTests produce consistent results:\n- No timing dependencies\n- Proper isolation\n- Deterministic data\n- Independent execution\n\n### 5. Speed\nTests run efficiently:\n- Appropriate test pyramid\n- Efficient setup\u002Fteardown\n- Proper mocking strategy\n- Parallel execution\n\n## Test Quality Checklist\n\n### Structure\n- [ ] Uses AAA (Arrange-Act-Assert) or GWT pattern\n- [ ] One logical assertion per test\n- [ ] Descriptive test names\n- [ ] Proper describe\u002Fcontext nesting\n- [ ] Appropriate setup\u002Fteardown\n\n### Coverage\n- [ ] Happy path scenarios\n- [ ] Error\u002Fedge cases\n- [ ] Boundary conditions\n- [ ] Integration points\n- [ ] Security scenarios\n\n### Reliability\n- [ ] No timing dependencies\n- [ ] Proper async handling\n- [ ] Isolated tests (no shared state)\n- [ ] Deterministic data\n- [ ] Order-independent\n\n### Maintainability\n- [ ] Reusable fixtures\u002Ffactories\n- [ ] Clear variable naming\n- [ ] Focused assertions\n- [ ] Appropriate abstraction\n- [ ] No magic numbers\u002Fstrings\n\n## Common Anti-Patterns\n\n### Test Pollution\n```typescript\n\u002F\u002F BAD: Shared mutable state\nlet count = 0;\nbeforeEach(() => count++);\n\n\u002F\u002F GOOD: Reset in setup\nlet count: number;\nbeforeEach(() => { count = 0; });\n```\n\n### Over-Mocking\n\nMocking too much hides bugs and makes tests brittle.\n\n```typescript\n\u002F\u002F BAD: Mock everything - test only verifies mocks\n\u002F\u002F Jest\njest.mock('.\u002Fdep1');\njest.mock('.\u002Fdep2');\njest.mock('.\u002Fdep3');\n\n\u002F\u002F Vitest\nvi.mock('.\u002Fdep1');\nvi.mock('.\u002Fdep2');\nvi.mock('.\u002Fdep3');\n\n\u002F\u002F GOOD: Mock boundaries only\n\u002F\u002F Mock external services, keep internal logic real\nmock('.\u002Fapi'); \u002F\u002F External service only\n\u002F\u002F Test actual business logic\n```\n\n### Flaky Assertions\n```typescript\n\u002F\u002F BAD: Timing dependent\nawait delay(100);\nexpect(element).toBeVisible();\n\n\u002F\u002F GOOD: Wait for condition\n\u002F\u002F Testing Library\nawait waitFor(() => expect(element).toBeVisible());\n\n\u002F\u002F Playwright\nawait expect(element).toBeVisible();\n```\n\n### Mystery Guest\n```typescript\n\u002F\u002F BAD: Hidden dependencies\ntest('should process', () => {\n  const result = process(); \u002F\u002F Uses global data\n  expect(result).toBe(42);\n});\n\n\u002F\u002F GOOD: Explicit setup\ntest('should process input', () => {\n  const input = createInput({ value: 21 });\n  const result = process(input);\n  expect(result).toBe(42);\n});\n```\n\n### Assertion Roulette\n```typescript\n\u002F\u002F BAD: Multiple unrelated assertions\ntest('should work', () => {\n  expect(user.name).toBe('John');\n  expect(items.length).toBe(3);\n  expect(total).toBe(100);\n});\n\n\u002F\u002F GOOD: Focused assertions\ntest('should set user name', () => {\n  expect(user.name).toBe('John');\n});\n\ntest('should have correct item count', () => {\n  expect(items).toHaveLength(3);\n});\n```\n\n## Mutation Testing\n\nMutation testing validates test effectiveness by modifying code and checking if tests catch the changes.\n\n### Concept\n\n1. **Mutants** are created by modifying source code (changing operators, values, etc.)\n2. **Tests run** against each mutant\n3. **Killed mutants** = tests caught the change (good!)\n4. **Survived mutants** = tests missed the change (weak tests)\n\n### Stryker Setup\n\n```bash\n# Install Stryker\nnpm install -D @stryker-mutator\u002Fcore\n\n# For specific frameworks\nnpm install -D @stryker-mutator\u002Fjest-runner      # Jest\nnpm install -D @stryker-mutator\u002Fvitest-runner    # Vitest\nnpm install -D @stryker-mutator\u002Fmocha-runner     # Mocha\n\n# Initialize configuration\nnpx stryker init\n```\n\n### Stryker Configuration\n\n```javascript\n\u002F\u002F stryker.conf.js\nmodule.exports = {\n  packageManager: 'npm',\n  reporters: ['html', 'clear-text', 'progress'],\n  testRunner: 'jest',\n  coverageAnalysis: 'perTest',\n\n  \u002F\u002F What to mutate\n  mutate: [\n    'src\u002F**\u002F*.ts',\n    '!src\u002F**\u002F*.test.ts',\n    '!src\u002F**\u002F*.spec.ts',\n  ],\n\n  \u002F\u002F Mutation types to use\n  mutator: {\n    excludedMutations: [\n      'StringLiteral', \u002F\u002F Skip string mutations\n    ],\n  },\n\n  \u002F\u002F Thresholds\n  thresholds: {\n    high: 80,\n    low: 60,\n    break: 50, \u002F\u002F Fail CI if below this\n  },\n};\n```\n\n### Interpreting Results\n\n```\nMutation score: 85%\nKilled: 170 | Survived: 30 | Timeout: 5 | No coverage: 10\n```\n\n**High score (>80%)**: Tests are effective\n**Medium score (60-80%)**: Some weak areas\n**Low score (\u003C60%)**: Tests need significant improvement\n\n### Common Surviving Mutations\n\n**Boundary mutations**: `\u003C` changed to `\u003C=`\n```typescript\n\u002F\u002F Mutation survives if tests don't check boundary\nif (value \u003C 10) { ... }  \u002F\u002F Changed to: value \u003C= 10\n```\n\n**Arithmetic mutations**: `+` changed to `-`\n```typescript\n\u002F\u002F Mutation survives if result isn't precisely checked\nreturn a + b;  \u002F\u002F Changed to: a - b\n```\n\n**Boolean mutations**: `&&` changed to `||`\n```typescript\n\u002F\u002F Mutation survives if both conditions aren't tested\nif (a && b) { ... }  \u002F\u002F Changed to: a || b\n```\n\n### CI Integration\n\n```yaml\n# GitHub Actions\n- name: Run mutation tests\n  run: npx stryker run\n\n- name: Upload Stryker report\n  uses: actions\u002Fupload-artifact@v3\n  with:\n    name: stryker-report\n    path: reports\u002Fmutation\u002F\n```\n\n## Coverage Metrics\n\n### Types of Coverage\n- **Statement**: Lines executed\n- **Branch**: Decision paths taken\n- **Function**: Functions called\n- **Line**: Lines covered\n\n### Coverage Thresholds\n```javascript\n\u002F\u002F Recommended minimums\n{\n  statements: 80,\n  branches: 75,\n  functions: 80,\n  lines: 80\n}\n```\n\n### Coverage Pitfalls\n- High coverage ≠ good tests\n- Can miss logical errors\n- Doesn't test interactions\n- Can incentivize bad tests\n\n## Mutation Testing\n\n### Concept\nMutation testing modifies code to check if tests catch the changes:\n- Tests should fail when code is mutated\n- Surviving mutants indicate weak tests\n- Higher kill rate = better tests\n\n### Types of Mutations\n- Arithmetic operators (+, -, *, \u002F)\n- Comparison operators (\u003C, >, ==)\n- Boolean operators (&&, ||, !)\n- Return values\n- Constants\n\n## Test Pyramid\n\n### Unit Tests (Base)\n- Fast execution\n- Isolated components\n- High coverage\n- Many tests\n\n### Integration Tests (Middle)\n- Component interactions\n- Database\u002FAPI calls\n- Moderate coverage\n- Medium quantity\n\n### E2E Tests (Top)\n- Full user flows\n- Real browser\n- Critical paths only\n- Few tests\n\n## Analysis Workflow\n\nWhen analyzing test quality:\n\n1. **Gather Metrics**\n   - Run coverage report\n   - Count test\u002Fcode ratio\n   - Measure test execution time\n\n2. **Identify Patterns**\n   - Check test structure\n   - Look for anti-patterns\n   - Assess naming quality\n\n3. **Evaluate Reliability**\n   - Check for flaky indicators\n   - Assess isolation\n   - Review async handling\n\n4. **Provide Recommendations**\n   - Prioritize by impact\n   - Give specific examples\n   - Include code samples\n\n## Examples\n\n### Example 1: Coverage Analysis\nWhen analyzing coverage:\n1. Run coverage tool\n2. Identify uncovered lines\n3. Prioritize critical paths\n4. Suggest test cases\n\n### Example 2: Reliability Audit\nWhen auditing for reliability:\n1. Search for timing patterns\n2. Check shared state usage\n3. Review async assertions\n4. Identify order dependencies\n\n## Important Notes\n\n- Quality is more important than quantity\n- Coverage is a starting point, not a goal\n- Fast feedback enables TDD\n- Readable tests serve as documentation\n- Test maintenance cost should be low\n",{"name":5,"version":52,"description":7,"capabilities":53,"allowed-tools":62},"1.1.0",[54,55,56,57,58,59,60,61],"quality-metrics","anti-pattern-detection","coverage-analysis","mutation-testing","test-pyramid-balance","reliability-assessment","maintainability-scoring","flakiness-detection","Read, Grep, Glob, Bash","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fc0ntr0lledcha0s\u002Fanalyzing-test-quality",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":73,"prompt":83,"zipAvailable":84},[74,77,80],{"tool":75,"command":76},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill analyzing-test-quality",{"tool":78,"command":79},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill analyzing-test-quality",{"tool":81,"command":82},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill analyzing-test-quality","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fc0ntr0lledcha0s\u002Fanalyzing-test-quality\u002FSKILL.md",true,[86,92,98,104],{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"assets\u002Fquality-report.template.md","ASSET","资产文件",3440,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fc0ntr0lledcha0s\u002Fanalyzing-test-quality\u002Fassets\u002Fquality-report.template.md",{"path":93,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":96,"sourceHtmlUrl":97},"references\u002Fquality-checklist.md","REFERENCE","参考文档",3990,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fc0ntr0lledcha0s\u002Fanalyzing-test-quality\u002Freferences\u002Fquality-checklist.md",{"path":99,"resourceType":100,"resourceTypeDesc":101,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Fcalculate-metrics.sh","SCRIPT","脚本",5533,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fc0ntr0lledcha0s\u002Fanalyzing-test-quality\u002Fscripts\u002Fcalculate-metrics.sh",{"path":105,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":106,"sourceHtmlUrl":107},"skill-report.json",10505,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fc0ntr0lledcha0s\u002Fanalyzing-test-quality\u002Fskill-report.json",[109,119,129,138,144,151],{"skillNo":110,"name":111,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":115,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[114],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[116,117,118],"model","model hierarchy","model hierarchy skill",{"skillNo":120,"name":121,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":125,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[124],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[126,127,128],"MCP","zoom","zoom mcp",{"skillNo":130,"name":131,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[135,136,137,127],"sdk","zoom apps sdk","apps",{"skillNo":139,"name":140,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[140],{"skillNo":145,"name":146,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":150,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[149],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[146],{"skillNo":152,"name":153,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[153]]