In this article I will cover my first open source project
commander. It tests cli apps based on tests defined in a simple
Check it out: https://github.com/SimonBaeumer/commander
For another project I needed a tool which had the following abilities:
- Use the same tool for different operating systems (mainly osx, linux, windows)
- Simple and easy writing of tests
- Simple installation (no heavy lib or language installation)
- Language independent
- pls not another DSL
Especially the heavy installation and language independence were important for me because I wanted to test an app inside different docker containers.
Sadly there wasn't a single tool for it.
bats just works for bash, go's
icmd and python's
expect require you to install a language and be familiar with it.
- Easy installation
- Generate tests automatically
- Fast execution
- Platform independent
Download the binary and give it execution permissions. If you want to call it directly from your terminal add it your
path environment variable.
# linux amd64 curl -L https://github.com/SimonBaeumer/commander/releases/download/v1.0.1/commander-linux-amd64 -o commander chmod +x commander # osx amd64 curl -L https://github.com/SimonBaeumer/commander/releases/download/v1.0.1/commander-darwin-amd64 -o commander chmod +x commander
curl -L https://github.com/SimonBaeumer/commander/releases/download/v1.0.1/commander-windows-amd64.exe -o commander.exe
... or download it manually and add it to your
# Let commander create your test! $ .commander add echo hello dev.to written to /current/working/dir/commander.yaml # ... written to the default commander.yaml $ cat commander.yaml tests: echo hello dev.to: exit-code: 0 stdout: hello dev.to # Executes the generated commander config $ commander test Starting test file commander.yaml... ✓ echo hello dev.to Duration: 0.003s Count: 1, Failed: 0
As you can see the test suite is easy to understand and write.
tests: echo hello world: stdout: lines: 1: hello world # assert a specifc line contains: - hello world # this is the default exactly: hello # Match stdout exactly # The same can be done for stderr exit-code: 0 config: timeout: 5ms # set timeout for test dir: /tmp # set working dir env: SOME_ENV: value it should have a title: # You can also define a title to be more clear... command: echo title # ... and define your command under test here exit-code: 0
Further you can define a default configuration for all tests. This can be overwritten by the local test configs.
config: # Define the config globally timeout: 5ms dir: /tmp env: KEY: VALUE tests: print env and dir: command: "echo $KEY $(pwd)" stdout: VALUE /tmp exit-code: 0
Sometimes you need to debug your commands. This can be done with
# Generate the test $ commander add echo hello dev.to # Execute it with logging output $ commander test --verbose Starting test file commander.yaml... 2019/03/28 16:56:48 title: 'echo hello dev.to' ExitCode: 0 2019/03/28 16:56:48 title: 'echo hello dev.to' Stdout: hello dev.to 2019/03/28 16:56:48 title: 'echo hello dev.to' Stderr: ✓ echo hello dev.to Duration: 0.002s Count: 1, Failed: 0
# Execute another file instead of the default $ commander test another.yaml # Filter tests $ commander test commander.yaml "echo hello"
# Add a test to the default commander.yaml $ ./commander add echo hello written to /tmp/commander.yaml # Write to a given file $ ./commander add --file=test.yaml echo hello written to test.yaml # Write to stdout and file $ ./commander add --stdout echo hello tests: echo hello: exit-code: 0 stdout: hello written to /tmp/commander.yaml # Only to stdout $ ./commander add --stdout --no-file echo hello tests: echo hello: exit-code: 0 stdout: hello
commander you can easy generate your test cases and execute them on different platforms without learning a new language or installing annoying libs and tools.
Contributions are always warmly welcomed!
I hope some of you can use it in their projects :)
Notice: Please give me feedback for my first blog post!