php エディター Baicao では、単体テストでケイデンス RegisterDelayedCallback を使用して同じワークフローを実行する方法を紹介します。単体テストでは、さまざまな状況下でコードが正しいことを確認するために、非同期操作をシミュレートする必要があることがよくあります。 cadence RegisterDelayedCallback は、テストで遅延コールバック関数をシミュレートするのに役立つ強力なツールです。 RegisterDelayedCallback を使用すると、非同期操作を簡単にシミュレートし、さまざまな状況でコードの正確性を確認し、潜在的な問題を再現して修正できます。この記事では、単体テストを改善するために、ケイデンス RegisterDelayedCallback を使用して同じワークフローを実行する方法を説明します。
同じケイデンス ワークフローを実行する registerlayedcallback
を使用して単体テストを実行することは可能ですか?
ワークフローを 2 回実行する次のコードがあります。最初の実行ではコールバック トークンが保存され、2 回目の実行では保存されたトークンが取得されてアクティビティが非同期的に完了します。
workflow.go
リーリーworkflow_test.go
リーリー上記のコードは不完全です。コールバック トークンを保存せず、completeactivity を呼び出しません。シーケンスをテストするために、ワークフローの開始とアクティビティの 2 回の開始のログを確認したいのですが、それが表示されません。最初のワークフローの開始後、アクティブなログがない場合、テストはタイムアウトになるまでハングします。
何が足りないのでしょうか?このように同じワークフローを 2 回実行することは可能ですか?
package workflow import ( "context" "encoding/base64" "fmt" "go.uber.org/cadence/activity" "go.uber.org/cadence/workflow" ) type workflowimpl struct { worker.worker client.client } func (w workflowimpl) tactivity(ctx context.context, action string) error { fmt.println("tactivity started", action) if action != "approved" { activityinfo := activity.getinfo(ctx) callbacktoken := base64.stdencoding.encodetostring(activityinfo.tasktoken) fmt.println("save callbacktoken", callbacktoken) // saves callbacktoken. return activity.errresultpending } fmt.println("approved") // do some approved things. // get saved callback token. // call w.completeactivity() with the saved callback token. return nil } func (w workflowimpl) tworkflow(ctx workflow.context, action string) (result string, err error) { fmt.println("tworkflow started", action) waitchannel := workflow.newchannel(ctx) workflow.go(ctx, func(ctx workflow.context) { if err := workflow.executeactivity(ctx, w.tactivity, action).get(ctx, nil); err != nil { // do nothing, keep workflow open. return } waitchannel.send(ctx, "ok") }) var signal string waitchannel.receive(ctx, &signal) return signal, nil }
ここで行き詰まりが発生しています。 env
は、コールバックの実行中はロックされます (ソース コード を参照)。そして、コールバックは同じ env
でワークフローを実行しようとします。これには、env
で同じロックを取得する必要があります (ソース コード を参照)。
新しい goroutine でコールバックを実行して、デッドロックを打開してみましょう:
リーリー今私たちはパニックに陥っています:
リーリー現在、testworkflowenvironment
は 2 つの非親子ワークフローを実行できません。 「複数のワークフローのテストをサポートするために testworkflowenvironment を有効にする」 .
パニック メッセージが示すように、別のワークフローを実行するには、新しい testworkflowenvironment
を作成する必要があります (ただし、それがあなたのユースケースに適しているかどうかはわかりません)。
以上が単体テストでケイデンス RegisterDelayedCallback を使用して同じワークフローを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。