Bash 스크립트 테스트 방법(2020 가이드)

bash 스크립트를 어떻게 테스트합니까? 당신은 그들을 전혀 테스트합니까?

Bash 스크립팅은 모든 개발자가 작업을 자동화하고 일상적인 활동을 용이하게 하며 수고를 줄이는 데 도움이 되는 가장 편리한 도구 중 하나입니다. 그러나 자동화 도구는 코드와 같은 방식으로 처리되지 않으면 실제로 수고를 증가시킬 수 있습니다. Bash 스크립트는 구식이 되어 작동을 멈추고 유지 관리가 어려워지고 기술 부채가 증가할 수 있습니다. 버전 관리에서 확인하고 테스트를 작성하고 CI를 사용해야 합니다.

이 기사에서는 Bash용 테스트를 작성하는 자동화 스크립트의 품질을 개선하는 방법을 살펴보겠습니다.

바흐



Bach는 Bash 스크립트에 대한 단위 테스트를 작성할 수 있는 가능성을 제공하는 Bash용 테스트 프레임워크입니다. Bach는 PATH에 있는 모든 명령을 테스트된 Bash 스크립트의 외부 종속성으로 만들어 어떤 명령도 실제로 실행되지 않지만 "드라이 런"으로 실행됩니다. 이런 식으로 명령 자체가 아니라 스크립트의 논리를 테스트할 수 있습니다. Bach는 기본적으로 모든 명령을 모의하고 필요한 경우 실제 명령을 실행하기 위한 API 세트를 제공합니다.

바흐를 설치하는 방법



전제 조건



  • Bash  v4.3+

  • Coreutils  (GNU/리눅스)

  • Diffutils  (GNU/리눅스)

  • Bach Testing Framework 다운로드bach.sh를 프로젝트에 설치하려면 source 명령어를 사용하여 가져옵니다bach.sh.

    예를 들어:

    source path/to/bach.sh
    


    할 수 있는 일



    Bach에서는 Bash 스크립트가 실제로 실행할 내용을 테스트할 수 있습니다.

    Bach의 모든 테스트 케이스는 두 가지 기능으로 구성됩니다. 하나는 테스트 실행용이고 다른 하나는 어설션용입니다.

    테스트를 실행할 때 Bach는 두 기능을 별도로 실행하고 두 기능에서 실행되는 명령 순서를 비교합니다. 모든 테스트 기능은 이름 test-로 시작해야 하며, 주장 기능은 -assert로 끝나야 합니다.

    테스트 케이스를 작성하는 방법



    테스트 케이스를 작성하는 방법에 대한 몇 가지 실용적인 예를 살펴보겠습니다.

    #!/usr/bin/env bash
    set -euo pipefail
    source bach.sh
    


    Bach 테스팅 프레임워크를 활성화하기 위해 가장 먼저 할 일은 bash.sh를 소싱하는 것입니다.

    test-rm-your-dot-git() {
        @mock find ~ -type d -name .git === @stdout ~/src/your-awesome-project/.git \
                                                    ~/src/code/.git
        find ~ -type d -name .git | xargs -- rm -rf
    }
    test-rm-your-dot-git-assert() {
        rm -rf ~/src/your-awesome-project/.git ~/src/code/.git
    }
    


    우리가 테스트하는 첫 번째 스크립트는 모든 .git 폴더를 찾아 제거하는 명령입니다. 두 개의 디렉토리를 출력하기 위해 해당 매개변수로 find 명령을 조롱하여 테스트할 수 있습니다.

    test-mock-script-with-custom-complex-action() {
        @mock ./path/to/script <<\SCRIPT
    if [[ "$1" == foo ]]; then
      @echo bar
    else
      @echo anything
    fi
    SCRIPT
        ./path/to/script foo
        ./path/to/script something
    }
    test-mock-script-with-custom-complex-action-assert() {
        bar
        anything
    }
    


    두 번째 스크립트에서는 Bach를 사용하여 입력에 따라 다른 출력을 반환하는 스크립트를 테스트합니다. 이 경우 @mock ./path/to/script를 사용하여 스크립트를 조롱한 다음 스크립트 동작을 정의합니다.

    test-bach-framework-mock-commands() {
        @mock find . -name fn === @stdout file1 file2
    
        ls $(find . -name fn)
    
        @mock ls file1 file2 === @stdout file2 file1
    
        ls $(find . -name fn) | xargs -n1 -- do-something
    
        @mock ls === @stdout foo bar foobar
        ls | xargs -n2 -- bash -c 'do-something ${@}' -s
    }
    test-bach-framework-mock-commands-assert() {
        ls file1 file2
    
        do-something file2
        do-something file1
    
        bash -c 'do-something ${@}' -s foo bar
        bash -c 'do-something ${@}' -s foobar
    }
    


    이 스크립트에서 명령을 조롱하고 $(...) 표현식으로 실행하고 파이프를 사용하는 것과 같은 몇 가지 복잡한 작업을 수행하는 방법을 볼 수 있습니다.

    test-bach-framework-set--e-should-work() {
        set -e
    
        do-this
        builtin false
    
        should-not-do-this
    
    }
    test-bach-framework-set--e-should-work-assert() {
        do-this
        @fail
    }
    


    여기서 우리는 set -e 의 동작을 테스트하므로 builtin false 로 스크립트가 실패하도록 하고 @fail 를 사용하여 실패를 테스트합니다.

    test-no-double-quote-star() {
        @touch bar1 bar2 bar3 "bar*"
    
        function cleanup() {
            rm -rf $1
        }
    
        # We want to remove the file "bar*", not the others
        cleanup "bar*"
    }
    test-no-double-quote-star-assert() {
        # Without double quotes, all bar files are removed!
        rm -rf "bar*" bar1 bar2 bar3
    }
    
    test-double-quote-star() {
        @touch bar1 bar2 bar3 "bar*"
    
        function cleanup() {
            rm -rf "$1"
        }
    
        # We want to remove the file "bar*", not the others
        cleanup "bar*"
    }
    test-double-quote-star-assert() {
        # Yes, with double quotes, only the file "bar*" is removed
        rm -rf "bar*"
    }
    


    여기에서 인수를 가져와 제거하는 function를 정의합니다. 첫 번째 예에서는 함수에서 큰따옴표를 사용하지 않습니다. 이렇게 하면 bar-로 시작하는 모든 파일이 제거됩니다. 두 번째 예에서 함수는 큰따옴표를 사용하므로 bar*라는 파일만 제거됩니다.

    Bach 테스트를 실행하는 방법



    파일에 .sh를 추가하는 것을 기억하면서 모든 테스트 사례를 단일source bach.sh 파일에 작성할 수 있습니다. 이 시점에서 테스트를 실행하려면 .sh 파일을 실행하기만 하면 됩니다.

    이거 야!



    이 게시물에서는 자동화의 품질과 안정성을 개선하기 위해 Bash 스크립트에 대한 단위 테스트를 작성하는 방법을 살펴보았습니다.

    Twitter에서 저에게 연락하여 귀하의 생각을 알려주세요!

    이 기사는 원래 my blog에 게시되었습니다. 이 게시물이 마음에 드셨다면 다른 분들도 읽어보세요!

    좋은 웹페이지 즐겨찾기