>  기사  >  백엔드 개발  >  컴파일된 Go 바이너리와 상호 작용하는 기능 테스트에 대해 사각지대 없이 포괄적인 적용 범위 프로필을 달성하는 방법은 무엇입니까?

컴파일된 Go 바이너리와 상호 작용하는 기능 테스트에 대해 사각지대 없이 포괄적인 적용 범위 프로필을 달성하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-25 07:14:29523검색

How to achieve comprehensive coverage profiles without blind spots for functional tests interacting with a compiled Go binary?

기능 테스트 커버리지를 사각지대 없이 보여주기

문제:

컴파일된 Go 바이너리와 상호 작용하는 Go 이외의 언어로 작성된 기능 테스트에 대한 커버리지 프로필인 main_test.go 파일에는 종료 코드를 채널로 보내기 위해 main() 메서드를 수정하는 Test_main 함수가 포함되어 있습니다. 그러나 exit() 함수의 if flag.Lookup("test.coverprofile") != nil 조건은 적용 범위 프로필이 요청될 때 os.Exit(code)가 절대 실행되지 않을 수 있으므로 적용 범위 결과에 사각지대를 만듭니다. .

해결책:

사각지대 없이 커버리지 프로필을 작성하려면 main.go 파일을 테스트에서 제외하는 것이 좋습니다. 이는 main.go 파일 상단에 // build !test 줄을 추가하여 빌드 태그를 사용하여 수행할 수 있습니다. 이렇게 하면 Go 컴파일러가 테스트 빌드 중에 파일을 무시하도록 지시합니다.

다음은 이 접근 방식을 통합하는 예제 코드의 수정된 버전입니다.

<code class="go">// dofunc.go
package main

import (
    "fmt"
    "math/rand"
    "time"
)

var seed int64 = time.Now().UTC().UnixNano()

func doFunc() int {
    rand.Seed(seed)
    var code int
    for {
        i := rand.Int()
        fmt.Println(i)
        if i%3 == 0 {
            code = 0
            break
        }
        if i%2 == 0 {
            fmt.Println("status 1")
            code = 1
            break
        }
        time.Sleep(time.Second)
    }
    return code
}

// main.go
//+build !test
package main

import "os"

func main() {
    os.Exit(doFunc())
}

// dofunc_test.go
package main

import (
    "testing"
    "flag"
    "os"
)

var exitCode int

func TestMain(m *testing.M) {
    flag.Parse()
    code := m.Run()
    os.Exit(code)
}

func TestDoFuncErrorCodeZero(t *testing.T) {
    seed = 2

    if code := doFunc(); code != 0 {
        t.Fail()
    }
}

func TestDoFuncErrorCodeOne(t *testing.T) {
    seed = 3

    if code := doFunc(); code != 1 {
        t.Fail()
    }
}</code>

사용법:

  1. 태그를 사용하여 Coverage 바이너리를 빌드합니다. go test -c -coverpkg=. -o myProgram -tags test
  2. 커버리지 바이너리 실행: ./myProgram -test.coverprofile=/tmp/profile
  3. 커버리지 HTML 보고서 생성: go toolcover -html /tmp/profile -o /tmp/profile.html

main.go를 테스트에서 제외하면 종료() 함수는 더 이상 커버리지 분석의 일부가 아니며 커버리지 프로필은 메인.go의 동작을 정확하게 반영합니다. 기능 테스트.

위 내용은 컴파일된 Go 바이너리와 상호 작용하는 기능 테스트에 대해 사각지대 없이 포괄적인 적용 범위 프로필을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.