
GitHub Actions를 이용하면 다양한 이점이 있다. Jenkins와 같은 다른 CI/CD 툴을 사용해본 적은 없지만 별도의 서버를 운영하거나 여러 언어를 사용해야되는 등 난이도가 있다고 들었다. 그에 비해 GitHub Actions는 yaml만 잘 작성하면 SQLI 같이 작은 프로젝트에서는 충분히 쓸만하다. 이번에는 GitHub Actions를 사용해서 Pull Request에 자동으로 유닛 테스트 결과를 댓글로 남기려다가 발생한 No Tests Found 문제를 해결해보겠다.

우선 내가 작성한 Workflows 파일을 살펴보자.
# dev 브랜치로 Push, PR 발생시 test 진행 후 결과를 댓글로 남긴다
name: Android CI
on:
push:
branches:
- dev
pull_request:
branches:
- dev
jobs:
Unit-Test:
runs-on: ubuntu-latest
permissions:
checks: write
pull-requests: write
steps:
- name: Checkout the code
uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: '17'
- name: set up Android SDK
uses: android-actions/setup-android@v2
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Run unit tests
run: |
./gradlew test
- name: Publish Test Results
if: always()
uses: EnricoMi/publish-unit-test-result-action@v2
with:
files: "build/test-results/test/TEST-*.xml"
예상되는 원인을 우선 정리했다. 나름의 우선순위를 부여해서 하나씩 확인해보자.
./gradlew test 명령어: test 명령어가 내 테스트 코드를 무시한다던지, 혹은 특별한 옵션을 사용해야되는지 확인해보자. EnricoMi/publish-unit-test-result-action@v2 액션을 사용하고 있다. 어쩌면 프레임워크 호환 문제가 있을 수도 있다. Junit4는 괜찮은데 Junit5를 사용한 테스트 코드를 못 찾는다던지?혹시 들여쓰기나 안 보이는 뛰어쓰기가 있을까봐 확인해봤는데 문제는 없다. 또 문법상의 오류였다면 Unit Test 자체가 실행이 안 됐을 거 같다. 실제로 Unit Test 자체는 잘 수행되고 다만 그 결과를 남기는 과정에서 문제가 있는 거 같다.
혹시나 몰라서 로컬 프로젝트에서 ./gradlew test 명령어를 실행하고 GitHub Actions의 옵션 debugUnitTest ./gradlew testDebugUnitTest --tests com.csapp.sqli.viewmodel.EditorViewModelTest 등 다양하게 변경해보았으나 역시 문제 없이 실행되었다.
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
class EditorViewModelTest {
@Test
fun onStatementChangedTest() {
Assertions.assertEquals(4, 2 + 2)
}
}
테스트 로직 자체는 GitHub Actions 작동을 확인하기 위한 임의의 코드임으로 문제가 있을 수 없다. 함수명도 *Test로 문제 없다. 로컬에서도 GitHub Actions에서도 정상적으로 실행된다.
이렇게 갈피를 못 잡고 있던 도중 GitHub Actions의 로그를 확인해봤다. 아무런 Error였다면 표시를 해주기 때문에 조금 더 빨리 알 수 있었겠지만 Warning이여서 작동은 하지만 결과를 추출할 XML 파일을 찾지 못해서 No Test Found라고 인식하는 상황이었다. 경로에서 TEST-.xml 파일을 찾을 수 없다는데 분명히 로컬에서도 테스트를 진행하면 `TEST-.xml` 파일이 생성된다. 그렇다면 정답은 둘 중 하나다. 하나는 내가 경로를 정말 잘못 설정한 경우다. 이 경우에는 경로만 바르게 설정해주면 된다. 아니면 Action이 문제가 있어서 TEST-*.xml 파일을 인식하지 못하는 경우다. 이렇게 되면 내가 해결할 수 없다. Action을 바꾸던지 테스트 결과 Publish 자동화를 포기해야 한다.
2024-04-01 02:08:35 +0000 - publish - WARNING - Could not find any files for build/test-results/test/TEST-*.xml
다행히도 경로를 한번 더 확인해본 결과 build/test-results/test/가 아닌 app/build/test-results/testDebugUnitTest/에 파일이 생성되는 걸 확인했다. 아마도 경로를 설정할 때 공식 문서를 읽고 안드로이드 스튜디오가 아닌 인텔리제이 자바 프로젝트의 경로를 생각해서 설정한 뒤에 SQLI 프로젝트에서는 파일이 제대로 생성되는지만 확인한 것이 문제였다.

Test Result Publish가 정상 작동하는 모습을 보는 속이 뻥 뚫린다. 사실 GitHub Actions가 제대로 작동 안 한다는 핑계로 Unit Test 코드 작성을 미루고 있었는데 이제는 더 이상 핑계가 없어져서 섭섭하기도 하다. 이제는 정말 정식으로 운영하고 있는만큼 안정성을 위해서라면 테스트를 추가하면서 내실을 다져야할 것 같다.