bats - 我如何在 bats 脚本中回显文件名以进行报告

bats - how can i echo the file name in a bats script for reporting

我有一些 bats 脚本,我 运行 测试了一些功能 如何在脚本中回显 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")

正确的做法是什么? 我不想更改集名称,因为它只是为了在不同测试之间回显文件名。

谢谢。

TL;DR

只需使用 # 作为消息前缀并将其重定向到 fd3(已记录 in the project README)的组合,从 setup 函数输出文件名。

#!/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
}

注意几点:

  • 输出必须以哈希开头 #
  • 散列
  • 之后必须是space</code> <li>输出必须重定向到文件描述符 <strong>3</strong>(即 <code>>&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
}

这里的主要缺点是无法保证输出最有可能结束。

@testsetupteardown 函数外部添加输出可能会导致意外结果。

每次测试也会(至少)调用一次此类代码,从而减慢执行速度。

打开拉取请求

作为最后的手段,您可以自己修补 BATS 的代码,在 the BATS repository 上打开一个拉取请求,并希望 BATS 本机支持此功能。

结论

生活就是一堆取舍。选择最符合您需求的解决方案。

我已经想出了一个方法来做到这一点,但它需要您更改处理每个文件中的个人设置的方式。

创建一个帮助程序文件,该文件定义了一个与上述 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 函数。

echo放在setup中输出测试名称后的文件名。

我最后做的是将文件名添加到测试名称本身:

test "${BATS_TEST_FILENAME##*/}: should …" {
  …
}

此外,如果走 setup 路线,可以通过以下方式避免这种情况:

function setup() {
  echo "# --- $(basename "$BATS_TEST_FILENAME")" >&3

  function setup() {
    …
  }
  setup
}