蕭簫 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
想要清理文件夾內部分冗余文件,結果誤刪了同事剛合的代碼?
(例如,在rm -rf /usr/bin/test的/usr后面加了個空格,結果刪掉了整個/usr文件)
相比于其他語言,Bash自帶許多令人摸不著頭腦的設計,其中之一就是變量中間不能加空格。這就導致Bash在調試時,某些命令具有危險性,例如rm -rf是刪除文件夾下所有文件,一旦執行錯誤,可能會產生爆炸的效果。
現在,手殘黨的福音來了:GitHub上有一位朋友推出了一款Bash命令的測試框架Bach,助你檢測腳本里有沒有危險的成分。
△ 據開發者介紹,這款框架能讓你心情平靜
只要在測試腳本中導入這款Bach框架,就相當于服下了一劑后悔藥,能讓你趕緊改掉手殘寫錯的代碼提前測試Bash腳本的行為。
這樣,便能防止Bash的危險命令執行了錯誤的參數,從而帶來的災難性后果。
下圖是Bach框架中提供的一個名為 @do-not-panic 的 API,將它直接放進含有危險命令的測試方法后,可以避免出現不小心調用的情況。
△ 有用戶指出,這個API的名字非常友好
看起來再也不用刪庫跑路了。
使用方法也很簡單,只需要掌握幾個測試實例,就能輕松上手使用這款測試框架。(文末附框架代碼)
Bach測試方法
這款測試框架的優勢在于,它真的非常?。?0kB左右),下載后只要在編寫腳本測試前,用source命令導入一下Bach框架中的bach.sh,就能直接使用。
下圖是測試含rm -rf這樣的危險命令的樣例。
圖中可見,我們將需要執行的代碼部分寫在以test-開頭的方法中,Bach則會自動尋找與這個測試方法對應的-assert結尾的驗證。
△ 圖中是手殘的范例,變量抄都抄錯了
也就是說,Bach運行兩個方法時,會驗證兩個方法中執行的命令及其參數是否一致(圖中顯然不一致),如果不一致,測試結果便會失敗。
了解了測試腳本的方法,來看看怎么寫模擬命令。
用Bach模擬/直接調用命令
在Bach測試框架中,所提供的API都是以@開頭的。
其中,有一部分命令可以被模擬(Mock API),另外,如果不得不在測試時直接調用部分命令,Bach中也提供了直接執行這些命令的API。
鑒于command和xargs命令的特殊性,Bach很特別地為這兩個命令做了模擬。
在網頁的測試說明中,會對這些API進行統一說明。
△ API調用說明范例
簡單了解后,也許有用戶會問,就Unix遺留的某些值得吐槽的設計Bash本身特性而言,已經有不少測試的框架了,Bach到底特殊在哪里?
Bach測試原理
事實上,Bach最特別的地方,在于這是一個真正的Bash單元測試框架。
也就是說,Bach可以用于測試Bash中一些非常危險的命令,且不用擔心會產生任何后果。
畢竟在Bach中,沒有任何在PATH中的命令會被執行,除非明確地指定了路徑。
Bach驗證的是命令的調用,而非命令的結果,畢竟對于Shell腳本來說,最重要的是驗證命令的調用是否傳入了期望的參數或選項。
這款Bach測試框架與目前其他部分測試框架(如Bats、Shunit2等)的區別在于,后者實際上都會調用系統PATH中的命令,然而Bach是絕對安全的。
所以,即使是初學者,也可以安心地用Bach去練習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
— 完 —