GitHub Actions을 통한 Unit Test시 발생한 문제 - No Tests Found

Lee Sanghyun·2024년 4월 8일
1

SQLI

목록 보기
7/7
post-thumbnail

💥 No Tests Found

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"

예상되는 원인을 우선 정리했다. 나름의 우선순위를 부여해서 하나씩 확인해보자.

  1. yml 문법 (뛰어쓰기, 들여쓰기): yml은 굉장히 예민한 문법을 가졌기 때문에 조심해야 된다. 대신 오류를 발견하기 쉬운만큼 제일 첫번째로 확인하자.
  2. ./gradlew test 명령어: test 명령어가 내 테스트 코드를 무시한다던지, 혹은 특별한 옵션을 사용해야되는지 확인해보자.
  3. 내 테스트 코드 (Junit5): 테스트 코드 자체는 임의로 작성한 간단한 테스트 코드이다. 테스트 로직보다는 명칭 위주로 생각해보자.
  4. Workflows Actions: 유닛 테스트 결과를 Pull Request에 댓글로 남기기 위해EnricoMi/publish-unit-test-result-action@v2 액션을 사용하고 있다. 어쩌면 프레임워크 호환 문제가 있을 수도 있다. Junit4는 괜찮은데 Junit5를 사용한 테스트 코드를 못 찾는다던지?

✨ 문제 해결

❌ 1. yml 문법 (뛰어쓰기, 들여쓰기)

혹시 들여쓰기나 안 보이는 뛰어쓰기가 있을까봐 확인해봤는데 문제는 없다. 또 문법상의 오류였다면 Unit Test 자체가 실행이 안 됐을 거 같다. 실제로 Unit Test 자체는 잘 수행되고 다만 그 결과를 남기는 과정에서 문제가 있는 거 같다.

❌ 2. ./gradlew test 명령어

혹시나 몰라서 로컬 프로젝트에서 ./gradlew test 명령어를 실행하고 GitHub Actions의 옵션 debugUnitTest ./gradlew testDebugUnitTest --tests com.csapp.sqli.viewmodel.EditorViewModelTest 등 다양하게 변경해보았으나 역시 문제 없이 실행되었다.

❌ 3. 내 테스트 코드 (Junit5)

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에서도 정상적으로 실행된다.

✔️ 4. Workflows 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 코드 작성을 미루고 있었는데 이제는 더 이상 핑계가 없어져서 섭섭하기도 하다. 이제는 정말 정식으로 운영하고 있는만큼 안정성을 위해서라면 테스트를 추가하면서 내실을 다져야할 것 같다.


SQLI 프로젝트의 GitHub Repository가 궁금하다면? 클릭


📚 참고

profile
개미 같이 일하는 안드로이드 개발자💻

0개의 댓글