スキル一覧に戻る
cliftonc

analyzing-unit-tests

by cliftonc

Claude skills to deeply analyse and document a legacy codebase to rebuild with AI

6🍴 0📅 2026年1月22日
GitHubで見るManusで実行

SKILL.md


name: analyzing-unit-tests description: Use when analyzing unit test coverage, patterns, and test code for isolated component testing allowed-tools:

  • Read
  • Grep
  • Glob
  • Bash(mkdir:, ls:)
  • Write(docs/unwind/**)
  • Edit(docs/unwind/**)

Analyzing Unit Tests

Output: docs/unwind/layers/unit-tests/ (folder with index.md + section files)

Principles: See analysis-principles.md - completeness, machine-readable, link to source, no commentary, incremental writes.

Output Structure

docs/unwind/layers/unit-tests/
├── index.md           # Test summary, coverage overview
├── service-tests.md   # Service layer tests
├── domain-tests.md    # Domain/entity tests
├── utilities.md       # Test utilities, factories
└── coverage-gaps.md   # Classes without tests

For large codebases (50+ test files), split by domain:

docs/unwind/layers/unit-tests/
├── index.md
├── users-tests.md
├── orders-tests.md
└── ...

Process (Incremental Writes)

Step 1: Setup

mkdir -p docs/unwind/layers/unit-tests/

Write initial index.md:

# Unit Tests

## Sections
- [Service Tests](service-tests.md) - _pending_
- [Domain Tests](domain-tests.md) - _pending_
- [Test Utilities](utilities.md) - _pending_
- [Coverage Gaps](coverage-gaps.md) - _pending_

## Summary
_Analysis in progress..._

Step 2: Analyze and write service-tests.md

  1. Find all service layer tests
  2. Include actual test code showing what is tested
  3. Write service-tests.md immediately
  4. Update index.md

Step 3: Analyze and write domain-tests.md

  1. Find all domain/entity tests
  2. Write domain-tests.md immediately
  3. Update index.md

Step 4: Analyze and write utilities.md

  1. Find test utilities, factories, mocks
  2. Write utilities.md immediately
  3. Update index.md

Step 5: Analyze and write coverage-gaps.md

  1. Identify classes without tests
  2. Write coverage-gaps.md immediately
  3. Update index.md

Step 6: Finalize index.md Add coverage summary table

Output Format

# Unit Tests

## Configuration

[pom.xml test dependencies](https://github.com/owner/repo/blob/main/pom.xml#L50-L70)

```xml
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.9.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>5.0.0</version>
    <scope>test</scope>
</dependency>

Test Summary

LayerClassesTestedCoverage
Service121083%
Domain88100%
Repository6467%

Service Tests

UserServiceTest

UserServiceTest.java

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @Mock
    private PasswordEncoder passwordEncoder;

    @InjectMocks
    private UserService userService;

    @Test
    void createUser_success() {
        CreateUserRequest request = new CreateUserRequest("test@example.com", "password", "Test");
        when(userRepository.existsByEmail(request.email())).thenReturn(false);
        when(passwordEncoder.encode(request.password())).thenReturn("encoded");
        when(userRepository.save(any())).thenAnswer(inv -> inv.getArgument(0));

        User result = userService.createUser(request);

        assertThat(result.getEmail()).isEqualTo("test@example.com");
        verify(userRepository).save(any());
    }

    @Test
    void createUser_duplicateEmail_throws() {
        CreateUserRequest request = new CreateUserRequest("existing@example.com", "password", "Test");
        when(userRepository.existsByEmail(request.email())).thenReturn(true);

        assertThrows(DuplicateEmailException.class, () -> userService.createUser(request));
    }
}

Tests: createUser_success, createUser_duplicateEmail_throws, getUser_success, getUser_notFound_throws

[Continue for ALL test classes...]

Domain Tests

UserTest

UserTest.java

class UserTest {

    @Test
    void suspend_activeUser_setsSuspended() {
        User user = new User("test@example.com", "hash");
        user.setStatus(UserStatus.ACTIVE);

        user.suspend();

        assertThat(user.getStatus()).isEqualTo(UserStatus.SUSPENDED);
    }

    @Test
    void suspend_deletedUser_throws() {
        User user = new User("test@example.com", "hash");
        user.setStatus(UserStatus.DELETED);

        assertThrows(IllegalStateException.class, () -> user.suspend());
    }
}

Test Utilities

TestDataFactory

TestDataFactory.java

public class TestDataFactory {
    public static User createUser() {
        return new User("test@example.com", "encodedPassword");
    }

    public static Order createOrder(User user) {
        Order order = new Order(user);
        order.addItem(createProduct(), 2);
        return order;
    }
}

Coverage Gaps

Classes without unit tests:

  • PaymentService
  • NotificationService
  • LegacyOrderAdapter

Unknowns

  • [List anything unclear]

## Refresh Mode

If `docs/unwind/layers/unit-tests/` exists, compare current state and add `## Changes Since Last Review` section to `index.md`.

スコア

総合スコア

55/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

0/5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です