Code coverage for your AWK programs

Ben Hoyt

AWK 프로그램을 위한 코드 커버리지

원문은 Ben Hoyt님이 에 게재했습니다. 이 블로그 구독하기

업데이트: 이 기능의 저자인 볼로디미르 구바르코프가 GoAWK의 코드 커버리지 리포팅과 아이디어를 떠올리게 된 계기, 그리고 동작 방식에 대해 직접 작성한 글을 올렸습니다.

GoAWK의 저자이긴 하지만, 저는 개인적으로 여러 줄에 걸친 스크립트를 작성할 때 AWK를 사용하지 않습니다. 스크립팅에는 주로 Python을 쓰고, AWK는 터미널에서 한 줄짜리 명령으로 활용하는 편입니다.

그러나 AWK로 더 긴 프로그램을 작성하는 사람들도 있는데, 유용한 것부터 놀라운 것까지 다양합니다:

Gron.awk와 Makesure는 우크라이나 개발자인 볼로디미르 구바르코프가 만들었으며, 그는 “AWK를 위한 빠진 IntelliJ IDEA 언어 지원 플러그인”인 intellij-awk도 제작했습니다.

몇 달 전 볼로디미르는 GoAWK 저장소에 GoAWK에 “Go 자체에 내장된 것과 유사한” 코드 커버리지 기능을 추가하고 있다는 이슈를 올렸습니다. 이렇게 흥미로운 제안을 받는 일이 매일 있는 것은 아니었고, 게다가 볼로디미르는 이미 프로젝트에 수준 높은 버그 리포트를 여러 건 제출한 바 있어 그의 실력을 신뢰할 수 있었습니다.

그리고 GoAWK가 우리가 아는 유일한 코드 커버리지를 지원하는 AWK 구현체라고 말할 수 있게 된다는 것도 멋진 일이라고 생각했습니다.

볼로디미르의 노력 덕분에 GoAWK 버전 1.21.0에는 코드 커버리지 기능이 포함되었습니다. 메인 코드 변경에 앞서 필요한 일부 리팩터링이 있었고, 이후 주요 코드 변경이 이루어졌습니다 – 이 과정을 끝까지 인내심 있게 함께해 준 볼로디미르에게 다시 한번 감사드립니다.

더 큰 규모의 AWK 프로그램을 작성하고 테스트한다면 이 기능이 유용할 수 있습니다! 기능 사용법과 동작 방식에 대한 자세한 내용은 커버리지 문서를 인용해 소개하겠습니다:

간단한 AWK 프로그램(prog.awk)에 GoAWK의 커버리지 기능을 적용한 스크린샷입니다:

예제 코드 커버리지 스크린샷

기본 사용법

커버리지 리포트를 생성하는 가장 간단한 방법은 -coverprofile 옵션과 함께 AWK 프로그램을 실행하는 것입니다. 기본 커버리지 모드로 프로그램을 실행하고 커버리지 리포트를 cover.out에 기록하려면 다음과 같이 실행하세요:

$ goawk -f prog.awk -coverprofile cover.out
will always run
should run

이렇게 하면 prog.awk 실행에 대한 커버리지 프로파일 데이터가 담긴 cover.out 파일이 생성됩니다.

커버리지 리포트를 시각화할 때는 Go 툴체인, 특히 go tool cover 명령에 의존합니다. 이 명령은 커버리지 리포트를 HTML로 렌더링합니다. Go가 설치되어 있지 않다면 지금 설치하세요.

위 스크린샷과 같은 HTML 커버리지 리포트를 임시 파일로 작성하고 웹 브라우저에서 열어보려면 다음과 같이 실행하세요:

$ go tool cover -html=cover.out

웹 브라우저를 여는 대신 HTML 파일을 지정한 파일로 저장하려면 -o를 사용하세요:

$ go tool cover -html=cover.out -o cover.html

커버리지가 주석으로 표시된 소스 코드를 보고 싶다면 -covermode에 추가로 -d 옵션을 사용하세요. 디버깅이나 GoAWK 커버리지 기능이 내부적으로 어떻게 동작하는지 확인하는 데 유용할 수 있습니다:

$ goawk -f prog.awk -covermode set -d
BEGIN {
    __COVER["3"] = 1
    print "will always run"
    if ((1 + 1) == 2) {
        __COVER["1"] = 1
        print "should run"
    } else {
        __COVER["2"] = 1
        print "won't run"
    }
}

모든 명령줄 옵션

  • -coverprofile fn: 커버리지 리포트 파일 이름을 fn으로 설정합니다. 이 옵션이 지정되었지만 -covermode가 지정되지 않은 경우, 커버리지 모드는 기본값으로 set이 됩니다.
  • -covermode mode: 커버리지 모드를 mode로 설정합니다. mode는 다음 중 하나일 수 있습니다:
    • set: 각 문장이 실행되었는가?
    • count: 각 문장이 몇 번 실행되었는가? (히트맵 리포트 생성)
  • -coverappend: 커버리지 프로파일을 덮어쓰는 대신 이어서 추가합니다. 이를 통해 프로그램의 여러 번 실행에 걸친 커버리지 데이터를 누적할 수 있습니다.

즐겨보세요! 버그가 있다면 GitHub 이슈로 제보해 주세요.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글