> 백엔드 개발 > Golang > 단위 테스트에서 cadence RegisterDelayedCallback을 사용하여 동일한 워크플로를 수행하려면 어떻게 해야 합니까?

단위 테스트에서 cadence RegisterDelayedCallback을 사용하여 동일한 워크플로를 수행하려면 어떻게 해야 합니까?

WBOY
풀어 주다: 2024-02-10 10:50:09
앞으로
686명이 탐색했습니다.

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

php 편집기 Baicao는 단위 테스트에서 케이던스 RegisterDelayedCallback을 사용하여 동일한 작업 흐름을 수행하는 방법을 소개합니다. 단위 테스트에서는 다양한 상황에서 코드의 정확성을 보장하기 위해 비동기 작업을 시뮬레이션해야 하는 경우가 많습니다. cadence RegisterDelayedCallback은 테스트에서 지연된 콜백 함수를 시뮬레이션하는 데 도움이 되는 강력한 도구입니다. RegisterDelayedCallback을 사용하면 비동기 작업을 쉽게 시뮬레이션하고 다양한 상황에서 코드의 정확성을 보장하며 잠재적인 문제를 재현하고 수정할 수 있습니다. 이 문서에서는 더 나은 단위 테스트에 도움이 되도록 cadence RegisterDelayedCallback을 사용하여 동일한 워크플로를 수행하는 방법을 살펴보겠습니다.

질문 내용

동일한 케이던스 워크플로를 수행하는 registerdelayedcallback를 사용하여 단위 테스트를 실행할 수 있나요?

워크플로를 두 번 실행하는 다음 코드가 있습니다. 첫 번째 실행에서는 콜백 토큰을 저장하고 두 번째 실행에서는 저장된 토큰을 검색하여 활동을 비동기적으로 완료합니다.

workflow.go

으아악

workflow_test.go

으아악

위 코드는 완전하지 않으며 콜백 토큰을 저장하지 않고 완료 활동을 호출하지 않습니다. 시퀀스를 테스트할 목적으로 워크플로가 시작되고 활동이 두 번 시작되는 로그를 보고 싶지만 표시되지 않습니다. 첫 번째 워크플로가 시작된 후 활성 로그가 없으면 시간이 초과될 때까지 테스트가 중단됩니다.

제가 놓치고 있는 부분이 있나요? 아니면 이와 같이 동일한 워크플로를 두 번 실행할 수 있나요?

솔루션

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에 동일한 잠금을 설정하세요(소스 코드 참조).

새 고루틴에서 콜백을 실행하여 교착 상태를 해결해 보겠습니다.

으아악

지금 우리는 당황하고 있습니다:

으아악

현재 testworkflowenvironment 상위-하위 워크플로가 아닌 2개의 워크플로를 실행할 수 없습니다. 여러 워크플로 테스트를 지원하기 위해 테스트워크플로 환경을 활성화하려면 .

작업 추적 문제를 참조하세요.

패닉 메시지에서 알 수 있듯이 다른 워크플로를 실행하려면 새 testworkflowenvironment를 만들어야 합니다(하지만 사용 사례에 적합한지는 잘 모르겠습니다).

위 내용은 단위 테스트에서 cadence RegisterDelayedCallback을 사용하여 동일한 워크플로를 수행하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿