我在Django中編寫了一個拍賣系統。我想編寫單元測試,但應用程序對時間很敏感(例如,廣告客戶收取的金額是他們的廣告在網站上活躍的時間的函數)。測試這種類型的應用程序有什麼好方法?在Python中測試對時間敏感的應用程序
這裏是一個可能的解決方案:一個DateFactory class,其提供了一些方法,以產生在測試可預測日期和生產中的實時值。您對這種方法有任何想法,或者您在實踐中嘗試過其他方法嗎?
我在Django中編寫了一個拍賣系統。我想編寫單元測試,但應用程序對時間很敏感(例如,廣告客戶收取的金額是他們的廣告在網站上活躍的時間的函數)。測試這種類型的應用程序有什麼好方法?在Python中測試對時間敏感的應用程序
這裏是一個可能的解決方案:一個DateFactory class,其提供了一些方法,以產生在測試可預測日期和生產中的實時值。您對這種方法有任何想法,或者您在實踐中嘗試過其他方法嗎?
在你提供的鏈接,筆者有點拒絕添加額外的參數,以你的方法進行單元測試着想的想法,但在某些情況下,我認爲你可以證明這只是爲你的業務邏輯的延伸。在我看來,這是一種控制反轉的形式,可以使你的模型更靈活,甚至更具表現力。例如:
def is_expired(self, check_date=None):
_check_date = check_date or datetime.utcnow()
return self.create_date + timedelta(days=15) < _check_date
本質上這可以讓我的單元測試提供自己的日期/時間來驗證我的邏輯。
中所引用的博客的說法似乎是這個渣土了API。但是,我遇到了生產使用情況,要求用替代值取代當前日期/時間。換句話說,控制方法的倒置最終成爲我的應用程序的必要部分。
一般來說,我儘量使生產代碼起飛日期對象作爲輸入(其中語義允許的話)。在許多測試情況下,您描述的DateFactory就是人們所做的。
在Python中你也可以逃脫改變靜態模塊方法直接Datetime.now或Time.now。您需要小心謹慎地在測試的拆解部分替換它們。當你不能(或者很尷尬)改變你正在測試的類時,這是特別有用的。
要做到這一點,你有
def setUp(self)
self.oldNow = Datetime.now
Datetime.now = self._fakenow
...
def tearDown(self)
Datetime.now = self.oldNow
我做最後的換人是否有該安裝方法將失敗絲毫的方法可行。
對於許多情況下,定製DateFactory使用更安全,特別是如果你不必擔心忘記的人拆機部分。