Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/nextrevision/testdummy
A Shell Script Testing Framework
https://github.com/nextrevision/testdummy
Last synced: 19 days ago
JSON representation
A Shell Script Testing Framework
- Host: GitHub
- URL: https://github.com/nextrevision/testdummy
- Owner: nextrevision
- License: mit
- Created: 2015-08-12T19:10:15.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2015-10-20T18:31:07.000Z (about 9 years ago)
- Last Synced: 2023-04-04T06:18:03.395Z (over 1 year ago)
- Language: Shell
- Homepage:
- Size: 168 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
testdummy
=========[![Circle CI](https://circleci.com/gh/nextrevision/testdummy.svg?style=svg)](https://circleci.com/gh/nextrevision/testdummy)
A shell script testing framework
## Installation
curl --silent -o testdummy https://raw.githubusercontent.com/nextrevision/testdummy/master/testdummy
chmod +x testdummy## Usage
usage: ./testdummy [args] testfile
-h|--help Help
-d|--debug Enabled debug logging
-v|--verbose Enables verbose logging
--nocolor Disable color output
--version Prints the version and exits## Examples
Take a look at the example script and testfile in `examples/`. It can be
run with the following command:./testdummy examples/myscript-test.sh
Results in the following output:test functions
test main function with no args [PASS]
test main function args [PASS]
test error function [PASS]
test usage function [PASS]test runtime execution
test myscript with no args [PASS]
test myscript with args [PASS]failing functions
test myscript with args failure [FAIL]
test myscript mode [FAIL]
-------------------------------------------------------------
Tests: 8 | Passed: 6 | Failed: 2 | Time: 0s## Writing Tests
Tests can be stored in any file, so long as that file can be read by the user
executing the script. `testdummy` sources the file and looks for functions with
specific prefixes and then executes them sequentially.If you are writing tests for a script, the first thing you probably want to do
is source your script like so:source myscript.sh
It's probably useful to surround the entry point of your script with a condition
to ensure that when sourcing, it does not behave the same as when executing. For
example:# allow for sourcing
if [[ $(basename ${0//-/}) == "myscript.sh" ]]; then
main_function_to_call
fiTests can be defined in functions with specific prefixes. Given the following
function in our script `myscript.sh`:_usage() {
echo "usage: $0 [args]"
}We could write a test like so:
test_usage_function() { _usage | grep -E '^usage:\s'; }
All tests should be wrapped inside of a `testdummy` prefixed function to avoid
any issues when first sourcing the testfile.#### Test Prefixes
`testdummy` reserves and looks for the following prefixes in function names in
order to know just what to execute:* `test_`
* `do_`
* `it_`Functions will be passed over (not executed) unless they start with one of these
prefixes.### Helpers and Matchers
`testdummy` exposes a set of useful builtin functions for testing commands and
functions.#### `describe ""`
`describe` is a purely organizational helper that is used for grouping sets of
tests in the output.Given the following test file:
describe "test cli flags"
it_responds_to_help_flag() { ... }
it_responds_to_verbose_flag() { ... }describe "test private functions"
test_usage_function() { ... }We could expect the following output:
test cli flags
it responds to help flag [PASS]
it responds to verbose flag [PASS]test private functions
test usage function [PASS]#### `cmd ""`
`cmd` is executed within a test function and takes a single string argument
that represents the command to execute. `cmd` does not react to failures or
output, but rather stores that information to be tested by other matchers
within the same function.test_echo_function() {
cmd "echo 'this will pass'"
}
test_false_function() {
# will not exit or fail the test
cmd "/bin/false"
}#### `assert_rc `
Asserts that the command executed by the `cmd` function returned the specified
code. If the code does not match, the test function will fail.Example:
describe "passing test"
test_echo_function() {
cmd "echo 'this will pass'"
assert_rc 0
}
describe "failing test"
test_false_function() {
cmd "/bin/false"
assert_rc 1
}#### `assert_content ""`
Asserts that the output of the command executed by the `cmd` function contains
the content of ``. If the output does not, then the test function will
fail. The contents of `` can also be a regex pattern.Example:
describe "passing test"
test_echo_function() {
cmd "echo 'this will pass'"
assert_content "will pass"
assert_content '^this\s\w+'
}
describe "failing test"
test_false_function() {
cmd "echo 'this will fail'"
assert_content "banana"
}#### Custom
Anything is permitted inside of a `testdummy` test function. There are no
requirements around using the builtin matchers or helpers.Example:
describe "passing test"
test_echo_function() {
echo "this will pass" | grep -q "pass"
[ $? -eq 0 ]
}
describe "failing test"
test_false_function() {
echo "this will fail" | grep -q "pass"
[ $? -eq 0 ]
}