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

Susan Sarandon
풀어 주다: 2024-10-25 07:14:29
원래의
533명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!