Bash Automated Testing System
BATS is a framework for unit testing Bash scripts. The latest version can be found here: https://github.com/bats-core/bats-core
Testing will make sure changes to your script do not break stuff but you wont have to do this by hand every time, instead using BATS to automate it for you.
Bats test files have the ".bats" extension, and can be run like this: bats example.bats
.
Libraries
There’s two extra repos you’ll also want to check out and load at the start of your tests:
Example
An example test case might look like this:
#!/usr/bin/env bats
load 'bats-support/load'
load 'bats-assert-1/load'
@test "$(date '+%H:%M:%S') test help" {
run your_script.sh -h
[ "$status" -eq 0 ]
assert_output --partial "USAGE:"
}
@test "$(date '+%H:%M:%S') test invalid argument" {
run your_script.sh -invalid
[ "$status" -eq 1 ]
assert_output --partial 'Error: invalid or unknown arg(s)'
}
We’ll first display the time and some text, then test the output "your_script.sh" by running it.
The first case will pass if your_script.sh -h
outputs the text "USAGE:". There can also be other text output before and after since we assert a partial match.
The second case checks what the script would output on an invalid error and compares it to "Error: invalid or unknown arg(s)". If it’s the same, the test will pass.
More testing
If you need more complicated testing there’s also functions and variables. Two default functions are setup()
and teardown()
to set tests up.
A good way to run tests is to be able to call the functions inside your script directly, so you probably want to consider this beforehand.
Alternatively there’s also other frameworks available: