Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mencapai Liputan Ujian Tepat untuk Kod Go Menggunakan `os.Exit()`?

Bagaimanakah Saya Boleh Mencapai Liputan Ujian Tepat untuk Kod Go Menggunakan `os.Exit()`?

DDD
Lepaskan: 2024-12-23 14:39:22
asal
327 orang telah melayarinya

How Can I Achieve Accurate Test Coverage for Go Code Using `os.Exit()`?

Menguji os.Keluar Senario dalam Go dengan Maklumat Liputan (coveralls.io/Goveralls)

Soalan ini berkaitan dengan senario ujian yang melibatkan os. Exit() dalam Go, terutamanya cara menangkap maklumat liputan untuk senario ini. Kod sampel yang disediakan menunjukkan kaedah pelaksanaan semula, tetapi ia mengalami pengehadan dengan alat liputan dan kerapuhan.

Cabaran Liputan

Satu kesukaran ialah rangka kerja liputan seperti coveralls.io mungkin tidak merekodkan liputan ujian yang membangkitkan os.Exit(). Ini kerana instrumentasi liputan tidak digunakan apabila binari ujian dilaksanakan semula.

Kaedah Pelaksanaan Semula Diubahsuai

Untuk menangani isu ini, pengubahsuaian semula kaedah exec boleh digunakan. Kod asal difaktorkan semula untuk mengekstrak os.Exit sebagai pembolehubah bernama osExit. Kod ujian kemudian menggantikan osExit dengan fungsi olok-olok yang merekodkan kod keluar. Ini membolehkan maklumat liputan untuk panggilan osExit ditangkap.

Liputan Panggilan Luar

Teknik yang sama boleh digunakan untuk menutup panggilan ke fungsi seperti log.Fatalf() , yang secara tidak langsung memanggil os.Exit. Fungsi logFatalf digantikan dengan fungsi olok-olok yang merekodkan format mesej dan hujah yang dihantar kepadanya. Ini memastikan liputan senario di mana os.Exit dipanggil daripada fungsi luaran.

Contoh

Kod dan ujian yang diubah suai adalah seperti berikut:

// bar.go
package foo

import (
    "fmt"
    "os"
)

var osExit = os.Exit

func Crasher() {
    fmt.Println("Going down in flames!")
    osExit(1)
}
Salin selepas log masuk
// bar_test.go
package foo

import (
    "reflect"
    "testing"
)

var logFatalf = log.Fatalf

func TestCrasher(t *testing.T) {
    // Save original functions and restore at the end
    oldOsExit := osExit
    oldLogFatalf := logFatalf
    defer func() {
        osExit = oldOsExit
        logFatalf = oldLogFatalf
    }()

    // Mock osExit
    var got int
    myExit := func(code int) {
        got = code
    }
    osExit = myExit

    // Mock logFatalf
    var gotFormat string
    var gotV []interface{}
    myFatalf := func(format string, v ...interface{}) {
        gotFormat, gotV = format, v
    }
    logFatalf = myFatalf

    // Run test
    Crasher()

    // Check results
    exp := 1
    if got != exp {
        t.Errorf("Expected exit code: %d, got: %d", exp, got)
    }

    expFormat, expV := "Exiting with code: %d", []interface{}{1}
    if gotFormat != expFormat || !reflect.DeepEqual(gotV, expV) {
        t.Error("Something went wrong")
    }
}
Salin selepas log masuk

Dengan mengasingkan fungsi berkaitan keluar dan menggunakan fungsi olok-olok, kedua-dua os.Exit dan luaran panggilan fungsi yang mencetuskan os.Keluar boleh diliputi dalam ujian Go. Pendekatan ini memastikan pelaporan liputan yang tepat untuk senario yang melibatkan penamatan proses.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Liputan Ujian Tepat untuk Kod Go Menggunakan `os.Exit()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan