Unit testing for shell scripts

前端 未结 6 544
暖寄归人
暖寄归人 2020-12-04 06:17

Pretty much every product I\'ve worked on over the years has involved some level of shell scripts (or batch files, PowerShell etc. on Windows). Even though we wrote the bul

6条回答
  •  星月不相逢
    2020-12-04 07:11

    Roundup by @blake-mizerany sounds great, and I should make use of it in the future, but here is my "poor-man" approach for creating unit tests:

    • Separate everything testable as a function.
    • Move functions into an external file, say functions.sh and source it into the script. You can use source `dirname $0`/functions.sh for this purpose.
    • At the end of functions.sh, embed your test cases in the below if condition:

      if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
      fi
      
    • Your tests are literal calls to the functions followed by simple checks for exit codes and variable values. I like to add a simple utility function like the below to make it easy to write:

      function assertEquals()
      {
          msg=$1; shift
          expected=$1; shift
          actual=$1; shift
          if [ "$expected" != "$actual" ]; then
              echo "$msg EXPECTED=$expected ACTUAL=$actual"
              exit 2
          fi
      }
      
    • Finally, run functions.sh directly to execute the tests.

    Here is a sample to show the approach:

        #!/bin/bash
        function adder()
        {
            return $(($1+$2))
        }
    
        (
            [[ "${BASH_SOURCE[0]}" == "${0}" ]] || exit 0
            function assertEquals()
            {
                msg=$1; shift
                expected=$1; shift
                actual=$1; shift
                /bin/echo -n "$msg: "
                if [ "$expected" != "$actual" ]; then
                    echo "FAILED: EXPECTED=$expected ACTUAL=$actual"
                else
                    echo PASSED
                fi
            }
    
            adder 2 3
            assertEquals "adding two numbers" 5 $?
        )
    

提交回复
热议问题