For package maintainers and hackage trustees
goldplate is a cute and simple opaque golden test runner for CLI
applications. You place your test cases in a directory, annotate them with
.goldplate files, and that's it. It is completely language agnostic. And
perhaps its best feature is that it can automatically✨🪄 fix your tests outputs!
Give goldplate a try if:
At Fugue, we've been using internal versions of this tool
since 2016, so it should be pretty stable.
Imagine we are up to testing the behaviour of echo command. In this very
simple example, we run echo "Hello, world!" and expect it to print Hello,
world! to the stdout stream as a result.
Create a new file echo.goldplate and add the following content:
Let's go through this bit by bit.
The test invocation is specified by the command and arguments fields. We
are invoking the echo process with a single argument, "Hello, world!".
The expected results of our test live in the asserts field. This simple test
has two asserts:
We haven't created hello-world.txt yet, but that's not a problem. We can
invoke goldplate --fix to create it:
After hello-world.txt has been created with proper contents, subsequent
goldplate invocations will pass:
You can view the full example here:
View example:
You can pass one or multiple lines of input to the command by using the stdin
field.
View example:
The environment field can be used to set environment variables for the
program.
goldplate also sets a number of environment
variables. You can use these directly within the
configuration JSON. In this example, we use:
Rather than:
We found this to be good practice, it makes mass-renaming of tests much easier.
View example:
.goldplate files are fairly small but if you have a whole directory of files
that you just want to run the same command on, they can get very repetitive.
This is why goldplate provides a simple way to pull in multiple input files.
If the input_files field is set to a glob, all asserts will be ran for every
matching input file. goldplate will set the following variables:
View example:
Sometimes you may want to do a find-and-replace on the actual output, for
example to filter out timestamps or other information that you do not expect to
match up against the expected output.
View example:
Many modern CLI tools output JSON. You can use the prettify_json post
processor to make sure the JSON is converted to a normalized form with sorted
keys and consistent indentation.
View example:
goldplate is geared towards checking the stdout and stderr outputs of a
program, but you can also check that files were created with specific contents.
If you do this, goldplate will remove these files and directories afterwards
to leave a clean repository behind.
Installation through source is done using standard Haskell tooling -- Cabal
and stack both work well.
Environment variables can be spliced into the configuration using ${VAR}
syntax within strings. To escape this syntax, use $${VAR} to get a literal
${VAR}, $$${VAR} to get a literal $${VAR}, and so on.
The test is always executed in the directory that holds the .goldplate file.
goldplate will always set the following environment variables:
When dealing with multiple input files, the following
additional variables are set:
Here is an example that outputs all of these environment variables:
A similar project is smoke. I think goldplate has two major advantages
over smoke: