Application development - Testing
Temporal provides a framework to facilitate Workflow and integration testing.
Replay
Replay recreates the exact state of a Workflow Execution. You can replay a Workflow from the beginning of its history when resumed.
Replay allows code to resume only if it is compatible from a deterministic point of view.
To retrieve the Workflow History, use any of the following options and then pass the object to your SDK of choice.
- Go
- Java
- PHP
- Python
- TypeScript
Use the worker.WorflowReplayer to replay an existing Workflow Execution from its Event History to replicate errors.
For example, the following code retrieves the Event History of a Workflow:
import (
    "context"
    "go.temporal.io/api/enums/v1"
    "go.temporal.io/api/history/v1"
    "go.temporal.io/sdk/client"
)
func GetWorkflowHistory(ctx context.Context, client client.Client, id, runID string) (*history.History, error) {
    var hist history.History
    iter := client.GetWorkflowHistory(ctx, id, runID, false, enums.HISTORY_EVENT_FILTER_TYPE_ALL_EVENT)
    for iter.HasNext() {
        event, err := iter.Next()
        if err != nil {
            return nil, err
        }
        hist.Events = append(hist.Events, event)
    }
    return &hist, nil
}
This history can then be used to replay.
For example, the following code creates a WorkflowReplayer and register the YourWorkflow Workflow function.
Then it calls the ReplayWorkflowHistory to replay the Event History and return an error code.
import (
    "context"
    "go.temporal.io/sdk/client"
    "go.temporal.io/sdk/worker"
)
func ReplayWorkflow(ctx context.Context, client client.Client, id, runID string) error {
    hist, err := GetWorkflowHistory(ctx, client, id, runID)
    if err != nil {
        return err
    }
    replayer := worker.NewWorkflowReplayer()
    replayer.RegisterWorkflow(YourWorkflow)
    return replayer.ReplayWorkflowHistory(nil, hist)
}
The code above will cause the Worker to re-execute the Workflow's Workflow Function using the original Event History. If a noticeably different code path was followed or some code caused a deadlock, it will be returned in the error code. Replaying a Workflow Execution locally is a good way to see exactly what code path was taken for given input and events.
Content is currently unavailable.
Content is currently unavailable.
To replay a Workflow Execution, use the replay_workflow() method and pass a Workflow History as an argument.
In the following example, history_json_str references the Workflow History as a JSON string.
async def run_replayer(history_json_str: str):
    replayer = Replayer(workflows=[YourWorkflow])
    await replayer.replay_workflow(history_json_str)
If the Workflow History is non-deterministic, run_replayer() raises an error.
If the Workflow History is exported by Temporal Web UI or through tctl, you can pass the JSON file history object as a JSON string or as a Python dictionary through the json.load() function, which takes a file object and returns the JSON object.
Content is currently unavailable.