本文的標題“如何在自動測試中模擬設備在案例中的行為”包含:“自動測試”、“設備”、“模擬”和“案例中的行為”。自動測試和設備是一對矛盾,自動測試要求避免人工操作,設備(掃描槍、讀卡器等)需要人工操作,克服該矛盾需要構建偽設備模擬設備行為。模擬完整的設備行為較困難,這里限定為模擬設備在案例中的行為。
調用設備功能一般通過調用庫函數實現,相同案例調用設備過程相同。可通過錄制回放的方式模擬行為:
- 錄制,記錄案例中庫函數的調用信息,包括順序、輸入輸出參數和返回值。
- 回放,編寫偽裝庫,按照日志記錄的信息響應自動測試中該案例的調用。
錄制回放要求在同一個案例中庫函數調用完全相同,該要求對需要跟蹤設備狀態的程序太嚴格,這樣的程序一般會有兩類調用邏輯,更新設備狀態和執行設備動作,這兩類相互穿插,因此很難保證庫函數調用的完全相同。盡管如此案例有其穩定性,這里對設備調用進行約定,方便提取其穩定特性:
- 庫函數分成狀態函數和動作函數,調用狀態函數不引起設備狀態變化(冪等),調用動作函數則可以引起設備狀態變化。
- 設備狀態可以根據時間自行變化,前后兩次狀態函數(中間沒有調用動作函數)返回結果不同。模擬的場景如設備門口有介質,一段時間后被人拿走。
- 調用動作函數和狀態自行變化的過程在同一個案例中相同。
基于上述約定對日志進行整理,標注調用動作函數的日志和狀態自行變化的第二次狀態函數的日志為重要日志,合并重要日志之間的其他狀態函數日志。重要的狀態函數日志和普通狀態函數日志的區別是前者帶有相對上一條重要日志的間隔時間。偽庫的運行過程如下:
1. 記錄重要日志變化時間,將當前重要日志指向第一個條重要日志。
2. 定時檢查(可以在響應函數前執行)當前重要日志。
a) 如果為動作函數日志,無動作
b) 如果為狀態函數日志,比較當前時間與重要日志變化時間之差是否大于間隔時間。
* 大于,記錄重要日志變化時間,將當前重要日志指向下一條。
* 小于,無動作
c) 如果為空(最后一條重要日志之后),無動作。
3. 如果調用函數是動作函數,則檢查其是否與當前重要日志匹配。
a) 匹配,則根據該日志響應,記錄重要日志變化時間,將當前重要日志指向下一條。
b) 不匹配,報錯。
4. 如果調用函數是狀態函數,則從當前重要日志(不含)向前查找
a) 找到匹配的日志,根據該日志響應。
b) 沒有找到,報錯。