TIL: Go에서 특정 테스트 실행

Go 프로젝트 테스트 모음이 상당한 크기, 실행 시간 및 출력으로 커질 때 다른 테스트의 모든 출력을 훑어보고 완료될 때까지 기다리는 것이 때때로 성가신 일입니다.

다행스럽게도 Go 테스트 명령은 사용자가 실행할 테스트를 지정할 수 있는 추가 매개변수를 사용할 수 있습니다.

go test -v run <testname>


두 가지 기능이 있는 기본 모듈twotests이 있다고 가정해 보겠습니다. 그 중 하나는 시간이 많이 걸립니다.

package twotests

import (
    "fmt"
    "time"
)

func doSomeOperation() uint8 {
    fmt.Println("Doing operation...")

    return 1
}

func doTimeConsumingOperation() uint8 {
    fmt.Println("Doing time consuming operation...")

    time.Sleep(10 * time.Second)

    return 1
}


그리고 테스트 도구 모음:

package twotests

import "testing"

func TestDoSomeOperation(t *testing.T) {
    got := doSomeOperation()
    if got != 1 {
        t.Errorf("Doing Operation not correct, needed %d", got)
    }
}

func TestDoTimeConsumingOperation(t *testing.T) {
    got := doTimeConsumingOperation()
    if got != 1 {
        t.Errorf("Doing time consuming Operation not correct, needed %d", got)
    }
}


테스트를 실행할 수 있습니다.

go test -v
=== RUN   TestDoSomeOperation
Doing some operation...
--- PASS: TestDoSomeOperation (0.00s)
=== RUN   TestDoTimeConsumingOperation
Doing time consuming operation...
--- PASS: TestDoTimeConsumingOperation (10.00s)
PASS
ok      example.com/jonasbn/twotests    10.681s


보시다시피 우리 테스트 스위트는 테스트 스위트의 긴 실행 시간으로 인해 도청되었습니다.

더 빠른 기능에서 무언가를 수정해야 하므로 수정하는 동안 수정하고 빠른 피드백을 받을 수 있어야 합니다. 피드백을 받기 위해 느린 테스트를 기다리고 싶지 않기 때문에 기능만 테스트할 수도 있습니다.
--run를 사용하여 해당 테스트만 실행하도록 합시다.

go test -v --run TestDoSomeOperation
=== RUN   TestDoSomeOperation
Doing operation...
--- PASS: TestDoSomeOperation (0.00s)
PASS
ok      example.com/jonasbn/twotests    0.110s


그리고 보시다시피 TestDoSomeOperation가 실행되고 TestDoTimeConsumingOperation가 건너뜁니다.

모두 괜찮습니다.

피드백을 받으면서 코딩하는 동안 새로운 기능을 제안하고 이에 대한 테스트도 추가합니다.

func doAnotherOperation() uint8 {
    fmt.Println("Doing another operation...")

    return 1
}



func TestDoAnotherOperation(t *testing.T) {
    got := doAnotherOperation()
    if got != 1 {
        t.Errorf("Doing Operation not correct, needed %d", got)
    }
}


우리는 모든 테스트를 실행할 수 있고 회귀를 도입했는지 확인해야 하지만 작업이 계속됨에 따라 더 느린 기능과 테스트로 인해 속도가 느려지지 않아야 합니다.

운 좋게도 테스트 이름을 지정하는 정규식을 제공하여 필요한 테스트만 실행할 수 있습니다.

go test -v --run '(Some|Another)'
=== RUN   TestDoSomeOperation
Doing some operation...
--- PASS: TestDoSomeOperation (0.00s)
=== RUN   TestDoAnotherOperation
Doing another operation...
--- PASS: TestDoAnotherOperation (0.00s)
PASS
ok      example.com/jonasbn/twotests    0.147s


보시다시피 TestDoSomeOperationTestDoAnotherOperationTestDoTimeConsumingOperation만 실행합니다.

이를 위해서는 테스트에 대한 몇 가지 좋은 명명 규칙이 필요하므로 코딩할 때 선택하고 선택할 수 있으므로 전반적으로 문제가 해결되고 빠른 피드백을 받을 수 있습니다.

또는 내장된 테스트 건너뛰기 기능을 사용할 수 있습니다.

그러나 개발할 때 손끝에 이 기능이 필요한 경우가 많으며 테스트 스위트의 실행을 제어하기 위해 코드에 변경 사항을 적용하고 싶지 않습니다.

내 권장 사항은 CI 테스트용 테스트 스위트에서 테스트를 건너뛰는 기능과 코딩할 때 테스트를 선택하는 기능을 사용하는 것입니다.

그러나 잠재적 회귀를 포착하기 위해 정기적으로 전체 테스트를 수행해야 합니다.

리소스 및 참조


  • go command


  • 이 게시물은 my TIL collection에서 해제되었습니다.

    좋은 웹페이지 즐겨찾기