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



#!/usr/bin/env bash
source                             # load the framework

shakedown 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 string

shakedown POST / -d 'q=Shakedown'               # make a POST request with form data
  status 200
  contains 'Bob Seger'
Run this code

Run the tests against a base URL:

$ ./ -u
Starting shakedown of

GET /about
 ✔ status 200
 ✔ Content-Type: text/html
 ✔ header Expires
 ✔ contains "Take back your privacy!"

 ✔ status 200
 ✔ contains "Bob Seger"

Shakedown complete. 2 passed, 0 failed.


shakedown <VERB> <PATH> <CURL OPTIONS>


status          <code>           Response status code = <code>
contains        <string>         Response body contains <string>
matches         <regex>          Response body matches <regex>
header          <string>         Response headers contains <string>
no_header       <string>         Response headers do not contain <string>
content_type    <string>         Content-Type header contains <string>
header_contains <name> <string>  Response header <name> contains <string>

HTTP Authentication

Use the -c option to provide credentials.

./ -u -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.


To help diagnose failing tests use print_headers, print_body, or make cURL verbose with '-v'.

More Examples

#!/usr/bin/env bash
source                               # load the framework

shakedown 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 regex

shakedown HEAD /                                  # make a HEAD request
  status 302

shakedown 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 201

shakedown GET -L            # provide full url to override default base url.
  status 200                                      # -L cURL option to follow redirects

shakedown GET
  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.
Run this code

Environment variables

The environment variables SHAKEDOWN_URL and SHAKEDOWN_CREDENTIALS can be used instead of passing -u and -c options.


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:

ls -1 test-*.sh | parallel bash


docker run -v "$PWD":/work robwhitby/shakedown /work/ -u