rein's world

Golang 테스트 편하게 하기

언제나처럼 테스트 좀 편하게 실행할 방법이 없나 찾다가 gotestsum 이라는 괜찮은 프로젝트를 발견했다. 내가 원하는 것들을 상당 수 갖추고 있더라.

  • CLI 환경 기반1
  • 테스트 성공/실패를 쉽게 알아 볼 수 있을 것2
  • Watch 기능- 구현 코드나 테스트를 변경하면 테스트 실행. 가능하다면 바꾼 부분에 영향 받는 것만.

두번째 항목이 조금 부족하긴한데, gotestsum/contrib 에 있는 기능과 macOS terminal-notifier를 같이 쓰면 쓸만하다. VSCode에서 코드를 수정하고 저장하면 watch 모드로 돌고 있던 테스트들을 실행하고, 성공/실패는 알림 메시지로 받는다. 세부적인 실패 메시지는 알림 메시지 클릭해서 뜨는 iTerm2 쪽에서 확인하는 식으로 작업하고 있다.

실행 예

gotestsum --watch --post-run-command=notify -- -v ./...

이 상태에서 파일을 하나 변경하면 테스트를 실행하고 이에 해당하는 macOS 알림을 보낸다.

gotestsum + contrib/notify + terminal-notifier

여기서 macOS 알림이 필요없다면 위 명령에서 --post-run-command=notify 부분은 없어도 된다.

수정한 코드

terminal-notifier를 호출하는 contrib/notify 코드를 조금 수정해서, 테스트 실행 시각을 표시하게 하고, 알림 click했을 때 포커스를 iTerm2 쪽에 가게했다.

diff --git a/contrib/notify/notify_darwin.go b/contrib/notify/notify_darwin.go
index ad68389..ea6ec81 100644
--- a/contrib/notify/notify_darwin.go
+++ b/contrib/notify/notify_darwin.go
@@ -6,6 +6,7 @@ import (
        "os"
        "os/exec"
        "strconv"
+       "time"
 )

 func main() {
@@ -28,6 +29,7 @@ func main() {
        }

        subtitle := fmt.Sprintf("%d Tests Run", total)
+       title = fmt.Sprintf("%s - %s", time.Now().Format("2006-01-02 15:04"), title)
        if errors > 0 {
                subtitle += fmt.Sprintf(", %d Errored", errors)
        }
@@ -42,6 +44,7 @@ func main() {
                "-title", emoji + " " + title,
                "-group", "gotestsum",
                "-subtitle", subtitle,
+               "-activate", "com.googlecode.iterm2",
        }
        cmd := exec.Command("terminal-notifier", args...)
        log.Printf("%#v", cmd.Args)

  1. 전에 C++ 테스트 관련해서 얘기한 것처럼 CLI 환경에서 실행하고 결과를 볼 수 있어야 ↩︎

  2. Test runner 관련해서 말한 것처럼 테스트 성공/실패 여부를 쉽게 알 수 있어야 한다. ↩︎