除了综合报道和shunit2我的壳单元测试工具概述还包括assert.sh和shelltestrunner。
我大体上同意综述作者对shunit2的批评(其中有些是主观的),因此在查看了文档和示例后,我排除了shunit2。虽然,对jUnit有一定的经验确实很熟悉。
我认为shelltestrunner是我看过的最原始的工具,因为它使用简单的声明式语法来定义测试用例。像往常一样,任何抽象级别都以灵活性为代价提供了一些便利。即使如此,简单性还是很吸引人,我发现该工具对我的情况而言过于局限,主要是因为缺乏定义setup / tearDown操作的方法(例如,在测试之前操作输入文件,在测试之后删除状态文件)等)。
起初,我有点困惑,assert.sh只允许声明输出或退出状态,而我同时需要两者。时间足够长,可以使用总结来编写几个测试用例。但是我很快发现综述的set -e
模式很不方便,因为在某些情况下,除了stdout之外,还希望将非零退出状态作为一种传递结果的方法,这会使测试用例在所述模式下失败。示例之一显示了解决方案:
status=$(set +e ; rup roundup-5 >/dev/null ; echo $?)
但是,如果我既需要非零退出状态又需要输出怎么办?我当然可以set +e
在调用之前,整个测试案例set -e
之后或set +e
整个测试案例中使用。但这违反了综述的原则“一切都是断言”。因此,感觉就像我开始使用该工具一样。
到那时,我已经意识到assert.sh的“缺点”,即只允许声明退出状态或输出实际上是一个非问题,因为我可以通过test
这样的复合表达式进行传递
output=$($tested_script_with_args)
status=$?
expected_output="the expectation"
assert_raises "test \"$output\" = \"$expected_output\" -a $status -eq 2"
由于我的需求确实很基本(运行一套测试,显示一切正常或失败),所以我喜欢assert.sh的简单性,因此我选择了它。