防止刪庫悲劇發生,這裡有個Bash腳本測試框架,危險代碼一測便知

蕭簫 發自 凹非寺
量子位 報道 | 公眾號 QbitAI

想要清理文件夾內部分冗餘文件,結果誤刪了同事剛合的代碼?

(例如,在rm -rf /usr/bin/test的/usr後面加了個空格,結果刪掉了整個/usr文件)

相比於其他語言,Bash自帶許多令人摸不著頭腦的設計,其中之一就是變量中間不能加空格。這就導致Bash在調試時,某些命令具有危險性,例如rm -rf是刪除文件夾下所有文件,一旦執行錯誤,可能會產生爆炸的效果。

現在,手殘黨的福音來了:GitHub上有一位朋友推出了一款Bash命令的測試框架Bach,助你檢測腳本里有沒有危險的成分。

防止刪庫悲劇發生,這裡有個Bash腳本測試框架,危險代碼一測便知

據開發者介紹,這款框架能讓你心情平靜

只要在測試腳本中導入這款Bach框架,就相當於服下了一劑後悔藥,能讓你趕緊改掉手殘寫錯的代碼提前測試Bash腳本的行為。

這樣,便能防止Bash的危險命令執行了錯誤的參數,從而帶來的災難性後果。

下圖是Bach框架中提供的一個名為 @do-not-panic 的 API,將它直接放進含有危險命令的測試方法後,可以避免出現不小心調用的情況。

防止刪庫悲劇發生,這裡有個Bash腳本測試框架,危險代碼一測便知

有用戶指出,這個API的名字非常友好

看起來再也不用刪庫跑路了。

使用方法也很簡單,只需要掌握幾個測試實例,就能輕鬆上手使用這款測試框架。(文末附框架代碼)

Bach測試方法

這款測試框架的優勢在於,它真的非常小(50kB左右),下載後只要在編寫腳本測試前,用source命令導入一下Bach框架中的bach.sh,就能直接使用。

下圖是測試含rm -rf這樣的危險命令的樣例。

圖中可見,我們將需要執行的代碼部分寫在以test-開頭的方法中,Bach則會自動尋找與這個測試方法對應的-assert結尾的驗證。

防止刪庫悲劇發生,這裡有個Bash腳本測試框架,危險代碼一測便知

圖中是手殘的範例,變量抄都抄錯了

也就是說,Bach運行兩個方法時,會驗證兩個方法中執行的命令及其參數是否一致(圖中顯然不一致),如果不一致,測試結果便會失敗。

瞭解了測試腳本的方法,來看看怎麼寫模擬命令。

用Bach模擬/直接調用命令

在Bach測試框架中,所提供的API都是以@開頭的。

其中,有一部分命令可以被模擬(Mock API),另外,如果不得不在測試時直接調用部分命令,Bach中也提供了直接執行這些命令的API。

鑑於command和xargs命令的特殊性,Bach很特別地為這兩個命令做了模擬。

在網頁的測試說明中,會對這些API進行統一說明。

防止刪庫悲劇發生,這裡有個Bash腳本測試框架,危險代碼一測便知

API調用說明範例

簡單瞭解後,也許有用戶會問,就Unix遺留的某些值得吐槽的設計Bash本身特性而言,已經有不少測試的框架了,Bach到底特殊在哪裡?

Bach測試原理

事實上,Bach最特別的地方,在於這是一個真正的Bash單元測試框架

也就是說,Bach可以用於測試Bash中一些非常危險的命令,且不用擔心會產生任何後果。

畢竟在Bach中,沒有任何在PATH中的命令會被執行,除非明確地指定了路徑。

Bach驗證的是命令的調用,而非命令的結果,畢竟對於Shell腳本來說,最重要的是驗證命令的調用是否傳入了期望的參數或選項。

這款Bach測試框架與目前其他部分測試框架(如Bats、Shunit2等)的區別在於,後者實際上都會調用系統PATH中的命令,然而Bach是絕對安全的。

所以,即使是初學者,也可以安心地用Bach去練習Bash編程,且不用擔心任何誤操作。

防止刪庫悲劇發生,這裡有個Bash腳本測試框架,危險代碼一測便知

網頁內的代碼有非常友好詳細的註釋

聽起來簡直就像是為Bash設計的完美補丁。

當然,目前Bach依舊有所限制,例如它不能阻止直接使用絕對路徑的命令調用,也無法無法阻止 I/O 重定向等。

但這款測試框架依舊在不斷地更新,目前正在被寶馬集團和華為使用。

感興趣的小夥伴,可以期待一下它的後續,或是一同成為Bach框架的代碼貢獻者。

作者介紹

柴鋒,一位有著15年碼齡的軟件開發工程師,熟悉Unix/Linux系統、IT運維、自動化測試和持續交付。

傳送門

Bach測試框架地址https://github.com/bach-sh/bach/blob/master/README-cn.md

測試實例https://github.com/bach-sh/bach/blob/master/tests/bach-testing-framework.test.sh

— 完 —

量子位 QbitAI · 頭條號簽約

關注我們,第一時間獲知前沿科技動態


分享到:


相關文章: