Skip to content

restatedev/sdk-test-suite

Repository files navigation

Restate SDK test suite

This tool is a test suite/conformance suite runner for Restate SDKs.

Architecture

This tool requires the SDK developer to implement a well-defined set of services, specified here, and package the application as docker container. For an example implementation, look here.

The tool then starts for each test class Restate alongside with the service deployment container, and sends some requests to it.

The tool is split into test suite, test classes and test methods. A test suite is composed by multiple test classes, which itself is composed by multiple test methods. Test methods usually run in parallel wrt the other methods in the same class, and each individual class deploys an isolated docker network with its own runtime and its own service deployment container. Test suites run the same set of test classes, with different parameters of the runtime tuned.

CI usage

Check as example: https://github.com/restatedev/sdk-python/blob/main/.github/workflows/integration.yaml

Running locally

You need a JVM >= 21, and the test tool. You can get the test tool from the releases page. If you're investigating a CI failure, you might need the exact tool version the CI is currently using (which is usually printed in the title of the CI task).

To run all the tests:

java -jar restate-sdk-test-suite.jar run <TEST_SERVICES_IMAGE>

To run an individual test:

java -jar restate-sdk-test-suite.jar run --test-suite=<SUITE> --test-name=<TEST_NAME> <TEST_SERVICES_IMAGE>

To change the runtime container image, use --restate-container-image=<RUNTIME_CONTAINER_IMAGE>.

By default, the tool will always pull images, unless they have the repository prefix restate.local or localhost. To always try to use the local cache, use --image-pull-policy=CACHED.

All the environment variables prefixed with RUST_ and RESTATE_ will be propagated to every deployed runtime container.

Exclusions

Some SDKs might not implement all the features. For this purpose, the tool allows to configure the excluded test classes in an ad-hoc file. To run with the exclusions file:

java -jar restate-sdk-test-suite.jar run --exclusions-file exclusions.yaml <TEST_SERVICES_IMAGE>

After every run a new exclusions file is generated in the test report, with the failed/skipped tests.

Local debug

You can debug the service deployment by exposing it to a local port, and ask the tool to use a local port instead of deploying a container. To do so:

  • Run the service with your IDE and the debugger
  • Run java -jar restate-sdk-test-suite.jar debug --test-suite=<TEST_SUITE> --test-name=<TEST_NAME> default-service=<PORT>

When the test starts, it will also print to console the environment variables the service deployment should be started with.

Using the debug command, you can also:

  • Expose the environment to your localhost (e.g. to use the CLI to introspect the state) and keep it up and running after the end of the test using:
java -jar restate-sdk-test-suite.jar debug \
  --local-ingress-port=8080 --local-admin-port=9070 --retain-after-end \
  --test-suite=<TEST_SUITE> --test-name=<TEST_NAME> \
  default-service=<PORT>

Please note, some tests requiring to kill/stop the service deployment won't work with the debug command.

Building this tool

./gradlew shadowJar

Releasing this tool

Just push a new git tag:

git tag v1.1 
git push --tags