Valkey Test Suite

February 9, 2026 ยท View on GitHub

Overview

Integration tests are written in Tcl, a high-level, general-purpose, interpreted, dynamic programming language [source]. runtest is the main entrance point for running integration tests. For example, to run a single test;

./runtest --single unit/your_test_name
# For additional arguments, you may refer to the `runtest` script itself.

The normal execution mode of the test suite involves starting and manipulating local valkey-server instances, inspecting process state, log files, etc.

The test suite also supports execution against an external server, which is enabled using the --host and --port parameters. When executing against an external server, tests tagged external:skip are skipped.

There are additional runtime options that can further adjust the test suite to match different external server configurations. All options are listed by ./runtest --help. The following table is just a subset of the options:

OptionImpact
--singledbOnly use database 0, don't assume others are supported.
--ignore-encodingSkip all checks for specific encoding.
--ignore-digestSkip key value digest validations.
--cluster-modeRun in strict Valkey Cluster compatibility mode.
--large-memoryEnables tests that consume more than 100MB
--tlsRun tests with TLS. See below.
--tls-moduleRun tests with TLS, when TLS support is built as a module.
--other-server-path PATHRun compatibility tests with another server executable.
--helpDisplays the full set of options.

Running with TLS requires the following preparations:

  • Build Valkey is TLS support, e.g. using make BUILD_TLS=yes, or make BUILD_TLS=module.
  • Run ./utils/gen-test-certs.sh to generate a root CA, server certificates, and invalid certificates for testing.
  • Install TLS support for TCL, e.g. the tcl-tls package on Debian/Ubuntu.

Additional tests

Not all tests are included in the ./runtest scripts. Some additional entry points are provided by the following scripts, which support a subset of the options listed above:

  • ./runtest-cluster runs more extensive tests for Valkey Cluster. Some cluster tests are included in ./runtest, but not all.
  • ./runtest-sentinel runs tests of Valkey Sentinel.
  • ./runtests-module runs tests of the module API.

Debugging

You can set a breakpoint and invoke a minimal debugger using the bp function.

... your test code before break-point
bp 1
... your test code after break-point

The bp 1 will give back the tcl interpreter to the developer, and allow you to interactively print local variables (through puts), run functions and so forth [source]. bp takes a single argument, which is 1 for the case above, and is used to label a breakpoint with a string. Labels are printed out when breakpoints are hit, so you can identify which breakpoint was triggered. Breakpoints can be skipped by setting the global variable ::bp_skip, and by providing the labels you want to skip.

The minimal debugger comes with the following predefined functions.

  • Press c to continue past the breakpoint.
  • Press i to print local variables.

Tags

Tags are applied to tests to classify them according to the subsystem they test, but also to indicate compatibility with different run modes and required capabilities.

Tags can be applied in different context levels:

  • start_server context
  • tags context that bundles several tests together
  • A single test context.

Some tags are restricted to top-level use only. These tags are large-memory, needs:other-server, compatible-redis and network.

The following compatibility and capability tags are currently used:

TagIndicates
external:skipNot compatible with external servers.
clusterUses cluster with multiple nodes.
cluster:skipNot compatible with --cluster-mode.
large-memoryTest that requires more than 100MB
tlsUses TLS.
tls:skipNot compatible with --tls.
ipv6Uses IPv6.
needs:repl, replUses replication and needs to be able to SYNC from server.
needs:debugUses the DEBUG command or other debugging focused commands (like OBJECT REFCOUNT).
needs:pfdebugUses the PFDEBUG command.
needs:config-maxmemoryUses CONFIG SET to manipulate memory limit, eviction policies, etc.
needs:config-resetstatUses CONFIG RESETSTAT to reset statistics.
needs:resetUses RESET to reset client connections.
needs:saveUses SAVE or BGSAVE to create an RDB file.
needs:other-serverRequires --other-server-path.
compatible-redisTests that run against Redis (compatibility tests).
networkTests that require network operations.
singledbTest runs as if --singledb was given.
valgrind:skipNot compatible with --valgrind.

When using an external server (--host and --port), filtering using the external:skip tags is done automatically.

When using --valgrind, filtering using the valgrind:skip tag is done automatically.

When using --cluster-mode, filtering using the cluster:skip tag is done automatically.

When not using --large-memory, filtering using the largemem:skip tag is done automatically.

In addition, it is possible to specify additional configuration. For example, to run tests on a server that does not permit SYNC use:

./runtest --host <host> --port <port> --tags -needs:repl