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:
当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来做最简单的脚本。