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

时间:2018-01-23 09:58:24

标签: bash automation bats-core

我运行了一些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")

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

感谢。

2 个答案:

答案 0 :(得分:3)

TL; DR

只需使用the (as yet) undocumented组合在setup函数中输出文件名,然后将邮件前缀为#并将其重定向到fd3

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

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

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

这样的代码也会在每次测试时被调用(至少)一次,从而减慢执行速度。

打开拉取请求

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

结论

生活是一堆权衡。选择最符合您需求的解决方案。

答案 1 :(得分:0)

我想出了一种方法来执行此操作,但这需要您更改处理每个文件中的单独设置的方式。

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