Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Buat tarikh akhirExceededError untuk ujian unit dengan tamat masa: benar

Buat tarikh akhirExceededError untuk ujian unit dengan tamat masa: benar

WBOY
WBOYke hadapan
2024-02-09 13:00:18667semak imbas

Buat tarikh akhirExceededError untuk ujian unit dengan tamat masa: benar

Editor PHP Xiaoxin di sini untuk memperkenalkan anda kepada petua tentang ujian unit: buat tarikh akhirExceededError: benar untuk ujian unit dengan tamat masa. Semasa menjalankan ujian unit, kadangkala anda mungkin menghadapi tamat masa pelaksanaan ujian Dalam kes ini, kami boleh menyelesaikan masalah ini dengan menetapkan tarikh akhirExceededError kepada benar. Teknik ini boleh membantu kami mengawal dan mengurus masa pelaksanaan ujian dengan lebih baik dan memastikan ketepatan dan kebolehpercayaan ujian. Seterusnya, kami akan memperkenalkan secara terperinci cara menggunakan teknik ini untuk meningkatkan kecekapan dan kebolehpercayaan ujian unit.

Kandungan soalan

Saya cuba mencipta ujian unit dalam projek saya di mana saya mengejek klien http dan menetapkan respons yang mesti dikembalikan oleh pelanggan. Saya memerlukan tingkah laku ini kerana kod saya perlu berkelakuan sewajarnya sekiranya klien http gagal dengan tamat masa: jadi saya perlu mengejek klien http untuk mengembalikan tarikh akhirExceededError dan ujian unit daripadanya.

Apa yang saya cuba setakat ini adalah untuk mensimulasikan fungsi pelanggan dengan cara yang client.do mengembalikan:

getdofunc = func(*http.request) (*http.response, error) {
    return nil, &url.error{
        op:  "post",
        err: context.deadlineexceeded,
    }
}

Ia berfungsi, tetapi tidak sepenuhnya, yang bermaksud apabila saya melaksanakan kod dengan tingkah laku simulasi ini, jenis ralat yang dikembalikan ialah:

error(*net/url.error) *{op: "post", url: "", err: error(context.deadlineexceedederror) {}}

Ini betul sekali lagi, tetapi tidak sepenuhnya. kenapa? Kerana jika saya menjalankan kod dan tamat masa sebenar berlaku, saya mendapat sesuatu yang lebih lengkap:

error(*net/url.Error) *{Op: "Post", URL: "http://localhost:4500/scan/", Err: error(*net/http.httpError) *{err: "context deadline exceeded (Client.Timeout exceeded while awaiting headers)", timeout: true}}

Apa yang paling menarik minat saya ialah timeout: true. Jika saya berjaya memberitahu olok-olok saya untuk mengembalikannya, saya boleh menegaskan ini, yang saya dapati lebih lengkap daripada sekadar menegaskan bahawa ralat yang dikembalikan adalah jenis deadlineexceedederror.

Penyelesaian

Untuk mengelak daripada membuat ujian terlalu rumit, saya mengesyorkan anda menggunakan pendekatan ini. Mula-mula, mulakan dengan menentukan ralat anda:

type timeouterror struct {
    err     string
    timeout bool
}

func (e *timeouterror) error() string {
    return e.err
}

func (e *timeouterror) timeout() bool {
    return e.timeout
}

Dengan cara ini, timeouterror就同时实现了error()timeoutantara muka.
Kemudian anda perlu mentakrifkan olok-olok untuk klien http:

type mockclient struct{}

func (m *mockclient) do(req *http.request) (*http.response, error) {
    return nil, &timeouterror{
        err:     "context deadline exceeded (client.timeout exceeded while awaiting headers)",
        timeout: true,
    }
}

Ini hanya mengembalikan ralat yang ditakrifkan di atas dan nil sebagai http.response. Akhir sekali, mari lihat cara menulis ujian unit sampel:

func TestSlowServer(t *testing.T) {
    r := httptest.NewRequest(http.MethodGet, "http://example.com", nil)
    client := &mockClient{}

    _, err := client.Do(r)

    fmt.Println(err.Error())
}

Jika anda menyahpepijat ujian ini dan menjeda dengan penyahpepijat pada pembolehubah err, anda akan melihat hasil yang anda inginkan.
Dengan cara ini anda boleh mencapai fungsi yang anda inginkan tanpa sebarang kerumitan tambahan. Beritahu saya jika ia berfungsi untuk anda!

Atas ialah kandungan terperinci Buat tarikh akhirExceededError untuk ujian unit dengan tamat masa: benar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam