unit testingbash脚本

我们有一个除了Java代码之外还有一些bash脚本运行的系统。 由于我们试图testing可能会中断的所有事情,而这些bash脚本可能会中断,所以我们要testing它们。

问题是很难testingbash脚本。

有没有testingbash脚本的方法或最佳做法? 或者我们应该退出使用bash脚本并寻找可testing的替代解决scheme?

实际上有一个shell脚本的unit testing框架 。 我自己没有用过,但可能值得一试。

以前也有类似的问题:

  • Shell脚本的unit testing
  • 在Shell脚本中testing任何协议

我从一个讨论组得到以下答案:

可以从一个外部文件中导入(包括,无论)一个过程(函数,不pipe它的名字是什么)。 这是编写testing脚本的关键:将脚本分解为独立的过程,然后将其导入到运行脚本和testing脚本中,然后让脚本尽可能简单。

这个方法就像脚本的dependency injection,听起来很合理。 避免bash脚本,并使用更多的可testing和不太模糊的语言是可取的。

符合TAP的Bashtesting: Bash自动testing系统

你为什么说testingbash脚本“很难”?

testing包装器有什么问题,例如:

#!/bin/bash set -e errors=0 results=$($script_under_test $args<<ENDTSTDATA # inputs # go # here # ENDTSTDATA ) [ "$?" -ne 0 ] || { echo "Test returned error code $?" 2>&1 let errors+=1 } echo "$results" | grep -q $expected1 || { echo "Test Failed. Expected $expected1" let errors+=1 } # and so on, et cetera, ad infinitum, ad nauseum [ "$errors" -gt 0 ] && { echo "There were $errors errors found" exit 1 } 

Epoxy是一个Bashtesting框架,主要是为了testing其他软件而devise的,但我也用它来testingbash模块,包括它本身和纸箱 。

主要优点是相对较低的编码开销,无限的断言嵌套和灵活的select断言来validation。

我做了一个演示,将其与BeakerLib进行了比较 – 这是一些红帽使用的框架。

尝试bashtest 。 这是testing脚本的简单方法。 例如,你有do-some-work.sh它改变一些configuration文件。 例如,添加新行PASSWORD = 'XXXXX'到configuration文件/etc/my.cfg

你可以逐行写入bash命令,然后检查输出。

安装:

 pip3 install bashtest 

创buildtesting是一个只写bash命令。

文件test-do-some-work.bashtest

 # run the script $ ./do-some-work.sh > /dev/null # testing that the line "PASSWORD = 'XXXXX'" is in the file /etc/my.cfg $ grep -Fxq "PASSWORD = 'XXXXX'" /etc/my.cfg && echo "YES" YES 

运行testing:

 bashtest *.bashtest 

你可以在这里和这里find一些例子

也许这可以使用,或贡献

https://thorsteinssonh.github.io/bash_test_tools/

打算在TAP协议中写出结果,我认为这对于CI来说是有好处的,对于那些需要shell环境的人来说是很好的。 我想象一些在shell环境中运行的东西,所以有些人可能会认为应该在shell环境中进行testing。

试试assert.sh

 source "./assert.sh" local expected actual expected="Hello" actual="World!" assert_eq "$expected" "$actual" "not equivalent!" # => x Hello == World :: not equivalent! 

希望能帮助到你!

我很喜欢shell2junit ,这是一个从Bash脚本testing中生成类似JUnit的输出的工具。 这很有用,因为生成的报告可以通过持续集成系统读取,例如Jenkins和Bamboo的JUnit插件。

虽然shell2junit并没有提供像shunit2这样的全面的Bash脚本框架,但它确实可以让你有很好的testing结果报告。

你可能想看看bash_unit:

https://github.com/pgrange/bash_unit

Python具有如此巨大的优势时,我发现很难certificate为更大的脚本使用bash是合理的:

  • Try / Except允许编写更强大的脚本,以便在发生错误时撤消更改。
  • 您不必使用模糊的语法,如“ if [ x"$foo" = x"$bar"]; then ... if [ x"$foo" = x"$bar"]; then ... “这很容易出错。
  • 使用getopt模块轻松parsing选项和参数(还有一个更简单的模块用于parsing参数,但是名字让我不知所措)。
  • Python允许你使用列表/字典和对象,而不是基本的string和数组。
  • 访问正确的语言工具,如正则expression式,数据库(当然,你可以把所有东西都放到bash中的mysql命令中,但这不是编写代码的最好方法)。
  • 不需要担心使用$*"$*""$@"$1"$1"的正确格式,文件名中的空格不是问题等等,等等。

现在我只使用bash来做最简单的脚本。