117 lines
4.4 KiB
Markdown
117 lines
4.4 KiB
Markdown
# build-test-style
|
|
|
|
`SodaLive` 저장소에서 빌드, 테스트, 린트, 코드 스타일 관련 세부 규칙을 정리한 문서다.
|
|
|
|
## 저장소 범위 보충
|
|
- 추측하지 말고 근거 파일(`settings.gradle`, `build.gradle`, `app/build.gradle`, 소스 코드)을 읽고 결정한다.
|
|
|
|
## 빌드 / 린트 / 테스트 명령
|
|
기본 실행 형태:
|
|
```bash
|
|
./gradlew <task>
|
|
```
|
|
|
|
빌드:
|
|
```bash
|
|
./gradlew clean
|
|
./gradlew :app:assembleDebug
|
|
./gradlew :app:assembleRelease
|
|
./gradlew :app:build
|
|
./gradlew :app:check
|
|
```
|
|
|
|
린트/포맷:
|
|
```bash
|
|
./gradlew :app:lint
|
|
./gradlew :app:lintDebug
|
|
./gradlew :app:lintRelease
|
|
./gradlew :app:ktlintCheck
|
|
./gradlew :app:ktlintFormat
|
|
```
|
|
|
|
테스트:
|
|
```bash
|
|
./gradlew :app:test
|
|
./gradlew :app:testDebugUnitTest
|
|
./gradlew :app:testReleaseUnitTest
|
|
./gradlew :app:connectedDebugAndroidTest
|
|
```
|
|
|
|
주의:
|
|
- `:app:connectedDebugAndroidTest`는 기기/에뮬레이터 연결이 필요하다.
|
|
- `app/build.gradle`에 `lint { checkReleaseBuilds false }`가 있어 릴리스 린트는 `:app:lintRelease`를 명시 실행해야 한다.
|
|
- 현재 `app/src/androidTest`에는 테스트 소스가 없으므로 계측 테스트 명령은 신규 테스트 추가 시 사용한다.
|
|
|
|
### 1) 단일 테스트 실행 (중요)
|
|
로컬 단위 테스트(`app/src/test`)는 `--tests` 필터를 사용한다.
|
|
|
|
클래스 단위:
|
|
```bash
|
|
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.chat.talk.room.ChatRepositoryTest"
|
|
```
|
|
|
|
메서드 단위:
|
|
```bash
|
|
./gradlew :app:testDebugUnitTest --tests "kr.co.vividnext.sodalive.chat.talk.room.ChatRepositoryTest.enterChatRoom inserts messages and returns response"
|
|
```
|
|
|
|
패턴 매칭 예시:
|
|
```bash
|
|
./gradlew :app:testDebugUnitTest --tests "*TimeUtilsTest*"
|
|
```
|
|
|
|
참고:
|
|
- Kotlin backtick 테스트명은 공백이 포함될 수 있으므로 전체 문자열을 인용한다.
|
|
- 메서드 매칭이 불안정하면 클래스 단위로 먼저 실행한다.
|
|
|
|
### 2) 계측 테스트 클래스/메서드 타깃 실행
|
|
Gradle 인자 방식:
|
|
```bash
|
|
./gradlew :app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=kr.co.vividnext.sodalive.SomeInstrumentedTest
|
|
./gradlew :app:connectedDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=kr.co.vividnext.sodalive.SomeInstrumentedTest#someMethod
|
|
```
|
|
|
|
ADB 대안:
|
|
```bash
|
|
adb shell am instrument -w -e class kr.co.vividnext.sodalive.SomeInstrumentedTest#someMethod <test_package>/<runner>
|
|
```
|
|
|
|
## 코드 스타일 가이드
|
|
### 1) 포맷/기본 규칙
|
|
- `.editorconfig` 기준을 준수한다.
|
|
- 인덴트: 공백 4칸, 줄바꿈: LF, 최대 라인 길이: 130.
|
|
- 파일 끝 개행 유지, trailing whitespace 제거.
|
|
- Kotlin/KTS에서 `import-ordering` ktlint 규칙은 비활성화되어 있으므로 기존 파일 정렬 스타일을 우선 따른다.
|
|
|
|
### 2) import 규칙
|
|
- 신규 코드에서는 와일드카드 import(`*`)를 기본적으로 지양한다.
|
|
- 사용하지 않는 import를 남기지 않는다.
|
|
- import alias(`as`)는 필요한 경우(이름 충돌 회피) 최소 범위로만 사용한다.
|
|
- 기존 파일에 와일드카드/alias가 있으면 대규모 정렬 리팩터링 없이 주변 스타일에 맞춘다.
|
|
|
|
### 3) 네이밍/레이어
|
|
- UI: `*Activity`, `*Fragment`, dialog/sheet suffix
|
|
- 상태/도메인: `*ViewModel` (주로 `BaseViewModel` 상속)
|
|
- 데이터 계층: `*Repository`, Retrofit `*Api`
|
|
- DTO: `data class` + `*Request`, `*Response` suffix
|
|
- 레이어 흐름: `Api` -> `Repository` -> `ViewModel` -> `Activity`/`Fragment`
|
|
- DI는 `app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt`의 Koin 구성을 따른다.
|
|
|
|
### 4) 타입/계약/에러 처리
|
|
- nullability와 제네릭 타입을 의미가 바뀌지 않게 유지한다.
|
|
- 공개 API/스키마/리소스 계약은 요청 없이 변경하지 않는다.
|
|
- 응답 처리 시 기존 `ApiResponse<T>`와 Rx 타입(`Single`, `Flowable`)을 우선 재사용한다.
|
|
- 빈 `catch` 블록을 새로 추가하지 않는다.
|
|
- 예외를 조용히 삼키지 않고 로그/주석/대체 흐름 중 하나를 남긴다.
|
|
|
|
### 5) 테스트 관례
|
|
- 단위 테스트는 `app/src/test`에 위치하며 클래스명은 `*Test`를 사용한다.
|
|
- 기본 스택은 JUnit4 + MockK/Mockito다.
|
|
- 테스트 추가 시 단일 실행 명령 예시도 본 문서에 갱신한다.
|
|
|
|
### 6) 주석
|
|
- 의미 단위별로 주석을 작성한다.
|
|
- 주석은 한 문장으로 간결하게 작성한다.
|
|
- 주석은 코드의 의도와 구조를 설명한다.
|
|
- 주석은 코드 변경 시 업데이트를 잊지 않는다.
|