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 bakeis called if$DOCKER_BAKEis set (with its contents as the arguments). - The environment variable
TESTINGis set to1while running tests. - The following arguments are set by default:
--jobs(with the number of processors or4or 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
nounsetshell option): - Helper script with the name
_setup.share automatically sourced
(with the_setup.shlocated in the same directory as thebatstest 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
--filteroption is to prefix a test name withxorX:The above example will only execute@test "foo" { ... } @test "Xbar" { ... }
Xbarwithout you having to change the command line. - Several extensions are provided:
copy_fixtureto handle fixturesexpectfor 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: testAll 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_USERName of the main user (default:bats)APP_GROUPName of the main user's group (default:bats)DEBUGWhether to log debug information (default:0)TZTimezone the container runs in (default:UTC)LANGLanguage/locale to use (default:C.UTF-8)PUIDUser ID of thelibguestfsuser (default:1000)PGIDGroup ID of thelibguestfsgroup (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:localgit 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:edgeWant 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.