比方說,我只是寫了下面的類,我開始寫一些單元測試吧:如何爲某些類(如定時器類)編寫單元測試?
http://www.ogre3d.org/docs/api/html/classOgre_1_1Timer.html
我將如何確保定時器僅由單元測試正常工作?例如,我可以測試以確保getMilliseconds()
始終大於開始時間,但這並不能告訴我getMilliseconds()
正在返回正確的增量時間。
有什麼建議嗎?
比方說,我只是寫了下面的類,我開始寫一些單元測試吧:如何爲某些類(如定時器類)編寫單元測試?
http://www.ogre3d.org/docs/api/html/classOgre_1_1Timer.html
我將如何確保定時器僅由單元測試正常工作?例如,我可以測試以確保getMilliseconds()
始終大於開始時間,但這並不能告訴我getMilliseconds()
正在返回正確的增量時間。
有什麼建議嗎?
理想情況下,你應該分離出操作系統調用,使這是一個使用虛擬功能,讓您可以存根出與自己的數據的操作系統調用自己的類。這可以讓你測試除了從OS返回的數據之外的所有內容都是正確的。
在我看來,這是一般的好主意。我已經開始將操作系統視爲您無法刪除的單例。最好將您使用Singleton的方式進行本地化,以便大部分代碼無法訪問它。
這就是說,有一些測試操作系統的技術。測試
一種技術是試圖讓OS做大致相同的事情有兩種不同的方式,並確保這兩個不同的方法或多或少投其所好。在這種情況下,我會建議使用某種sleep
函數。例如,在Unix上,您可以使用nanosleep
休眠幾分之一秒,然後進行測試,以確保您的計時器類測量的秒數部分差不多(在某個誤差範圍內)。
單元測試的核心思想是控制輸入以檢查輸出的行爲是否符合要求。
在這裏,你會(在某種程度上)需要控制提供類的時間參考能夠正確單元測試它的時鐘。
做不到這一點,你將不得不滿足於近似的結果,而且更糟糕的你可能最終是依賴於平臺的操作系統已測量時間的各種方式。儘管如此,它可能已經足夠好了。
一個例子:如果你有機會到一個時鐘,你可以檢查之類的東西的時間間隔:
outerStart = refClock.time();
start = timer.time();
innerStart = refClock.time();
// ...
innerEnd = refClock.time();
end = timer.time();
outerEnd = refClock.time();
然後,你應該有outerEnd - outerStart>結束 - 開始> innerEnd - innerStart,但隨着時間的推移,你可能有時間解決問題(如時鐘太不精確)。
您所提出的問題是在我腦海中了什麼和例子相似,我想到了,但測試失敗近似由於潛在高IMO這將使得單元測試這樣建立過程中的疼痛。但是對於這個例子來說+1,因爲如果沒有解決方案,它更可能是我可以使用的那個。 – Samaursa
你可能不會進行單元測試實時準確。如果你寫了這個類,那麼你可能正在調用某些返回時鐘時間的特定於OS的函數。您可以通過檢查它是否在每個操作系統上給出合理的響應來進行測試。
您可以對測試中的時間轉換進行單元測試,例如測試時的任何邏輯,方法是將對OS的調用截斷並返回您控制的值。
使用睡眠()與一些技巧,我設法單元測試我的計時器好(雖然不是非常精確)... – Gob00st