我在 bash/shell 腳本方面沒有太多經驗,最近才開始使用 Bats 框架或庫撰寫一些帶有單元測驗的 bash 腳本。目前正在撰寫一個腳本,該腳本需要洗掉超過一定天數的檔案。下面是函式。
function deleteFilesOlderThan() {
echo "Deleting files older than $1 days"
eval "find ./test-files -mtime $1 -exec rm {} \;"
}
是否可以對上述功能進行單元測驗,因為它具有復雜的命令?如果不可能,我們可以用其他方式重寫上述函式,使其可進行單元測驗。請指教。
uj5u.com熱心網友回復:
從我的角度來看,您提出了三個不同的問題:
- 我的代碼好用嗎?
- 我如何為 BASH 撰寫一般測驗
- 我如何測驗這個特定的代碼?
因為這聽起來更像是代碼審查的請求,它可能更適合https://codereview.stackexchange.com/但無論如何我都會在這里回答......
該命令實際上并不那么復雜。但即使是這樣,您也將測驗代碼的副作用,而不是代碼本身。所以代碼的復雜性甚至都不重要......
無論如何,測驗看起來像這樣:
@test "deleteFilesOlderThan deletes files" {
# Arrange
touch -t 123412312345 ./test-files/test.txt
# Act
deleteFilesOlderThan 1000
# Assert
[ ! -f ./test-files/test.txt ]
}
您可以添加更多測驗,例如使用 檢查輸出assert_output,并檢查新檔案是否不會被洗掉。
無需重寫即可測驗代碼,但代碼中存在一些潛在問題:
正如評論中所述,這
eval并不是真正需要的。該find命令可以按原樣正常運行,而無需包裝在eval.沒有支票。沒有任何。完全沒有。您可能至少要檢查
$1實際提供的內容。您還可以檢查它是否為整數。你可以檢查它
test-files確實存在該
test-files目錄是硬編碼的。我會把它作為函式的引數。這樣,可以為測驗提供與實際使用不同的路徑。
這些更改可能如下所示:
function deleteFilesOlderThan() {
local days="${1:?Two parameters required: <days> <path>}"
local path="${2:?Two parameters required: <days> <path>}"
if [[ -n ${days} && ${days} = *[!0123456789]* ]]; then
echo "ERROR: Given days '${days}' is not an integer" >&2
elif [[ ! -d "${path}" ]]; then
echo "ERROR: Given path '${path}' is not a directory" >&2
else
echo "Deleting files older than ${1} days in ${path}"
find "${path}" -mtime " ${1}" -exec rm {} \;
fi
}
當然,既然有更多的代碼,也應該有更多的測驗。我將把它作為練習留給讀者。
如果您還不熟悉它,您可能需要查看shellcheck。如果您撰寫任何可能導致問題的代碼,它會警告您。
您可能還想查看shfmt(來自mvdan.cc/sh包)格式化 shell 腳本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/479320.html
