GitHub Actions - 1. CI with PR Test

Kim, Beomgoo·2022년 10월 6일
0

CI/CD

목록 보기
2/5

main 브랜치에 Pull Request를 할 때마다 해당 브랜치에 대해 자동으로 Junit 테스트를 수행하도록 하는 설정을 진행해보도록 하자.

이용 환경

  • 사용 언어 : Java 11
  • 프레임워크 : Spring Boot
  • 테스트 프레임워크 : Junit5

프로젝트 구성

간단한 설정을 위하여 Spring 코드는 Rest Controller인 HelloController.java와 테스트 파일인 ActionApplicationTests.java 단 두 개로 구성하였다.

  • HelloController.java
package com.bamboo.action;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/world")
    public String world() {
        return "world";
    }
}
  • ActionApplicationTests.java
package com.bamboo.action;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ActionApplicationTests {

	@Autowired
	HelloController helloController;

	@Test
	@DisplayName("Get Hello")
	void helloTest() {
		Assertions.assertThat(helloController.hello()).isEqualTo("hello");
	}

	@Test
	@DisplayName("Get World")
	void worldTest() {
		Assertions.assertThat(helloController.world()).isEqualTo("");
	}

}

두 개의 테스트 중 하나(Get World)는 일부러 실패하도록 구성하였다.

IntelliJ를 통해 테스트를 수행해 보면 하나는 실패하는 것을 확인할 수 있다.

GitHub Actions Worlflow 추가

.github/workflows/경로 아래에 yml파일로 workflow를 추가한다.

name: Test

on:
  pull_request:
    branches: [ main ]    # main 브랜치에 PR 보낼 때 실행

jobs:
  test:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v3

        # JDK Setup
      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'

        # Gradle Wrapper 권한 부여
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

        # Gradle Test를 실행한다
      - name: Test with Gradle
        run: ./gradlew --info test

        # Test 후 Report 생성
      - name: Publish Test Results
        uses: EnricoMi/publish-unit-test-result-action@v2
        if: always()
        with:
          junit_files: '**/build/test-results/test/TEST-*.xml'

main 브랜치에 pull request가 생성될 때를 트리거로 하여 jobs를 수행하도록 구성하였다.

Pull Request

Test Fail

테스트가 실패하도록 의도된 코드를 feature 브랜치에 push한 뒤 main 브랜치에 commit해보면 다음과 같은 결과를 확인할 수 있다.

봇을 통해 pull request의 코멘트로 테스트 결과를 요약하여 게시해 준다. Details를 눌러 보면 아래와 같이 어떤 테스트가 실패했고 어떤 로그를 남겼는지도 확인할 수 있다.

Get World 테스트가 실패했다고 알려주고 있다. Raw output을 눌러 세부 로그를 확인해보자.

Test Success

이번에는 테스트 코드를 수정하여 테스트가 제대로 통과하도록 한 뒤 push하여 pull request를 생성해 보자.

테스트가 통과하였음을 보여주고 있다.

참고자료

profile
하나에 하나를 보탠다

0개의 댓글