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

时间:2014-06-27 04:06:19

标签: bash testing integration-testing bats-core

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

#!/usr/bin/env bats

for i in ./*;do
  @test "testing $i" {
    pwd
  }  
done

2 个答案:

答案 0 :(得分:1)

当BATS运行测试时,首先对文件进行预处理。 1

这会将@test块替换为实际功能,并将添加到 那个功能。

然后将结果存储在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. 此代码中使用的变量命名方案是系统的改编 匈牙利语,http://blog.pother.ca/VariableNamingConvention/
  3. 解释
  4. NAKAI建议的解决方案存在其他问题,由同一过程引起。

答案 1 :(得分:-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