DEV Community

Cover image for Tests Everywhere - Bash
Roger Viñas Alcon
Roger Viñas Alcon

Posted on • Edited on

Tests Everywhere - Bash

GitHub logo rogervinas / tests-everywhere

🤠 Tests, Tests Everywhere!

Bash testing this simple Hello World with BATS

Show me the code

Implementation

  1. Create helloMessage function in hello-message.bash:
function helloMessage() {
  echo "Hello World!"
}
Enter fullscreen mode Exit fullscreen mode
  1. Create helloConsole function in hello-console.bash:
function helloConsole() {
  local text=$1
  echo "$text"
}
Enter fullscreen mode Exit fullscreen mode
  1. Create helloApp function in hello-app.bash:
function helloApp() {
  local messageFn=$1
  local consoleFn=$2
  $consoleFn "$($messageFn)"
}
Enter fullscreen mode Exit fullscreen mode

Note that helloApp function receives the two other functions as parameters and just executes them.

  1. Create a main script hello.bash that just loads the 3 required scripts and executes helloApp passing helloMessage and helloConsole functions as parameters:
source "$(dirname "${BASH_SOURCE[0]}")/hello-message.bash"
source "$(dirname "${BASH_SOURCE[0]}")/hello-console.bash"
source "$(dirname "${BASH_SOURCE[0]}")/hello-app.bash"

helloApp helloMessage helloConsole
Enter fullscreen mode Exit fullscreen mode

Test

Following BATS Tutorial > Your first test ...

  1. For simplicity create all tests in hello.bats file

  2. Configure current directory and load some helper modules in setup function:

setup() {
  load 'test_helper/bats-support/load'
  load 'test_helper/bats-assert/load'

  DIR="$( cd "$( dirname "$BATS_TEST_FILENAME" )" >/dev/null 2>&1 && pwd )"
  PATH="$DIR/../src:$PATH"
}
Enter fullscreen mode Exit fullscreen mode
  1. Test helloMessage function using assert_output helper:
@test "helloMessage should return hello world" {
  source hello-message.bash
  run helloMessage

  assert_output "Hello World!"
}
Enter fullscreen mode Exit fullscreen mode
  1. Test helloApp function:
@test "helloApp should print hello message" {
  # 4.1 Create a helloMessage function mock
  # that will return "Hello Test!"
  function helloMessageMock() {
    echo "Hello Test!"
  }

  # 4.2 Create a helloConsole function mock
  # that will print parameter passed within "helloConsoleMock[...]"
  function helloConsoleMock() {
    local text=$1
    echo "helloConsoleMock[$text]"
  }

  # 4.3 Load helloApp function, the one we want to test
  source hello-app.bash
  # 4.4 Execute helloApp passing mock functions
  run helloApp helloMessageMock helloConsoleMock

  # 4.5 Assert helloConsoleMock has been called once
  # with the returned message by helloMessageMock
  assert_output "helloConsoleMock[Hello Test!]"
}
Enter fullscreen mode Exit fullscreen mode
  1. Test the whole hello.bash script too:
@test "hello.bash should print hello world" {
  run hello.bash

  assert_output "Hello World!"
}
Enter fullscreen mode Exit fullscreen mode
  1. Test output should look like:
hello.bats
 ✓ helloMessage should return hello world
 ✓ helloApp should print hello message
 ✓ hello.bash should print hello world

3 tests, 0 failures
Enter fullscreen mode Exit fullscreen mode

Take a look at the other Libraries and Add-ons that may be useful in the future. For example, there is a couple of bats-mock libraries that can be used to mock programs (but unfortunately not able to mock functions).

Happy Testing! 💙

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

AWS Security LIVE!

Hosted by security experts, AWS Security LIVE! showcases AWS Partners tackling real-world security challenges. Join live and get your security questions answered.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️