単体テストでケイデンス RegisterDelayedCallback を使用して同じワークフローを実行するにはどうすればよいですか?

WBOY
リリース: 2024-02-10 10:50:09
転載
642 人が閲覧しました

如何在单元测试中使用 cadence RegisterDelayedCallback 执行相同的工作流程?

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 サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!