Go では、同時実行テストを通じて非同期関数を単体テストして、同時実行をシミュレートし、非同期関数の動作をテストできます。手順は次のとおりです。 タイムアウト コンテキストを作成します。結果を受信するチャネルを作成します。非同期関数を呼び出し、結果をチャネルに書き込みます。チャネルから結果を読み取り、期待値を確認します。タイムアウトや受信した結果を処理するには、select ステートメントを使用します。
Go での非同期関数の単体テスト方法
Go では、非同期関数 (コルーチンとも呼ばれます) を同時に実行できます。単体テスト用のテスト。同時実行テストを使用すると、同時実行をシミュレートして非同期関数の動作をテストできます。
実際的なケース
名前を受け取り、挨拶メッセージを返す greetAsync()
という名前の非同期関数があるとします。弦###。同時テストを使用してこの関数を単体テストする方法は次のとおりです: <pre class='brush:go;toolbar:false;'>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 + "!"
}
}</pre>
この例では、タイムアウト コンテキストを設定し、
を使用してチャネルから結果またはタイムアウトを読み取り、アサーションを行います。どちらの場合も、予想される動作を確認します。
以上がGo の非同期関数の単体テスト方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。