Skip to main content

AWS Durable Execution Testing SDK for Python

Project description

AWS Durable Execution Testing SDK for Python

PyPI - Version PyPI - Python Version


Table of Contents

Installation

pip install aws-durable-execution-sdk-python-testing

Overview

Use the AWS Durable Execution Testing SDK for Python to test your Python durable functions locally.

The test framework contains a local runner, so you can run and test your durable function locally before you deploy it.

Quick Start

A durable function under test

from aws_durable_execution_sdk_python.context import (
    DurableContext,
    durable_step,
    durable_with_child_context,
)
from aws_durable_execution_sdk_python.execution import durable_execution
from aws_durable_execution_sdk_python.config import Duration


@durable_step
def one(a: int, b: int) -> str:
    return f"{a} {b}"

@durable_step
def two_1(a: int, b: int) -> str:
    return f"{a} {b}"

@durable_step
def two_2(a: int, b: int) -> str:
    return f"{b} {a}"

@durable_with_child_context
def two(ctx: DurableContext, a: int, b: int) -> str:
    two_1_result: str = ctx.step(two_1(a, b))
    two_2_result: str = ctx.step(two_2(a, b))
    return f"{two_1_result} {two_2_result}"

@durable_step
def three(a: int, b: int) -> str:
    return f"{a} {b}"

@durable_execution
def function_under_test(event: Any, context: DurableContext) -> list[str]:
    results: list[str] = []

    result_one: str = context.step(one(1, 2))
    results.append(result_one)

    context.wait(Duration.from_seconds(1))

    result_two: str = context.run_in_child_context(two(3, 4))
    results.append(result_two)

    result_three: str = context.step(three(5, 6))
    results.append(result_three)

    return results

Your test code

from aws_durable_execution_sdk_python.execution import InvocationStatus
from aws_durable_execution_sdk_python_testing.runner import (
    ContextOperation,
    DurableFunctionTestResult,
    DurableFunctionTestRunner,
    StepOperation,
)

def test_my_durable_functions():
    with DurableFunctionTestRunner(handler=function_under_test) as runner:
        result: DurableFunctionTestResult = runner.run(input="input str", timeout=10)

    assert result.status is InvocationStatus.SUCCEEDED
    assert result.result == '["1 2", "3 4 4 3", "5 6"]'

    one_result: StepOperation = result.get_step("one")
    assert one_result.result == '"1 2"'

    two_result: ContextOperation = result.get_context("two")
    assert two_result.result == '"3 4 4 3"'

    three_result: StepOperation = result.get_step("three")
    assert three_result.result == '"5 6"'

Architecture

Durable Functions Python Test Framework Architecture

Event Flow

Event Flow Sequence Diagram

  1. DurableTestRunner starts execution via Executor
  2. Executor creates Execution and schedules initial invocation
  3. During execution, checkpoints are processed by CheckpointProcessor
  4. Individual Processors transform operation updates and may trigger events
  5. ExecutionNotifier broadcasts events to Executor (observer)
  6. Executor updates Execution state based on events
  7. Execution completion triggers final event notifications
  8. DurableTestRunner run() blocks until it receives completion event, and then returns DurableFunctionTestResult.

Major Components

Core Execution Flow

  • DurableTestRunner - Main entry point that orchestrates test execution
  • Executor - Manages execution lifecycle. Mutates Execution.
  • Execution - Represents the state and operations of a single durable execution

Service Client Integration

  • InMemoryServiceClient - Replaces AWS Lambda service client for local testing. Injected into SDK via DurableExecutionInvocationInputWithClient

Checkpoint Processing Pipeline

  • CheckpointProcessor - Orchestrates operation transformations and validation
  • Individual Validators - Validate operation updates and state transitions
  • Individual Processors - Transform operation updates into operations (step, wait, callback, context, execution)

Execution status changes (Observer Pattern)

  • ExecutionNotifier - Notifies observers of execution events
  • ExecutionObserver - Interface for receiving execution lifecycle events
  • Executor implements ExecutionObserver to handle completion events

Component Relationships

1. DurableTestRunner → Executor → Execution

  • DurableTestRunner serves as the main API entry point and sets up all components
  • Executor manages the execution lifecycle, handling invocations and state transitions
  • Execution maintains the state of operations and completion status

2. Service Client Injection

  • DurableTestRunner creates InMemoryServiceClient with CheckpointProcessor
  • InProcessInvoker injects the service client into SDK via DurableExecutionInvocationInputWithClient
  • When durable functions call checkpoint operations, they're intercepted by InMemoryServiceClient
  • InMemoryServiceClient delegates to CheckpointProcessor for local processing

3. CheckpointProcessor → Individual Validators → Individual Processors

  • CheckpointProcessor orchestrates the checkpoint processing pipeline
  • Individual Validators (CheckpointValidator, TransitionsValidator, and operation-specific validators) ensure operation updates are valid
  • Individual Processors (StepProcessor, WaitProcessor, etc.) transform OperationUpdate into Operation

4. Observer Pattern Flow

The observer pattern enables loose coupling between checkpoint processing and execution management:

  1. CheckpointProcessor processes operation updates
  2. Individual Processors detect state changes (completion, failures, timer scheduling)
  3. ExecutionNotifier broadcasts events to registered observers
  4. Executor (as ExecutionObserver) receives notifications and updates Execution state
  5. Execution complete_* methods finalize the execution state

Documentation

Error Handling

The testing framework implements AWS-compliant error responses that match the exact format expected by boto3 and AWS services. For detailed information about error response formats, exception types, and troubleshooting, see:

Key features:

  • AWS-compliant JSON format: Matches boto3 expectations exactly
  • Smithy model compliance: Field names follow AWS Smithy definitions
  • HTTP status code mapping: Standard AWS service status codes
  • Boto3 compatibility: Seamless integration with boto3 error handling

Developers

Please see CONTRIBUTING.md. It contains the testing guide, sample commands and instructions for how to contribute to this package.

tldr; use hatch and it will manage virtual envs and dependencies for you, so you don't have to do it manually.

License

This project is licensed under the Apache-2.0 License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file aws_durable_execution_sdk_python_testing-1.0.0.post2.tar.gz.

File metadata

File hashes

Hashes for aws_durable_execution_sdk_python_testing-1.0.0.post2.tar.gz
Algorithm Hash digest
SHA256 3fb41c9ddc03a88fb96c82cb65dedb18216960c6bbb83d1350fb5feae447ac5e
MD5 99ecd378eebd0255d46feab46d676639
BLAKE2b-256 f71d5fa379e546c26a0d1b37424f0624242fdfe834652620e928f34da09679b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_durable_execution_sdk_python_testing-1.0.0.post2.tar.gz:

Publisher: pypi-publish.yml on aws/aws-durable-execution-sdk-python-testing

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aws_durable_execution_sdk_python_testing-1.0.0.post2-py3-none-any.whl.

File metadata

File hashes

Hashes for aws_durable_execution_sdk_python_testing-1.0.0.post2-py3-none-any.whl
Algorithm Hash digest
SHA256 2b920f8e9769731d0512c7b0c324cf71576a7eb73c73b1e48a526838ad909bd4
MD5 8191d284afefe039e118633f32c30b98
BLAKE2b-256 f570c12b9fb3e3d68ce6b44d55c5a16e9e1faed0e3fb508dadb4013346da9edf

See more details on using hashes here.

Provenance

The following attestation bundles were made for aws_durable_execution_sdk_python_testing-1.0.0.post2-py3-none-any.whl:

Publisher: pypi-publish.yml on aws/aws-durable-execution-sdk-python-testing

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page