Buat tarikh akhirExceededError untuk ujian unit dengan tamat masa: benar

WBOY
Lepaskan: 2024-02-09 13:00:18
ke hadapan
666 orang telah melayarinya

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,
    }
}
Salin selepas log masuk

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) {}}
Salin selepas log masuk

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}}
Salin selepas log masuk

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
}
Salin selepas log masuk

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,
    }
}
Salin selepas log masuk

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())
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!