Bash and Test-Driven Development

前端 未结 8 1826
礼貌的吻别
礼貌的吻别 2020-12-04 15:33

When writing more than a trivial script in bash, I often wonder how to make the code testable.

It is typically hard to write tests for bash code, due to the fact tha

8条回答
  •  孤街浪徒
    2020-12-04 16:05

    Writing what Meszaros calls consumer tests is hard in any language. Another approach is to verify the behavior of commands such as rsync manually, then write unit tests to prove specific functionality without hitting the network. In this slightly-modified example, $run is used to print the side-effects if the script is run with the keyword "test"

    function distribute {
        local file=$1 ; shift
        for host in $@ ; do
            $run rsync -ae ssh $file $host:$file
        done
    }
    
    if [[ $1 == "test" ]]; then
        run="echo"
    else
        distribute schedule.txt $*
        exit 0
    fi
    
    #    
    # Built-in self-tests
    #
    
    output=$(mktemp)
    expected=$(mktemp)
    set -e
    trap "rm $got $expected" EXIT
    
    distribute schedule.txt login1 login2 > $output
    cat << EOF > $expected
    rsync -ae ssh schedule.txt login1:schedule.txt
    rsync -ae ssh schedule.txt login2:schedule.txt
    EOF
    diff $output $expected
    echo -n '.'
    
    echo; echo "PASS"
    

提交回复
热议问题