Bats Wrapper is a self-contained wrapper to run tests based on the Bash testing framework Bats with some differences:
- To facilitate testing of Dockerfiles the Docker command line tools is pre-installed and
docker buildx bake
is called if$DOCKER_BAKE
is set (with its contents as the arguments). - The environment variable
TESTING
is set to1
while running tests. - The following arguments are set by default:
--jobs
(with the number of processors or4
or they cannot be determined)--no-parallelize-within-files
--no-tempdir-cleanup
--recursive
--timing
- The following extensions are loaded by default (and patched to support the
nounset
shell option): - Helper script with the name
_setup.sh
are automatically sourced
(with the_setup.sh
located in the same directory as thebats
test file sourced last)πwork β¬ οΈ you are here ββπsrc ββπtest ββπ§_setup.sh β¦ automatically sourced ββπfoo.bats ββπbar ββπ§_setup.sh β¦ automatically sourced ββπbaz.bats
- The working directory for each test is
$BATS_TEST_TMPDIR
. - To focus on a single or a couple of tests an alternative to the
--filter
option is to prefix a test name withx
orX
:The above example will only execute@test "foo" { ... } @test "Xbar" { ... }
Xbar
without you having to change the command line. - Several extensions are provided:
copy_fixture
to handle fixturesexpect
for tests that require interaction- Check wrapper.sh for all extensions.
git clone https://github.com/bkahlert/bats-wrapper.git
cd bats-wrapper
# Build image and output to docker (default)
docker buildx bake
# Build multi-platform image
docker buildx bake image-all
- Docker Hub
bkahlert/bats-wrapper
- GitHub Container Registry
ghcr.io/bkahlert/bats-wrapper
Following platforms for this image are available:
- linux/amd64
- linux/arm64/v8
The Docker container passes all arguments to the wrapped Bash testing framework Bats and therefore inherits all its supported options.
docker run -it --rm \
-e TERM="$TERM" \
-v "$PWD":"$PWD" \
-w "$PWD" \
bkahlert/bats-wrapper [OPTIONS] TEST [TEST...]
The Bats Wrapper batsw
needs nothing but a working Docker installation and either curl
, wget
,
or wget2
:
curl -LfsS https://git.io/batsw | "$SHELL" -s -- [OPTIONS] TEST [TEST...]
wget -qO- https://git.io/batsw | "$SHELL" -s -- [OPTIONS] TEST [TEST...]
wget2 -nv -O- https://git.io/batsw | "$SHELL" -s -- [OPTIONS] TEST [TEST...]
The Bats Wrapper can also be used to run your Bats based tests right inside your GitHub workflow.
jobs:
docs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Run Bats tests
id: bats
uses: bkahlert/bats-wrapper@v0.1.4
with:
tests: test
All described options can be used to customize the test run. Please consult action.yml for detailed information.
This image can be configured using the following options of which all but APP_USER
and APP_GROUP
exist as bothβbuild argument and environment variable.
You should go for build arguments if you want to set custom defaults you don't intend to change (often). Environment variables will overrule any existing
configuration on each container start.
APP_USER
Name of the main user (default:bats
)APP_GROUP
Name of the main user's group (default:bats
)DEBUG
Whether to log debug information (default:0
)TZ
Timezone the container runs in (default:UTC
)LANG
Language/locale to use (default:C.UTF-8
)PUID
User ID of thelibguestfs
user (default:1000
)PGID
Group ID of thelibguestfs
group (default:1000
)
# Build single image with build argument TZ
docker buildx bake --build-arg TZ="$(date +"%Z")"
# Build multi-platform image with build argument TZ
docker buildx bake image-all --build-arg TZ="$(date +"%Z")"
# Start container with environment variable TZ
docker run --rm \
-e TZ="$(date +"%Z")" \
-v "$(pwd):$(pwd)" \
-w "$(pwd)" \
bats-wrapper:local
git clone https://github.com/bkahlert/bats-wrapper.git
cd bats-wrapper
# Use Bats wrapper to build the Docker image and run the tests
chmod +x ./batsw
DOCKER_BAKE="--set '*.tags=test'" BATSW_IMAGE=test:latest \
./batsw --batsw:-e --batsw:BUILD_TAG=test test
- To avoid permission problems with generated files, you can use your local user/group ID (see
PUID
/PGID
). - If you need access to Docker, its command line interface is already installed.
You can control your host instance by mounting/var/run/docker.sock
.
docker run -it --rm \
-e PUID="$(id -u)" \
-e PGID="$(id -g)" \
-e TERM="$TERM" \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD":"$PWD" \
-w "$PWD" \
bkahlert/bats-wrapper:edge
Want to contribute? Awesome! The most basic way to show your support is to star the project, or to raise issues. You can also support this project by making a Paypal donation to ensure this journey continues indefinitely!
Thanks again for your support, it is much appreciated! π
MIT. See LICENSE for more details.