테스트 파이프라인 구축 (Bitbucket, Teams 노티)

2023. 5. 14. 21:48테스트

배경

저희 팀은 API, 화면 개발 모두 필요한 경우에는 BE(백엔드)와 FE(프론트엔드) 작업담당자가 REST API Request, Response 모델에 대해서 사전에 논의합니다.

논의한 내용을 바탕으로 각자 파트에서 작업을 진행하게 되죠. API 개발이 완료된 후에는 보통 DV 환경이 타 버전에 대한 검증으로 사용 중인 상황이 많기 때문에, 로컬에서 DV 환경에 DB를 바라보는 profile로 API 서버를 구동합니다.

이러한 환경에서 업무를 진행할 때, API 개발이 완료되어서 FE에 API 명세와 작업 브랜치를 전달하면 종종 문제가 발생합니다.

  • API 에러 상황
    • Http status 5xx
    • API 명세와 상이한 Request/Response
  • 개발된 기능 외 기존 기능에 문제 발생
    • 테스트 코드 실패 케이스 존재
  • 빌드 에러

 

물론, API 개발 담당자가 모두 확인했으면 문제가 되지 않을 수 있을 것 같습니다. 하지만 구성원 마다 개발자 검증의 범위는 다를 수 있으며, 휴먼 에러는 어디에나 존재할 수 있다고 생각합니다.

(가끔 저도 협업하는 브랜치에서 코드를 내려받고 실행했을 때 빌드 에러를 종종 만나기도 했습니다. 유효하지 않은 import 구문이 존재한다던지.. .😅)

그리고 저희 조직에서 최근에 테스트 코드를 열심히 작성해보기로 했는데, 테스트 코드 유지 보수와 잘 사용하는 것도 하나의 이슈였습니다.

그래서, 커밋 될 때 마다 bitbucket pipeline에서 빌드 & 테스트를 수행하고 결과를 Teams 메신저로 받을 수 있게 시도해보기로 했습니다.

 

테스트 환경

테스트 코드가 효용이 있으려면, 모든 환경에서 잘 수행되어야 합니다. 특히 각 개발자의 로컬 PC에서는 테스트 환경을 미리 알고 로컬에 데이터베이스 등을 설정해줄 수 있지만, 그렇게 각각 설정해야만 테스트가 수행된다면 파이프라인에 이를 적용하기는 어려울 것입니다.

그래서 기존에 테스트 시 MariaDB를 사용하도록 설정된 부분을 쉽게 사용할 수 있는 H2Database로 변경했습니다.

 

파이프라인

파이프라인에 대해서는 ChatGPT의 도움을 굉장히 많이 받았습니다. 물론, 안되는 정보를 알려주기도 했지만 직접 파이프라인을 반복해서 테스트 해보고 Bitbucket 공식 문서를 포함한 정보들을 구글링해서 해결했습니다.

파이프라인 내에서 프로젝트 빌드 & 테스트 실패 시 팀즈 알림을 전송하며, 스크립트 내용은 아래와 같습니다.

pipelines:
  default:
    - step:
        name: Build and test for all other pull requests
        image: maven:3.8.1-jdk-8
        caches:
          - maven
        script:
          - set -e
          - mvn clean test
        after-script:
          - COMMIT_MESSAGE=`git log --format=%B -n 1 $BITBUCKET_COMMIT`
          - COMMIT_AUTHOR=`git log -n 1 --format=format:'%an'`
          - |
            if [ "$BITBUCKET_EXIT_CODE" -ne 0 ]; then
              # Construct the notification message
              PIPELINE_URL="${BITBUCKET_GIT_HTTP_ORIGIN%/}/pipelines/results/${BITBUCKET_BUILD_NUMBER}"
              JSON_STRING='{"@type": "MessageCard","@context": "http://schema.org/extensions","themeColor": "FF0000","summary": "Maven test failed in Bitbucket Pipelines!","sections": [{"activityTitle": "Maven build or test failed! - '${COMMIT_MESSAGE}' ('${BITBUCKET_COMMIT}')","activitySubtitle": "Author: '${COMMIT_AUTHOR}'","activityImage": "https://www.gravatar.com/avatar/'${BITBUCKET_BUILD_COMMITTER_EMAIL_HASH}'?d=identicon","facts": [{"name": "Repository","value": "'${BITBUCKET_REPO_FULL_NAME}'"},{"name": "Branch","value": "'${BITBUCKET_BRANCH}'"},{"name": "Pipeline URL","value": "'${PIPELINE_URL}'"}]}]}'

              # Send the notification to Microsoft Teams
              curl -H "Content-Type: application/json" -d "$JSON_STRING" <teams_webhook_url>
            else
              echo Maven test succeed in Bitbucket Pipelines!
            fi

스크립트 내 <teams-webhook_url> 부분의 경우는 아래 링크를 참고하시고, webhook URL을 생성한 후 첨부하시면 되겠습니다.

 

Azure Data Factory 또는 Synapse Analytics 파이프라인에서 Microsoft Teams 채널로 알림 보내기

 

적용 후, 빌드 & 테스트 파이프라인이 정상적으로 작동하는 모습입니다.

 

 

실패하면 이렇게 알림이 발생합니다.

 

 

이렇게 적용했더니, 최소 레벨의 휴먼 에러를 방지할 수 있었습니다.

해당 프로젝트에서는 빌드 & 테스트 파이프라인을 비교적 쉽게 적용할 수 있었는데, 그 이유는 신규 프로젝트이며 테스트 코드가 많이 존재하지 않기도 하고, 무엇보다 테스트에 대한 격리가 잘 되어 있는 덕분이라고 생각합니다.

외부 의존성이 존재(ex. DB)하는 테스트에 대한 격리는 훨씬 더 고려할 부분이 많죠.

 

다른 사람이 고생을 떠안을 수 있다..

 

최근 김남윤님께서 스프링캠프 발표에서 “어디선가 해야 할 일을 빠트리거나 잘못 수행했다면, 그 일은 또 다른 곳으로 결국 흘러가게 된다” 라고 위 이미지와 함께 강조하시기도 했죠. (문구가 동일하진 않습니다. 생각나는 대로 적어서..)

항상 테스트 격리를 지키고자 노력해야 잘 동작하던 테스트가 돌아가지 않는 현상을 최대한 겪지 않을 수 있지 않을까요? :)