Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/robwhitby/shakedown
A tiny Bash DSL for HTTP testing
https://github.com/robwhitby/shakedown
bash http smoke-test test-framework
Last synced: 3 months ago
JSON representation
A tiny Bash DSL for HTTP testing
- Host: GitHub
- URL: https://github.com/robwhitby/shakedown
- Owner: robwhitby
- License: apache-2.0
- Created: 2015-08-16T13:26:32.000Z (over 9 years ago)
- Default Branch: main
- Last Pushed: 2024-04-17T13:45:56.000Z (9 months ago)
- Last Synced: 2024-08-02T06:25:57.639Z (6 months ago)
- Topics: bash, http, smoke-test, test-framework
- Language: Shell
- Homepage:
- Size: 27.3 KB
- Stars: 103
- Watchers: 6
- Forks: 8
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# shakedown
A tiny Bash DSL for HTTP testing with zero dependencies*.
Make HTTP requests and assert on the response body and headers.
* unless you count cURL and grep
## Example
Create `test.sh`:
```bash
#!/usr/bin/env bash
source shakedown.sh # load the frameworkshakedown GET /about # make a GET request
status 200 # assert response status is 200
content_type 'text/html' # assert Content-Type header contains string
header 'Expires' # assert response header exists containing string
contains 'Take back your privacy!' # assert response body contains stringshakedown POST / -d 'q=Shakedown' # make a POST request with form data
status 200
contains 'Bob Seger'
```Run the tests against a base URL:
```
$ ./test.sh -u https://duckduckgo.com
Starting shakedown of https://duckduckgo.comGET /about
✔ status 200
✔ Content-Type: text/html
✔ header Expires
✔ contains "Take back your privacy!"POST /
✔ status 200
✔ contains "Bob Seger"Shakedown complete. 2 passed, 0 failed.
```## DSL
```
shakedown
...
```## Assertions
```
statusResponse status code =
contains Response body contains
matches Response body matches
header Response headers contains
no_header Response headers do not contain
content_type Content-Type header contains
header_contains Response header contains
```## HTTP Authentication
Use the -c option to provide credentials.```./test.sh -u my.domain.com -c user:pass```
## Setting cURL options
Any parameters after the path are passed straight on to cURL.e.g. To send form data, follow redirects and set verbose output.
```shakedown POST /search -d 'query=shakedown' -L -v```
## Exit code
The exit code is set to the number of failed tests.## Debugging
To help diagnose failing tests use ```print_headers```, ```print_body```, or make cURL verbose with '-v'.## More Examples
```bash
#!/usr/bin/env bash
source shakedown.sh # load the frameworkshakedown GET /foo # make a GET request
status 404 # assert on http status code
content_type 'text/html' # assert Content-Type header contains string
contains 'Not found' # assert body contains string
matches 'No.*' # assert body matches regexshakedown HEAD / # make a HEAD request
status 302shakedown GET / -H 'Accept: application/json' # add curl options
print_headers # output response headers for debugging
print_body # output response body for debugging
status 200
header 'Expires'shakedown PUT /user/1 -d name=Rob # make a PUT request
status 201shakedown GET http://www.google.com -L # provide full url to override default base url.
status 200 # -L cURL option to follow redirectsshakedown GET http://www.google.com
header_contains 'Referrer-Policy' 'no-referrer' # assert header 'Referrer-Policy' contains value 'no-referrer'shakedown GET /about
contains "$(cat about.html)" | head -n1 # because this is a bash script we can read files etc.
```## Environment variables
The environment variables `SHAKEDOWN_URL` and `SHAKEDOWN_CREDENTIALS` can be used instead of passing -u and -c options.```SHAKEDOWN_URL=https://duckduckgo.com ./test.sh```
Request timeouts can be set with:
```
SHAKEDOWN_CONNECT_TIMEOUT=5 # sets the curl option --connect-timeout. defaults to 5 seconds.
SHAKEDOWN_MAX_TIME=30 # sets the curl option --max-time. defaults to 30 seconds.
```## Running tests in parallel
Divide your tests into multiple files, then run those in parallel, for example:```bash
export SHAKEDOWN_URL=https://duckduckgo.com
ls -1 test-*.sh | parallel bash
```## Docker
[![Push to DockerHub](https://github.com/robwhitby/shakedown/actions/workflows/docker.yml/badge.svg)](https://github.com/robwhitby/shakedown/actions/workflows/docker.yml)
```
docker run -t -v "$PWD":/work robwhitby/shakedown /work/sample-test.sh -u https://duckduckgo.com
```