簡體   English   中英

bats - 如何在bats腳本中回顯文件名以進行報告

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

我運行了一些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( 在項目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
}

有幾點需要注意:

  • 輸出必須以哈希#開頭
  • 必須是一個空間 哈希之后
  • 輸出必須重定向到文件描述符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的代碼, 在BATS存儲庫上打開一個pull-request,並希望BATS本身支持此功能。

結論

生活是一堆權衡。 選擇最符合您需求的解決方案。

我已經想出了一種方法,但它需要你改變你在每個文件中處理個人設置的方式。

創建一個幫助文件,定義一個像Potherca所描述的設置功能:

global.bash

test_setup() { return 0; }

setup() {
  (($BATS_TEST_NUMBER==1)) \
    && echo "# --- $(basename "$BATS_TEST_FILENAME")" >&3

  test_setup
}

然后在測試中,您只需load 'global'而不是調用setup。

如果需要為特定文件創建設置,則不要創建setup功能,而是創建test_setup函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM