Nir*_*Tal 3 bash automation bats-core
我运行了一些bats脚本来测试某些功能,如何在脚本中回显 bats 文件名?
我的蝙蝠脚本看起来像:
#!/usr/bin/env bats
load test_helper
echo $BATS_TEST_FILENAME
@test "run cloned mission" {
blah blah blah
}
Run Code Online (Sandbox Code Playgroud)
为了使我的报告显示为:
? run cloned mission
? run cloned mission
? addition using bc
---- TEST NAME IS xxx
? run cloned mission
? run cloned mission
? addition using bc
---- TEST NAME IS yyy
? run cloned mission
? run cloned mission
? addition using bc
Run Code Online (Sandbox Code Playgroud)
但得到了错误
2: syntax error:
operand expected (error token is ".bats
2")
Run Code Online (Sandbox Code Playgroud)
正确的做法是什么?我不想更改它的集合名称只是为了在不同测试之间回显文件名。
谢谢。
只需setup使用为消息添加前缀#并将其重定向到 fd3(记录在项目 README 中)的组合从函数中输出文件名。
#!/usr/bin/env bats
setup() {
if [ "${BATS_TEST_NUMBER}" = 1 ];then
echo "# --- TEST NAME IS $(basename ${BATS_TEST_FILENAME})" >&3
fi
}
@test "run cloned mission" {
blah blah blah
}
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是迭代所有测试文件并自己输出文件名:
for file in $(find ./ -name '*.bats');do
echo "--- TEST NAME IS ${file}"
bats "${file}"
done
Run Code Online (Sandbox Code Playgroud)
此解决方案的缺点是最后会丢失摘要。相反,将在每个文件后给出摘要。
setup功能最简单的解决方案中BATS是输出从文件名setup功能。我认为这是您所追求的解决方案。
代码如下所示:
setup() {
if [ "${BATS_TEST_NUMBER}" = 1 ];then
echo "# --- TEST NAME IS $(basename ${BATS_TEST_FILENAME})" >&3
fi
}
Run Code Online (Sandbox Code Playgroud)
需要注意的几点:
#散列后的空格>&3)@test下一个解决方案是将以下内容添加为每个文件中的第一个测试:
@test "--- TEST NAME IS $(basename ${BATS_TEST_FILENAME})" {
skip ''
}
Run Code Online (Sandbox Code Playgroud)
这里的缺点是skipped测试数量会增加......
我能想到的唯一其他解决方案是创建一个位于全局范围内并跟踪其状态的测试助手。
这样的代码看起来像这样:
output-test-name-helper.bash
#!/usr/bin/env bash
create_tmp_file() {
local -r fileName="$(basename ${BATS_TEST_FILENAME})"
if [[ ! -f "${BATS_TMPDIR}/${fileName}" ]];then
touch "${BATS_TMPDIR}/${fileName}"
echo "---- TEST NAME IS ${fileName}" >&2
fi
}
remove_tmp_file() {
rm "${BATS_TMPDIR}/$(basename ${BATS_TEST_FILENAME})"
}
trap remove_tmp_file EXIT
create_tmp_file
Run Code Online (Sandbox Code Playgroud)
然后可以在每个测试中加载:
#!/usr/bin/env bats
load output-test-name-helper
@test "run cloned mission" {
return 0
}
Run Code Online (Sandbox Code Playgroud)
将主要在这里缺点是没有保证,其中输出是最有可能结束。
从@test,setup和teardown函数外部添加输出可能会导致意外结果。
此类代码也将(至少)为每个测试调用一次,从而减慢执行速度。
作为最后的手段,您可以自己修补 BATS 的代码,在 BATS 存储库上打开拉取请求,并希望 BATS 原生支持此功能。
人生就是一堆取舍。选择最符合您需求的解决方案。