Skip to content

[Setting] #290 - ArchLint 테스트 명세 형식 규칙 추가 및 All Tests Passed 게이트 연결 - #291

Closed
Naknakk wants to merge 13 commits into
developfrom
Setting/#290
Closed

Naknakk wants to merge 13 commits into
developfrom
Setting/#290

Conversation

@Naknakk

@Naknakk Naknakk commented Oct 11, 2026

Copy link
Copy Markdown
Collaborator

💡 Issue


💭 Summary

테스트가 "읽히는 기능 명세"가 되도록, 지금까지 문서 규약(docs/TESTING.md)으로만 있던 형식을 ArchLint 규칙으로 강제해요.

같이 고친 것도 있어요. 실제 필수 체크는 All Tests Passed 하나뿐인데 ArchLint 결과가 거기에 연결돼 있지 않아서, 지금까지는 ArchLint가 실패해도 머지가 막히지 않았어요. 이번에 연결했어요.


🔑 Key Changes

1. ArchLint 규칙⑮ test-spec 추가

  • AI가 구현을 거의 다 쓰는 흐름에서, 사람은 테스트 이름만 읽고 무엇이 검증되는지 알 수 있어야 해요.
  • 그중 문법으로 판정할 수 있는 조건만 기계 검사로 옮겼어요.
심각도 ruleID 조건
error test-suite-required @Test는 @Suite 타입 안에 둔다
error test-suite-name @Suite("한국어 이름") + 타입 이름 …Tests
error test-name-sentence @Test("…다") 보간 없는 한국어 문장(끝 괄호 보충·마침표 허용)
error test-name-slash 표시 이름에 / 금지(XcodeBuildMCP가 스위트 구분자로 읽음)
error test-name-duplicate 같은 파일의 같은 Suite 안에서 표시 이름 중복 금지
warning test-assertion 본문에 #expect/#require가 있다
warning test-func-verb 함수 이름은 3인칭 동사로 시작(rejects… · returns…)
warning test-name-vague 성공적으로·정상적으로·올바르게·제대로 금지
warning test-name-identifier Domain·Feature 표시 이름에 메서드·프로퍼티 이름 금지
  • 적용 모듈 allowlist 방식이에요. Linter.swift의 TestSpecRule(enforcedModules:)에 든 모듈만 검사하고, 나머지 모듈은 아예 보고하지 않아요.
  • 고칠 계획이 없는 경고 수백 건이 CI 로그를 덮지 않게 하려는 거예요.
  • 적용 모듈은 warning까지 0으로 유지해요.
  • 자체 테스트 55개를 추가했어요(TestSpecRuleTests.swift).

2. 파일럿 3개 모듈 정리: NovelReviewDomain · CollectionDomain · AuthDomain

  • @Suite 21개에 한국어 기능 단위 이름을 붙였어요(예: 리뷰 저장, 컬렉션 좋아요, 회원 탈퇴).
  • 함수 이름 81개를 3인칭 동사로 바꿨어요.
  • 메서드 이름이 드러나던 표시 이름 몇 개(markAsLiked · unmarkAsLiked · setPeriod 등)는 동작으로 풀어 썼어요.
  • 본문 로직은 바꾸지 않았어요. 선언 줄만 바뀌었어요.
  • 3개 모듈 테스트 121개 모두 통과했어요(NovelReview 35 · Collection 68 · Auth 18).

3. All Tests Passed 게이트가 ArchLint·swift-format 결과도 판정

  • gate job의 needs에 arch-lint·format-lint를 넣었어요.
  • arch-lint는 success여야 통과해요. 실패·취소·스킵이면 막아요.
  • format-lint는 아직 report-only라 job 자체가 깨질 때만 막아요.

4. 문서

  • docs/TESTING.md: 「기계 검사 — ArchLint test-spec」 절을 추가하고, 예시를 새 규칙에 맞게 고쳤어요. XcodeBuildMCP가 표시 이름 중간의 .에서도 이름을 쪼갠다는 함정도 적었어요.
  • Tooling/ArchLint/README.md: 규칙⑮ 행을 추가하고, CI 절을 gate 판정 기준으로 바꿨어요.
  • docs/WORKFLOW.md · Tooling/SwiftFormat/README.md · docs/TODO.md · test.yml 주석: "Architecture Rules도 필수 체크"라는 사실과 다른 서술을 단일 게이트 기준으로 정정했어요.
  • Projects/Domain/CLAUDE.md: 빠른 요약을 새 형식에 맞췄어요.

📱 Simulation

해당 없음(테스트·툴링·CI 변경)


🧑‍🧒‍🧒 To Reviewer

바뀐 표시 이름을 읽어 주세요

  • 표시 이름을 바꾸는 건 명세 문장을 바꾸는 일이라 사람이 확인해야 해요.
  • 파일럿 3개 모듈 테스트 diff에서 @Test("…") 줄만 훑어보면 돼요.

검사는 형식만 봐요

  • 이름과 본문이 일치하는지, 입력이 헐거워서 무조건 통과하지 않는지는 여전히 리뷰의 몫이에요.

알려진 한계(수용)

  • 파일 단위 검사라서, 다른 파일의 extension에 둔 @Test의 S1과 파일을 넘는 S5 중복은 보지 못해요. 같은 파일 안은 잡아요.
  • 서로 배타적인 #if 분기에 같은 이름의 타입·테스트를 두면 S1·S5 오탐이 나요. 현재 0건이라 README에 한계로만 적었어요.

머지 전 확인할 것

  • 이 PR CI에서 ArchLint를 일부러 깨뜨린 커밋을 올려 All Tests Passed가 실패하는지 확인한 뒤 되돌릴 예정이에요(이슈 완료 기준).

후속 이슈 예정

  • Mock을 protocol 소유 모듈의 ~DomainTesting으로 옮기기(+ Mock Sendable 경고)
  • 테스트 목록을 먼저 합의하고 PR의 새 @Test와 대조하기, PR 본문으로 명세 추출하기
  • TDD 순서 훅

리뷰 수렴

  • wss-pr-reviewer와 Codex CLI를 병렬로 3라운드 돌렸어요.
  • wss-pr-reviewer는 🔴 0 · 🟡 0 · 🔵 0으로 수렴했어요.
  • Codex의 남은 🟡 2건은 위의 #if 분기 한계예요.

※ Reference

  • docs/TESTING.md 「기계 검사 — ArchLint test-spec」
  • Tooling/ArchLint/README.md 규칙⑮

🤖 Generated with Claude Code

Naknakk and others added 11 commits October 11, 2026 01:26
Suite 표시 이름을 한국어 기능 단위로 바꾸고, 테스트 함수 이름을 3인칭 동사로 시작하게 바꿨다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Suite 표시 이름을 한국어 기능 단위로 바꾸고, 테스트 함수 이름을 3인칭 동사로 시작하게 바꿨다.
표시 이름의 코드 식별자(markAsLiked · unmarkAsLiked · notFound · forbidden)를 동작을 설명하는 말로 바꿨다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Suite 표시 이름을 한국어 기능 단위로 바꾸고, 테스트 함수 이름을 3인칭 동사로 시작하게 바꿨다.
표시 이름의 코드 식별자(setPeriod)를 동작을 설명하는 말로 바꿨다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
test-spec 규칙: 적용 모듈(AuthDomain · CollectionDomain · NovelReviewDomain)의 Tests만 검사한다.
구조(S1 ~ S5)는 error, 프록시(단언 · 함수 이름 · 모호어 · 코드 식별자)는 warning. 미적용 모듈은 보고하지 않는다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
필수 체크가 All Tests Passed 하나라 needs에 없던 arch-lint 실패가 머지를 막지 못했다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
TESTING.md에 ArchLint test-spec 검사 절을 두고, 모범 예시를 규칙에 맞게 고쳤다.
XcodeBuildMCP 리포터가 표시 이름 중간의 '.'에서 이름을 쪼개는 것을 주의사항에 남겼다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Architecture Rules · Swift Format을 따로 필수 체크로 건다는 설명이 실제 설정과 달랐다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- 중복 표시 이름 키를 타입 전체 경로로 바꿔 다른 Suite에 중첩된 동명 타입끼리 겹치지 않게 함
- 문장 끝 판정이 "다(보충)."·중첩 괄호도 받도록 마침표 → 짝 맞춘 괄호 → 마침표 순으로 뗌
- 같은 파일에서 @suite 없는 타입을 extension으로 테스트하면 S1으로 잡음
- Linter 주석·README에 실제 동작(미적용 모듈 미보고, S1·S5 파일 단위 범위) 반영

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- TESTING.md 함수명 형식·UseCase 예시를 @suite 안 "…다" 문장으로 고치고 S5 범위를 같은 파일로 명시
- Domain CLAUDE.md 빠른 요약을 새 형식과 현재 CI 동작(.tests 선언 모듈 자동 실행)에 맞춤
- test.yml 상단 주석의 필수 체크를 All Tests Passed 단일 게이트로 정정

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- 직접 멤버 대신 @test를 만난 시점에 감싼 타입 프레임에 표시하고, 타입을 나갈 때 S1을 판정
- extension 경로의 공백을 지워 선언 경로와 맞춤
- Domain CLAUDE.md 요약의 CI 범위를 "PR diff가 영향을 준 모듈"로 정정

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- TODO.md 2절: Swift Format 결과는 이미 All Tests Passed가 판정하므로 --strict만 붙이면 된다고 정정
- ArchLint README ⑮: 배타적 #if 분기를 구분하지 않는 S1·S5 한계를 명시

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Naknakk Naknakk self-assigned this Oct 11, 2026
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

테스트 커버리지 리포트

Module Coverage
AuthData 55.3%
AuthDomain 98.2%
BaseDomain 70.3%
CollectionDomain 98.3%
CollectionFeature 0.0%
CommentData 0.0%
CommentDomain 94.9%
FeedData 62.8%
FeedDomain 98.7%
HomeFeature 0.0%
Keychain 0.0%
LibraryFeature 0.0%
Networking 78.0%
NotificationData 33.9%
NotificationDomain 100.0%
NotificationFeature 0.0%
NovelData 15.4%
NovelDetailFeature 0.0%
NovelDomain 92.9%
NovelReviewData 77.4%
NovelReviewDomain 96.8%
NovelReviewFeature 5.3%
ProfileData 46.1%
ProfileDomain 97.1%
RecommendationData 54.7%
RecommendationDomain 91.7%
SearchData 5.1%
SearchDomain 100.0%
SettingData 31.1%
SettingDomain 99.0%
SocialData 53.4%
SocialDomain 87.5%
SplashData 77.1%
SplashDomain 95.5%
SplashFeature 32.9%

Generated by CI on 2026-10-11 13:42 KST

a2996d96에서 일부러 넣은 @suite("Rating")을 @suite("평점")으로 되돌린다.
검증 결과: 테스트는 통과했지만 Architecture Rules 실패 → All Tests Passed 실패(run 38105582063).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@Naknakk

Naknakk commented Oct 14, 2026

Copy link
Copy Markdown
Collaborator Author

설계를 다시 잡아 새 이슈에서 처음부터 진행하기로 해 폐기합니다.

@Naknakk Naknakk closed this Oct 14, 2026
@Naknakk
Naknakk deleted the Setting/#290 branch October 14, 2026 11:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Setting] ArchLint 테스트 명세 형식 규칙 추가 및 All Tests Passed 게이트 연결

1 participant