我运行了一些bats脚本来测试某些功能 如何在脚本中回显bats文件名?
我的蝙蝠脚本如下:
#!/usr/bin/env bats
load test_helper
echo $BATS_TEST_FILENAME
@test "run cloned mission" {
blah blah blah
}
我的报告显示为:
✓ 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
但得到了错误
2: syntax error:
operand expected (error token is ".bats
2")
这样做的正确方法是什么? 我不想更改它的集合名称,只是为了回显不同测试之间的文件名。
感谢。
答案 0 :(得分:3)
只需使用the (as yet) undocumented组合在setup
函数中输出文件名,然后将邮件前缀为#
并将其重定向到fd3
#!/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
}
最简单的解决方案是迭代所有测试文件并自行输出文件名:
for file in $(find ./ -name '*.bats');do
echo "--- TEST NAME IS ${file}"
bats "${file}"
done
此解决方案的缺点是您最后会丢失摘要。而是在每个文件之后给出摘要。
setup
功能 BATS中最简单的解决方案是从setup
函数输出文件名。我认为这是你所追求的解决方案。
代码如下所示:
setup() {
if [ "${BATS_TEST_NUMBER}" = 1 ];then
echo "# --- TEST NAME IS $(basename ${BATS_TEST_FILENAME})" >&3
fi
}
有几点需要注意:
#
>&3
)@test
下一个解决方案是在每个文件中添加以下内容作为第一个测试:
@test "--- TEST NAME IS $(basename ${BATS_TEST_FILENAME})" {
skip ''
}
这方面的缺点是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
然后可以在每个测试中加载:
#!/usr/bin/env bats
load output-test-name-helper
@test "run cloned mission" {
return 0
}
这里的主要缺点是没有保证 输出最有可能结束。
从@test
,setup
和teardown
功能外部添加输出可能会导致意外结果。
这样的代码也会在每次测试时被调用(至少)一次,从而减慢执行速度。
作为最后的手段,您可以自己修补BATS的代码,在the BATS repository上打开一个拉取请求,并希望BATS能够原生支持此功能。
生活是一堆权衡。选择最符合您需求的解决方案。
答案 1 :(得分:0)
我想出了一种方法来执行此操作,但这需要您更改处理每个文件中的单独设置的方式。
创建一个帮助程序文件,该文件定义了与上述Potherca相同的设置功能:
global.bash
:
test_setup() { return 0; }
setup() {
(($BATS_TEST_NUMBER==1)) \
&& echo "# --- $(basename "$BATS_TEST_FILENAME")" >&3
test_setup
}
然后在您的测试中,只需调用load 'global'
即可代替调用设置。
如果您需要为特定文件创建设置,则无需创建setup
函数,而可以创建test_setup
函数。