(平臺:Linux,特別是Fedora和紅帽企業Linux 6)確保測試用例可以刪除它創建的臨時目錄
我已經寫了一個Python integration test是執行以下操作:
- 創建一個臨時目錄
- 講述了一個web服務(apache下運行),運行一個rsync的工作是將文件複製到該目錄
- 檢查文件是否已正確複製(即配置是正確傳遞FR OM通過對通過Web服務的rsync的調用)客戶端
- (嘗試)刪除臨時目錄
目前,最後一步失敗,因爲rsync的創造與他們擁有一套文件那是apache用戶,所以測試用例沒有必要的權限來刪除這些文件。
這個Server Fault question提供了一個很好的解釋,爲什麼清理步驟目前失敗,因爲集成測試設置的情況。
我目前的工作:我只是不刪除測試清理中的臨時目錄,因此這些集成測試會將需要從/tmp
中手動清除的虛擬文件留下。
我目前正在考慮的主要解決方案是專門添加一個setuid腳本來處理測試套件的清理操作。這應該工作,但我希望別人可以建議一個更優雅的解決方案。具體來說,如果集成測試客戶端沒有必要關心apache進程的uid,我真的很喜歡它。
途徑我考慮,但拒絕以各種理由:
- 運行測試用例的根。這實際上可行,但需要以root身份運行測試套件相當難看。
- 在測試套件創建的目錄上設置sticky位。據我所知,rsync忽略了這一點,因爲它設置爲從遠程服務器複製標誌。但是,即使調整設置以僅複製執行位似乎沒有幫助,所以我仍然不確定爲什麼這不起作用。
- 將測試用戶添加到apache組。由於rsync在創建沒有寫入權限的文件時沒有幫助。
- 運行一個Apache實例作爲測試用戶並進行測試。這有一些優點(因爲集成測試不會要求apache已經在運行),但是有缺點,我將無法對已經預先配置了生產設置的Apache實例運行集成測試,確保那些是正確的。因此,即使我最終可能將此功能添加到測試套件中,它也不會作爲更直接解決當前問題的替代品。
我真的不想做的另一件事是更改傳遞給rsync的設置,以便測試套件可以正確地清理臨時目錄。這是服務守護進程的集成測試,因此我想盡可能使用盡可能接近生產的配置。
你應該只需要寫權限的目錄包含的母公司,而不是單個文件。 –
爲了單獨測試的目的,您可以像測試一樣運行Web服務嗎?或者,您可以提供另一項服務來清理正在使用的目錄,但這對我來說不那麼幹淨。 –
@詹姆斯:恩,好點。我一直在針對已經運行的Web服務器實例運行這些集成測試,因爲它的啓動時間並不好,但爲了更好地控制文件權限,它可能是值得的。 – ncoghlan