어느 팀은 코드 리뷰가 빠르게 끝나는 이유

DeadWhale·2023년 4월 17일
0

CICD

목록 보기
2/3
post-thumbnail

소나코드 서버의 최소 요구사항이 상당히 높아 프리티어로는 구축이 힘들수 있습니다 😭😭😭

개요

제가 이전 글에서 병합을 하기전./gradlew build 를 통해 빌드를 테스트 하는 것 가지는 생각했습니다.

하지만 이 때 불현듯 예전에 봤던 아티클이 생각 났습니다.(효과적인 코드 리뷰를 위해)

  • 본문의 내용중 일부 발췌

지금 제가 F-Lab에서 진행중인 프로젝트는 저와 다른 멘티 한명 , 멘토님 총 3명이 진행중인 프로젝트입니다.
제가 코드를 작성했을 때 리뷰를 해줄수 있는 분들은 2명 뿐입니다.

모두 바쁘지만 좋은 퀄리티의 코드를 유지하기 위해서는 코드 리뷰에 많은 시간을 소모할 수 밖에 없습니다.

이럴 때 CI 과정을 통해 줄일 수 있는건 줄이고 수치화 할 수 있는건 수치화해
코드 리뷰의 효율성을 높이고 리뷰의 시간을 조절 할 수 있습니다.


뭐가 있을까.

일단 ./gradlew build 를 통해 프로그램의 동작은 확인한 상태입니다.
다시 한번 말하면 동작만 확인한 상태입니다.

  • 코드가 컨벤션을 맞쳤는지는 확인할 수 없다.
  • 코드가 효율적인 코드인지 모른다
  • 코드가 안전한지는 모른다
  • 테스트 코드가 잘 테스트 됬는지 모른다.

이런 모든걸 다른 리뷰어가 체크하기 시간적으로도 체력적으로 지치는데
CI를 통해 정보의 제공량을 높여 시간을 조금이나마 효율적으로 사용 할 수 있었습니다.

  • 중복 / 테스트 커버리지 / 버그 / 보안 취약성/ 컨벤션 등 여러 정보를 제공 가능

테스트 코드 커버리지

테스트 코드 커버리지는 3가지의 구조로 이루어져 있습니다.

구문(Statement)

  • 라인 커버리지 라고 표현합니다.
  • 코드 한 줄이 한번 이상 실행 되면 충족됩니다.

조건(Condition)

  • 모든 조건 식의 내부 조건이 T / F 를 가지게 되면 충족한다.

    말이 살짝 헷갈리는데 쉽게 이해하자면
    코드 상에 존재하는 모든 논리 조건의 경우의 수를 측정하는 지표입니다.

public boolean isAdult(int age, boolean isStudent) {
    if (age >= 18 && !isStudent) {
        return true;
    } else {
        return false;
    }
}
  1. age >= 18 이고, isStudent 가 거짓인 경우 (참, 거짓)
  2. age >= 18 이고, isStudent 가 참인 경우 (참, 참)
  3. age < 18 이고, isStudent 가 거짓인 경우 (거짓, 거짓)
  4. age < 18 이고, isStudent 가 참인 경우 (거짓, 참)

이럴 때 4가지 조건을 모두 맞쳐야지 조건 커버리지가 100%가 됩니다.

결정(Decision)

  • 모든 조건식 T/F 를 가지게 되면 충족된다.
public String calculateAgeCategory(int age) {
    if (age < 18) {
        return "Child";
    } else if (age < 60) {
        return "Adult";
    } else {
        return "Senior";
    }
}

위 코드는 들어온 나이에 따라 나이 대를 전달하는 코드입니다.

  1. age < 18 인 경우
  2. 18 <= age < 60 인 경우
  3. age >= 60 인 경우

이런 3가지 조건을 모두 검사 해야지 분기 커버리지가 100%가 된니다.

이러한 테스트 커버리지는 테스트 코드의 정확성을 수치화 한거라 할 수 있습니다.
커버리지의 수치에 따라 개발자가 누락한 부분과 취약한 부분을 파악할 수 있습니다.

이러한 자바 테스트 코드 커버리지 툴은 몇가지 있습니다.

그 중 jacoco를 기준으로 애기해보려 합니다.

  • jacoco는 코드 커버리지를 측정 후 html , xml , csv와 같은 리포트를 생성할 수 있습니다.
  • 설정한 커버리지 목표를 만족했는지 확인할 수 있습니다.
  • 사용방법이 간단한 편입니다.


이런식으로 jacoco를 통해 커버리지의 측정 지표를 통해
테스트 코드가 얼마나 잘 짜여졌는지 확인 할 수 있습니다.

하지만 커버리지가 높은게 항상 좋은 테스트코드를 의미한 다는 것을 의미하는 것은 아닙니다.

  • 코드 자체의 품질이 좋지 않을 경우
  • 불필요한 테스트가 있을 경우

등등 코드 커버리지는 테스트 코드의 품질을 보장해주는 것이 아니라
어느 정도까지 검증되고 있는지를 보여주는데 도움을 줍니다.

글의 길이가 과도하게 길어 질 수 있기 때문에

yml의 설정 파일

- name: Run tests with JaCoCo
	run: ./gradlew test jacocoTestReport
# Gradle과 JaCoCo 플러그인을 사용하여 테스트를 실행하고 코드 커버리지 보고서를 생성합니다.

- name: Upload code coverage report
	uses: actions/upload-artifact@v3
	with:
	name: code-coverage-report
	path: build/reports/jacoco/test/html
# 생성된 코드 커버리지 보고서를 GitHub Actions 아티팩트로 업로드합니다.
  • build.gradle 플러그인에 자코코가 추가되어야 합니다.

이 글에서 구현 진행 과정의 글 까지 자세하게 작성하지는 않겠습니다. 🙏


우아한형제들 - # Gradle 프로젝트에 JaCoCo 설정하기


정적 코드 분석

테스트 커버리지로 테스트 코드가 얼마나 많은 코드를 실행하고 검증하는지 측정 했지만
실제로 좋은 코드인지 확인하지 못했습니다.

소스 코드를 실행하지 않고, 코드의 구조, 패턴, 표준 준수 여부, 잠재적인 결함 등을 검사하는 것을
정적 코드 분석이라고 합니다.

대표적인 정적 코드 분석 도구는 SonarQube가 있습니다.

SonarQube의 주요 기능은 다음과 같습니다

  • 정적 코드 분석:
  • 코드 중복 및 복잡도 측정:
  • 보안 취약점 및 코드 스멜 검출:
  • 커스텀 규칙 설정:

정적 코드 분석을 통해 테스트 코드의 품질과 실제 소스 코드의 품질을 체계적으로 관리하고 개선할 수 있습니다.
이를 테스트 커버리지와 함께 사용하면, 소프트웨어의 전반적인 품질과 안정성을 높일 수 있습니다.

하지만 처음에 설명한 대로 CI 도중 정적 분석을 하기 위해서는 SonarQube의 서버가 필요한대
이 서버의 최소 요구 성능이 상당히 높습니다.
프리티어로는 감당할 수 없습니다 😢

  • yml에서 소나의 주소와 소나 프로젝트의 토큰 값이 필요합니다.

우분투(Ubuntu) 환경에 SonarQube 설치하기
소스 코드 분석을 위한 소나 큐브(Sonar Qube) 사용법

비슷한 도구

  • PMD: Java 코드의 오류와 취약점을 검사해주는 오픈소스 정적 분석 도구입니다.
  • SpotBugs: 버그와 취약점을 검출하는 데 더 정확하고 세부적인 결과를 제공합니다.

코드 컨벤션

Checkstyle: Java 코드의 스타일을 검사해 컨벤션을 지키도록 도와줍니다.

  • 프로젝트 시 기본적으로 각자의 환경에 설정된 경우가 많지만.
    세팅이 누락 될 경우를 고려해 CI과정에서 한번 더 확인 할 수 있습니다.


결론

자코코를 통해 코드 커버리지를 측정하고 테스트 코드의 동작 범위를 파악할 수 있게 되었습니다.

소나큐브를 사용하여 정적 코드 분석을 수행하고, 코드의 구조, 패턴, 표준 준수 여부,
잠재적인 결함 등을 검사하여 코드 품질을 향상시킬 수 있게 되었습니다.

체크스타일을 통해 개발자들의 코드 컨벤션이 깨지는 것을 방지 하고
규칙있는 코드를 작성할 수 있게 되었습니다.

이를 활용하여 코드 리뷰의 효율성을 높이고,
개발자가 누락한 부분과 취약한 부분을 파악할 수 있게 되었습니다.

저는 자코코와 소나 코드 , 체크스타일로만 예시로 들며 글을 작성했습니다.
하지만 다른 여러 종류의 도구들을 활용해 코드의 품질을 높이고 유지 보수성을 극대화 할 수 있습니다.

다시 처음으로 돌아가 첫 질문을 생각해보겠습니다.

모두 바쁘지만 좋은 퀄리티의 코드를 유지하기 위해서는 코드 리뷰에 많은 시간을 소모할 수 밖에 없습니다.

초반부에 제가 작성한 글입니다.

원래는 다른 사람이 내 코드를 확인하기 위해서 코드를 하나부터 끝까지 꼼꼼하게 다 읽어야하지만
여러 도구들을 도입해 그 수치를 참조하고 체크스타일의 결과에 따라 규약이 깨졌는지
매우 빠르게 파악할 수 있습니다.


[참조 자료]

[프로젝트]


1개의 댓글

comment-user-thumbnail
2023년 5월 16일

찍이네요

답글 달기