如何以编程方式添加蝙蝠测试?

问题描述 投票:0回答:3

我想为目录中的每个文件创建一个 BATS 测试,但我不确定完成此操作的最佳方法是什么。即使目录中有很多文件,下面的方法也只会创建一个测试。

#!/usr/bin/env bats

for i in ./*;do
  @test "testing $i" {
    pwd
  }  
done
bash testing integration-testing bats-core
3个回答
2
投票

当 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

脚注

  1. https://github.com/bats-core/bats-core/wiki/Bats-Evaluation-Process
  2. 此代码中使用的变量命名方案是对 Systems 的改编 匈牙利语的解释见 http://blog.pother.ca/VariableNamingConvention/
  3. NAKAI 建议的解决方案还存在由同一过程引起的其他问题。

0
投票

自从 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

-1
投票

这个怎么样?

#!/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
© www.soinside.com 2019 - 2024. All rights reserved.