![](/img/trans.png)
[英]bats - how can i write errors to a log file instead of the general output + run tests in parralel?
[英]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")
這樣做的正確方法是什么? 我不想更改它的集合名稱只是為了在不同的測試之間回顯文件名。
謝謝。
只需使用前綴消息和#
並將其重定向到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
}
最簡單的解決方案是迭代所有測試文件並自己輸出文件名:
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
) @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
}
這里的主要缺點是沒有保證,其中輸出是最有可能結束。
從@test
, setup
和teardown
功能外部添加輸出可能會導致意外結果。
對於每個測試,這樣的代碼也將被調用(至少)一次,從而減慢執行速度。
作為最后的手段,您可以自己修補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.