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