Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mencapai profil liputan komprehensif tanpa titik buta untuk ujian berfungsi yang berinteraksi dengan binari Go yang disusun?

Bagaimana untuk mencapai profil liputan komprehensif tanpa titik buta untuk ujian berfungsi yang berinteraksi dengan binari Go yang disusun?

Susan Sarandon
Susan Sarandonasal
2024-10-25 07:14:29609semak imbas

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

Menunjukkan Liputan Ujian Fungsian Tanpa Bintik Buta

Masalah:

Untuk menjana profil liputan untuk ujian berfungsi yang ditulis dalam bahasa bukan-Go yang berinteraksi dengan binari Go yang disusun, fail main_test.go termasuk fungsi Test_main yang mengubah suai kaedah main() untuk menghantar kod keluar ke saluran. Walau bagaimanapun, if flag.Lookup("test.coverprofile") != keadaan tiada dalam fungsi exit() mewujudkan titik buta dalam hasil liputan, kerana os.Exit(kod) tidak boleh dilaksanakan apabila profil liputan diminta .

Penyelesaian:

Untuk menulis profil liputan tanpa titik buta, adalah disyorkan untuk mengecualikan fail main.go daripada ujian. Ini boleh dicapai menggunakan teg binaan dengan menambahkan baris // build !test pada bahagian atas fail main.go. Ini akan mengarahkan pengkompil Go untuk mengabaikan fail semasa pembinaan ujian.

Berikut ialah versi diubah suai bagi contoh kod yang menggabungkan pendekatan ini:

<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>

Penggunaan:

  1. Bina perduaan liputan dengan tag: go test -c -coverpkg=. -o myProgram -tags test
  2. Jalankan perduaan liputan: ./myProgram -test.coverprofile=/tmp/profile
  3. Jana laporan HTML liputan: go tool cover -html /tmp/profile -o /tmp/profile.html

Dengan mengecualikan main.go daripada ujian, fungsi exit() bukan lagi sebahagian daripada analisis liputan dan profil liputan akan mencerminkan dengan tepat kelakuan ujian berfungsi.

Atas ialah kandungan terperinci Bagaimana untuk mencapai profil liputan komprehensif tanpa titik buta untuk ujian berfungsi yang berinteraksi dengan binari Go yang disusun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn