✏️ 2023-03-02 Today I Learn

@mitoconcrete · March 02, 2023 · 3 min read

CI 를 뚫어라..!

오늘 CI를 진행하는 중 그동안 잘 돌아갔던 테스트가 막히는 일이 발생했다.

로그인, 로그아웃, Oauth 테스트와 같이 레디스에서 토큰을 잘 가져오는지 테스트를 하는 로직들이 있었는데,

알고보니, 로컬에서 돌릴 때는 레디스가 켜져있으니, 테스트가 원활하게 돌아갔지만, 테스트환경에서는 레디스를 돌릴 수 없기 때문에 발생하는 일이라고 했다. 좀 더 찾아보니, docker pull 을 당겨 가상의 서비스 환경을 만들어서, 해결한다고 한다. 따라서, 아래의 커멘더를 입력하여, 테스트시 레디스를 실행할 수 있도록 하였다.

    services:
      redis:
        image: redis
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

          ....

      - name: Test with Gradle
        run: ./gradlew test
        env:
          REDIS_HOST: redis
          REDIS_PORT: 6379

하지만 이렇게 해도 똑같은 곳에서 동작을 하지않았다. 조금 더 고민을 해보니, 해당 테스트는 액션 내부의 가상환경에서 돌거고, 거기에 도커를 받아서 돌리는데, 가상환경과 도커를 연결하는 셋팅이 아무곳에도 없었다. 따라서, 테스트 환경에서 도커에 올려져있는, 레디스에 연결하여 테스트를 정상적으로 실행시키도록 아래의 커멘드를 수정하였다.

    services:
      redis:
        image: redis
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:                           << 추가
          - 6379:6379

          ....

      - name: Test with Gradle
        run: ./gradlew test
        env:
          REDIS_HOST: localhost          << 수정
          REDIS_PORT: 6379

성공!

이후에, 리스트 페이징 테스트를 하는데, 계속 실제 데이터와 다른 숫자가 찍히는 현상이 발생했다. 확인해보니, 다른 테스트에서 넣어놓은 유저가 그대로 남아있어서 발생하는 이슈였다.

해당 테스트를 작성하신 팀원분은 파일을 두개로 분리하여, 테스트를 진행중이셨는데, 두개의 파일에서 같은 유저리스트를 사용해야했기 때문에, 롤백을 해선 안된다고 말씀주셨다. 좀 더 찾아보니, 테스트가 마쳐지고 난 뒤, 컨텍스트를 비우는 설정이 가능했고, 해당 설정을하여 테스트를 마치고 DB를 비움에 따라서, 내 테스트까지 영향을 미치지 않도록 만들 수 있었다.

통합테스트를 할 때는 주의를 해야겠다는 깨달음을 얻었다.

@mitoconcrete
어제보다 조금 더 성장하기 위해 기록합니다.