ホームページ  >  記事  >  バックエンド開発  >  Go の非同期関数の単体テスト方法

Go の非同期関数の単体テスト方法

WBOY
WBOYオリジナル
2024-05-01 15:36:01319ブラウズ

Go では、同時実行テストを通じて非同期関数を単体テストして、同時実行をシミュレートし、非同期関数の動作をテストできます。手順は次のとおりです。 タイムアウト コンテキストを作成します。結果を受信するチャネルを作成します。非同期関数を呼び出し、結果をチャネルに書き込みます。チャネルから結果を読み取り、期待値を確認します。タイムアウトや受信した結果を処理するには、select ステートメントを使用します。

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

Go での非同期関数の単体テスト方法

Go では、非同期関数 (コルーチンとも呼ばれます) を同時に実行できます。単体テスト用のテスト。同時実行テストを使用すると、同時実行をシミュレートして非同期関数の動作をテストできます。

実際的なケース

名前を受け取り、挨拶メッセージを返す greetAsync() という名前の非同期関数があるとします。弦###。同時テストを使用してこの関数を単体テストする方法は次のとおりです: <pre class='brush:go;toolbar:false;'>package async import ( &quot;context&quot; &quot;testing&quot; &quot;time&quot; ) func TestGreetAsync(t *testing.T) { tests := []struct { name string expected string }{ {&quot;Alice&quot;, &quot;Hello Alice!&quot;}, {&quot;Bob&quot;, &quot;Hello Bob!&quot;}, } 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 := &lt;-ch: if r != test.expected { t.Errorf(&quot;expected %q, got %q&quot;, test.expected, r) } case &lt;-ctx.Done(): t.Errorf(&quot;timeout waiting for response&quot;) } }) } } func greetAsync(ctx context.Context, name string, ch chan string) { select { case &lt;-ctx.Done(): return // 上下文已超时,返回 default: // 上下文仍在有效期内,发送问候消息 ch &lt;- &quot;Hello &quot; + name + &quot;!&quot; } }</pre> この例では、タイムアウト コンテキストを設定し、

select

を使用してチャネルから結果またはタイムアウトを読み取り、アサーションを行います。どちらの場合も、予想される動作を確認します。

以上がGo の非同期関数の単体テスト方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。