我想为目录中的每个文件创建一个 BATS 测试,但我不确定完成此操作的最佳方法是什么。即使目录中有很多文件,下面的方法也只会创建一个测试。
#!/usr/bin/env bats
for i in ./*;do
@test "testing $i" {
pwd
}
done
当 BATS 运行测试时,首先对文件进行预处理。1
这用实际函数替换了
@test
块,并添加了一个调用 to
那个功能。
结果将作为
BATS_TMPDIR
存储在 bats.${PID}.src
中。
任何以编程方式添加的测试都需要添加到预处理文件中。
测试名称也必须添加到
BATS_TEST_NAMES
。
将所有这些放在一起,我们得到:2
#!/usr/bin/env bats
declare sFile sSourceFile sTestFunction sTestName
readonly sSourceFile="${BATS_TMPDIR}/bats.$$.src"
if [[ -f "${sSourceFile}" ]];then
for sFile in ./*;do
sTestFunction="test_${sFile}"
sTestName="Testing ${sFile}"
cat <<EOT >> "${sSourceFile}"
$sTestFunction() { bats_test_begin '$sTestName' 0;
return 0
}
bats_test_function "${sTestFunction}"
EOT
BATS_TEST_NAMES+=("${sTestFunction}")
done
fi
#EOF
示例的预处理版本如下所示:
#!/usr/bin/env bats
for i in ./*; do
test_testing_-24i() { bats_test_begin "testing $i" 4;
pwd
}
done
bats_test_function test_testing_-24i
非常有效,测试函数的声明次数与文件的数量一样多 展示。然而,测试函数仅被调用一次。3
自从 bats-core 1.11.0(于 2024 年 3 月 24 日发布)添加
bats_test_function
以来,现在这是可能的。此功能允许运行参数化或动态生成的测试。
因此,要对目录中的每个文件运行测试,您现在可以编写
#!/usr/bin/env bats
perform_test() {
# fill the actual test code here
}
for f in ./*; do
bats_test_function --description "testing $f" -- perform_test $f
done
这个怎么样?
#!/usr/bin/env bash
declare -r BATS=`mktemp`
trap "rm -f $BATS" EXIT
for i in $(ls)
do
cat > $BATS <<EOF
@test "testing $i" {
pwd
}
EOF
done
bats $BATS