Kaedah ujian unit untuk fungsi tak segerak dalam Go

WBOY
Lepaskan: 2024-05-01 15:36:01
asal
368 orang telah melayarinya

Dalam Go, fungsi tak segerak boleh diuji unit dengan ujian serentak untuk mensimulasikan pelaksanaan serentak dan menguji kelakuan fungsi tak segerak. Langkah-langkahnya adalah seperti berikut: Buat konteks tamat masa. Buat saluran untuk menerima keputusan. Panggil fungsi tak segerak dan tulis hasilnya ke saluran. Baca hasil daripada saluran dan semak nilai yang dijangkakan. Gunakan penyata pilih untuk mengendalikan tamat masa atau keputusan yang diterima.

Go 中异步函数的单元测试方法

Kaedah ujian unit untuk fungsi tak segerak dalam Go

Dalam Go, fungsi tak segerak (juga dikenali sebagai coroutines) boleh diuji unit melalui ujian serentak. Ujian konkurensi membolehkan kami mensimulasikan pelaksanaan serentak untuk menguji kelakuan fungsi tak segerak.

Kes praktikal

Andaikan kita mempunyai fungsi tak segerak dipanggil greetAsync() yang menerima nama dan mengembalikan rentetan chan dengan mesej ucapan. Begini cara untuk menguji unit fungsi ini menggunakan ujian serentak: greetAsync() 的异步函数,它接收一个名称并返回一个带有问候消息的 chan string。以下是如何使用并发测试对该函数进行单元测试:

package async

import (
    "context"
    "testing"
    "time"
)

func TestGreetAsync(t *testing.T) {
    tests := []struct {
        name string
        expected string
    }{
       {"Alice", "Hello Alice!"},
       {"Bob", "Hello Bob!"},
    }

    for _, test := range tests {
        t.Run(test.name, func(t *testing.T) {
            // 创建一个超时上下文
            ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
            defer cancel()
            
            // 创建一个通道来接收结果
            ch := make(chan string, 1)
            
            // 调用 greetAsync() 并将结果写入通道
            go greetAsync(ctx, test.name, ch)
            
            // 从通道中读取结果并检查预期值
            select {
            case r := <-ch:
                if r != test.expected {
                    t.Errorf("expected %q, got %q", test.expected, r)
                }
            case <-ctx.Done():
                t.Errorf("timeout waiting for response")
            }
        })
    }
}

func greetAsync(ctx context.Context, name string, ch chan string) {
    select {
    case <-ctx.Done():
        return // 上下文已超时,返回
    default: 
        // 上下文仍在有效期内,发送问候消息
        ch <- "Hello " + name + "!"
    }
}
Salin selepas log masuk

在这个示例中,我们设置了一个超时上下文,使用 selectrrreee

Dalam contoh ini, kami menyediakan konteks tamat masa, menggunakan select untuk membaca hasil daripada saluran atau tamat masa dan menjalankan tamat masa dalam kedua-dua Buat penegasan untuk mengesahkan tingkah laku yang dijangkakan. 🎜

Atas ialah kandungan terperinci Kaedah ujian unit untuk fungsi tak segerak dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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