Heim  >  Artikel  >  Backend-Entwicklung  >  Unit-Testmethoden für asynchrone Funktionen in Go

Unit-Testmethoden für asynchrone Funktionen in Go

WBOY
WBOYOriginal
2024-05-01 15:36:01365Durchsuche

In Go können asynchrone Funktionen einem Komponententest mit Parallelitätstests unterzogen werden, um die gleichzeitige Ausführung zu simulieren und das Verhalten der asynchronen Funktion zu testen. Die Schritte sind wie folgt: Erstellen Sie einen Timeout-Kontext. Erstellen Sie einen Kanal, um die Ergebnisse zu erhalten. Rufen Sie eine asynchrone Funktion auf und schreiben Sie das Ergebnis in den Kanal. Lesen Sie das Ergebnis vom Kanal ab und überprüfen Sie den erwarteten Wert. Verwenden Sie Select-Anweisungen, um Zeitüberschreitungen oder empfangene Ergebnisse zu verarbeiten.

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

Unit-Testmethoden für asynchrone Funktionen in Go

In Go können asynchrone Funktionen (auch als Coroutinen bezeichnet) durch Parallelitätstests Unit-Tests unterzogen werden. Durch Parallelitätstests können wir gleichzeitige Ausführungen simulieren, um das Verhalten asynchroner Funktionen zu testen.

Praktischer Fall

Angenommen, wir haben eine asynchrone Funktion namens greetAsync(), die einen Namen empfängt und einen chan string mit einer Begrüßungsnachricht zurückgibt. So testen Sie diese Funktion mithilfe von Parallelitätstests: 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

In diesem Beispiel richten wir einen Timeout-Kontext ein, verwenden select, um das Ergebnis aus dem Kanal oder dem Timeout zu lesen, und führen es in beiden aus Machen Sie Aussagen, um das erwartete Verhalten zu überprüfen. 🎜

Das obige ist der detaillierte Inhalt vonUnit-Testmethoden für asynchrone Funktionen in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn