TL;博士
- 要查看中止消息,请将全局范围内的消息重定向到
stderr
using >&2
。
- 要在失败后中止所有
exit 1
文件,请在全局范围内使用。
- 要仅中止单个文件,请创建一个用于仅中止该文件中的测试的
setup
函数。skip
- 要使单个文件中的测试失败,请创建一个
setup
用于使该文件中的测试失败的函数return 1
。
答案更详细
中止所有文件
你的第二个例子几乎就在那里。诀窍是将输出重定向到stderr
1。
在全局范围内使用exit
或使用return 1
将停止整个测试套件。
#!/usr/bin/env bats
if [[ -z "$(type -t unzip)" ]]; then
echo "Missing dep unzip" >&2
return 1
fi
@test ...
缺点是中止文件中和之后的任何测试都不会运行,即使这些测试通过。
中止单个文件
更细粒度的解决方案是添加一个setup
2函数,如果依赖项不存在,该函数将为skip
3 。
由于该setup
函数是在定义它的文件中的每个测试之前调用的,因此如果缺少依赖项,则将跳过该文件中的所有测试。
#!/usr/bin/env bats
setup(){
if [[ -z "$(type -t unzip)" ]]; then
skip "Missing dep unzip"
fi
}
@test ...
失败而不是跳过
也有可能使具有未满足依赖性的测试失败。使用return 1
a 测试的setup
函数将使该文件中的所有测试失败:
#!/usr/bin/env bats
setup(){
if [[ -z "$(type -t unzip)" ]]; then
echo "Missing dep unzip"
return 1
fi
}
@test ...
由于消息输出不在全局范围内,因此不必将其重定向到sdterr
(尽管这也可以)。
脚注
在 wiki 和手册中关于 Bats-Evaluation-Process 的页面底部提到了这一点(如果您运行man 7 bats
):
CODE OUTSIDE OF TEST CASES
You can include code in your test file outside of @test functions.
For example, this may be useful if you want to check for
dependencies and fail immediately if they´re not present. However,
any output that you print in code outside of @test, setup or teardown
functions must be redirected to stderr (>&2). Otherwise, the output
may cause Bats to fail by polluting the TAP stream on stdout.
有关详细信息,setup
请参阅https://github.com/bats-core/bats-core#setup-and-teardown-pre--and-post-test-hooks
有关详细信息,skip
请参阅https://github.com/bats-core/bats-core#skip-easily-skip-tests