Rumah >pembangunan bahagian belakang >Golang >Kaedah ujian unit untuk fungsi tak segerak dalam Go

Kaedah ujian unit untuk fungsi tak segerak dalam Go

WBOY
WBOYasal
2024-05-01 15:36:01390semak imbas

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 + "!"
    }
}

在这个示例中,我们设置了一个超时上下文,使用 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!

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