TL;博士
只需使用在消息前加上前缀并将其重定向到 fd3setup
的组合从函数中输出文件名(记录在项目 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
}
您的所有选择
只需使用 BASH
最简单的解决方案是迭代所有测试文件并自己输出文件名:
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(即
>&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 的代码,在 BATS 存储库上打开拉取请求,并希望 BATS 原生支持此功能。
结论
生活是一堆权衡。选择最符合您需求的解决方案。