Giter VIP home page Giter VIP logo

critic.sh's Introduction

critic.sh

CI


Dead simple testing framework for Bash with coverage.

asciicast

git-cloc

Why?

I was looking for a Bash testing framework with a familiar API and with coverage reporting. Although there are excellent frameworks like bats-core, shunit2 and bashunit, I wasn't too comfortable with their API (not their fault). Also, I wanted some indication of coverage, so that it can be improved over time.

critic.sh exposes high level functions for testing consistent with other frameworks and a set of built in assertions. One of my most important goals was to be able to pass in any shell expression to the _test and _assert methods, so that one is not limited to the built-ins.

In addition, it can generate a lcov report. It tracks line and function coverage, but not branches. It works by running the tests with extended debugging, redirecting the trace output to a log file, and then parsing it to determine which functions/lines have been executed. It is currently a work in progress.

Requirements

Due to use of certain bashisms, Bash v4.1+ is required. This may change in the future.

A tiny docker image is provided for convenience.

Installation

There are a few ways to use critic.sh:

  • Use the docker image
docker run --rm -v $(pwd):/work checksum/critic.sh '/work/src/*.sh' '/work/lib/*.sh'

You can pass a CRITIC_SETUP environment variable to run setup scripts before the tests are run. The docker image is based on alpine linux, so use apk to install packages:

docker run --rm -e CRITIC_SETUP='apk add --no-cache jq' -v $(pwd):/work checksum/critic.sh '/work/src/*.sh' '/work/lib/*.sh'
  • Add this repository as a git submodule in your project
git submodule add https://github.com/Checksum/critic.sh critic
critic/critic.sh test.sh
  • Copy critic.sh file into your project (not recommended)

Usage

See examples/test.sh for detailed usage. To run the tests: bash examples/test.sh

Source the framework in your test file

# test-foobar.sh

# Include your source files
source foobar.sh
# Include the framework
source critic.sh

# Write tests
_describe foo
  _test "output should equal foo"
    _assert _output_equals "foo"

  _test "return code should be 0"
    _assert _return_true "Optional assertion message"

Pass the test file as an argument

critic.sh test-foobar.sh

API

The layout of a test is consistent with other frameworks. You _describe a test suite, _test a function or expression, and _assert the output with a function or expression. The output, return code and arguments passed to the test are available as variables for all custom assertions.

Test suite

Function Description Arguments
_describe Run test suite 1. Suite/Function name (*)
_describe_skip Skip this test suite 1. Suite/Function name (*)
_test Run a test 1. Test name (*)
2. Test function/expression
3. Arguments to forward to the test function
_test_skip Skip this test 1. Test name (*)
2. Test function/expression
3. Arguments to forward to the test function
_assert Run an assertion 1. Assertion function/expression (*)
2. Arguments to forward to the assertion function
_teardown Teardown function run after all tests have ben run

Assertions

Function Description Arguments
_return_true Return code == 0 1. Optional message
_return_false Return code != 0 1. Optional message
_return_equals Return code == num 1. Return code (*)
2. Optional message
_output_contains Output contains value 1. Value (*)
2. Optional message
_output_equals Output equals value 1. Value (*)
2. Optional message
_not Negate an assertion 1. Assertion (*)
2. Value (*)
3. Optional message
_nth_arg_equals Nth arg equals value 1. Argument index (>=0)
2. Value
3. Optional message

Variables

After every _test is run, the following variables are set. These are useful for custom assertions:

Variable Description
_output Output of the function/expression
_return Return code
_args Arguments passed to the function/expression

Options

Environment variable Description Default
CRITIC_COVERAGE_DISABLE Disable coverage false
CRITIC_COVERAGE_MIN_PERCENT Minimum coverage percent per source file 0
CRITIC_COVERAGE_REPORT_CLI Print coverage report to CLI true
CRITIC_COVERAGE_REPORT_LCOV Save lcov report true
CRITIC_COVERAGE_REPORT_HTML Generate HTML lcov report (requires lcov) false
CRITIC_DEBUG Prints more verbose messages false

Annotations

Disable coverage for certain lines by wrapping them in # critic ignore and # critic /ignore blocks:
# critic ignore
foo() {
  echo "This function will skipped when calculating coverage %"
}
# critic /ignore

critic.sh's People

Contributors

checksum avatar sdolenc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

critic.sh's Issues

skip/only support for suites/tests

Would be great to have a way to support skipping/running only certain test suites/tests. This will be tricky since _describe and _test are run immediately. I can think of two options:

  1. CRITIC_SUITE_ONLY, CRITIC_SUITE_SKIP for test suites
  2. _only, _skip function to wrap tests

Add tests

Testing frameworks also need tests!

_assert _ouput_contains does not work if optional message is specified

_output_contains is grep'ing for all following args ("$*") which breaks if you specify an optional message

Example:
Given a method that just:
echo "Gimme some foo"

Happy path:
_assert _output_contains "foo"

Unhappy path:
_assert _output_contains "foo" "there is foo"

Changing the _output_contains function to:
grep -Fqi "$1" <<< "$_output"
appears to fix the issue.

CI tests verifying bash version support

First of all: great work! I especially love the coverage feature.

I put together some circleci tests that runs the test script with different bash versions

I believe the readme said bash 4.1 and above should work, but I can only get debian versions "buster" (bash 5) and "stretch" (bash 4.4) to pass successfully.

Would you prefer I describe the errors I'm seeing as separate issues or each one within this issue?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.