Skip to main content

Bash script unit testing

 Bash script unit testing

Bash scripts are a powerful tool for automating tasks on Linux and Unix-based systems. However, as with any code, it's important to make sure that our scripts are working correctly before deploying them to production. One way to do this is by using unit testing.

Unit testing is a method of testing individual units or components of code, in isolation from the rest of the system. This allows us to catch errors early on and to ensure that our scripts are functioning as expected.

There are several tools available for unit testing bash scripts. One popular option is Bats (Bash Automated Testing System). Bats is a simple testing framework for bash scripts that allows you to write test cases in a simple, human-readable format.

Here's an example of how you might use Bats to test a simple bash script:

 

#!/usr/bin/env bats

@test "Check if script is executable" {
  run chmod +x myscript.sh
  [ "$status" -eq 0 ]
}

@test "Check if script runs without error" {
  run ./myscript.sh
  [ "$status" -eq 0 ]
}

@test "Check if script produces expected output" {
  run ./myscript.sh
  [ "$output" = "Hello, World!" ]
}

In this example, we're using three different test cases to check different aspects of our script. The first test checks that the script is executable. The second test checks that the script runs without error. And the third test checks that the script produces the expected output.

To run the tests, you simply need to execute the test file:

 $ bats myscript_test.sh

Bats will run all the test cases in the file and display the results in a clear, easy-to-read format. If any of the tests fail, you'll see an error message indicating which test failed and why.

Unit testing is an essential part of software development, and it's no different for bash scripts. By using tools like Bats, you can catch errors early on and ensure that your scripts are working as expected.

Comments

Popular posts from this blog

Manual Kubernetes TLS certificate renewal procedure

Intro Kubernetes utilizes TLS certificates to secure different levels of internal and external cluster communication.  This includes internal services like the apiserver, kubelet, scheduler and controller-manager etc. These TLS certificates are created during the initial cluster installation and are usually valid for 12 months. The cluster internal certificate authority (CA) certificate is valid for ten years. There are options available to automate certificate renewals, but they are not always utilised and these certs can become out of date. Updating certain certificates may require restarts of K8s components, which may not be fully automated either. If any of these certificates is outdated or expired, it will stop parts or all of your cluster from functioning correctly. Obviously this scenario should be avoided - especially in production environments. This blog entry focuses on manual renewals / re-creation of Kubernetes certificates. For example, the api-server certificate below exp

Deprecating Networking Ingress API version in Kubernetes 1.22

  Intro Kubernetes deprecates API versions over time. Usually this affects alpha and beta versions and only requires changing the apiVersion: line in your resource file to make it work. However with this Ingress object version change, additional changes are necessary. Basics For this post I am quickly creating a new cluster via Kind (Kubernetes in Docker) . Once done, we can see which API versions are supported by this cluster (version v1.21.1). $ kubectl api-versions | grep networking networking.k8s.io/v1 networking.k8s.io/v1beta1 Kubernetes automatically converts existing resources internally into different supported API versions. So if we create a new Ingress object with version v1beta1 on a recent cluster version, you will receive a deprecation warning - and the same Ingress object will exist both in version v1beta1 and v1. Create $ cat ingress_beta.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:   name: clusterpirate-ingress spec:   rules:   - http:       path

Analysing and replaying MySQL database queries using tcpdump

Why There are situations where you want to quickly enable query logging on a MySQL Database or trouble shoot queries hitting the Database server in real-time. Yes, you can enable the DB query log and there are other options available, however the script below has helped me in many cases as it is non intrusive and does not require changing the DB server, state or configuration in any way. Limitations The following only works if the DB traffic is not encrypted (no SSL/TLS transport enabled). Also this needs to be run directly on the DB server host (as root / admin). Please also be aware that this should be done on servers and data you own only. Script This script has been amended to suit my individual requirements. #!/bin/sh tcpdump -i any -s 0 -l -w - dst port 3306 | strings | perl -e ' while(<>) { chomp; next if /^[^ ]+[ ]*$/;   if(/^(ALTER|COMMIT|CREATE|DELETE|DROP|INSERT|SELECT|SET|UPDATE|ROLLBACK)/i) {     if (defined $q) { print "$q\n"; }     $q=$_;   } else {