先決定重播的是發生順序還是到達順序
拿歷史資料測新版系統時,如果全部一次送完,數值雖然相同,逾時、佇列與事件排序的條件卻已改變。先明訂重播時間軸,再保留原始間隔與順序,才能說明這次測試重現了什麼情境。重播不是把資料列重新匯入那麼簡單。
來源可能同時有事件時間、接收時間與序號。驗證製程歷史重建時可按可信事件時間整理;重現當時接收系統遇到的亂序與延遲,則要保留接收順序。把所有資料先按事件時間排好,會消除原本最需要測的遲到問題。
每筆保留原始事件識別、原時間、來源序號、內容與品質,另外增加重播執行識別及實際送出時間。不要直接把原時間改成現在,否則後續無法比對原始情境;需要平移時間時,保存平移規則與原欄位。
本文適用於隔離環境的資料處理與介面測試,Python單調時鐘作排程概念參考。資料事件重播不等於封包逐位元重播,也不等於PLC掃描重演;涉及真實命令的記錄不能直接送回正式設備,先確認測試出口與替代對象。
把三個原時間轉成重播目標
教學資料原相對時間為零毫秒、一百毫秒與四百毫秒,順序A、B、C。一倍速重播目標仍是零、一百、四百;兩倍速則是零、五十、二百。相鄰原間隔是一百與三百毫秒,不是三筆都等距一百毫秒。
設定重播起點後,每筆目標時間按「原時間減原起點,再除以速度倍率」計算。若把處理完前一筆後再睡固定間隔,處理耗時會逐步累加到時間線;較好的排程概念是每筆都對照共同起點的目標期限,並記錄落後多少。
使用單調經過時間計算等待,避免系統牆上時鐘校正使間隔突然倒退。Python的monotonic適合量相對經過時間,但其基準不是UTC時間,不能直接拿兩台主機的回傳值相減當端到端延遲;跨主機仍需可信同步或其他量測設計。
記錄每筆目標與實際送出時間。例如B目標一百毫秒、實際一百一十五,落後十五毫秒;C目標四百、實際四百零五,落後五毫秒。驗收按事先訂定的時間容差與順序判斷,不因資料最終全部送到就宣告時間重播成功。
完成後應能得到原順序、目標順序與實際順序三者對照,以及每筆排程誤差。順序相同但間隔壓縮,可能適合內容回歸,卻不適合驗證原始逾時;結果必須依測試目的解讀。
處理同時刻 倒序與多來源資料
多筆時間完全相同時,用原始接收序或來源序號作穩定的次排序鍵,保留可重複性。這個次排序只是明訂處理順序,不代表已證明物理世界的先後。不同設備時鐘精度不足時,更不能靠事件識別大小推斷真正因果。
若選定的時間軸出現負間隔,先檢查時鐘跳動、排序錯誤或資料本來亂序。重現接收情境時可以按接收時間排程並保留原事件時間倒序;不能把負等待直接改成零卻不記錄,因為那會悄悄改變測試資料。
多來源合併時保留來源內順序與可知的跨來源關係。沒有可信共同時鐘就標示排序限制,使用已記錄的接收序重現某接收端看到的情況。這只能代表該觀測點,不保證其他系統當時也看到相同到達順序。
原資料有重送時,若目的是驗證去重,保留相同事件鍵與重複次數;若先清洗掉重複,就只剩一般匯入測試。可另做清洗版與原始版,但命名、版本與預期結果分開,不讓兩種輸入在報告中混稱同一份資料。
暫停與續播要定義時間處理。若暫停十秒後所有剩餘目標仍用舊起點,恢復時可能瞬間追趕成尖峰。可選整體平移未執行時間線,或明確測追趕行為,但兩者不同,不能由排程器無意中決定。
速度 背壓與狀態也影響結果
加速重播會同時增加輸入速率並縮短事件間隔,卻未必縮短被測系統的逾時與計時器。因此十倍速跑過正常,不代表原速的所有時間行為也正確。內容一致性、效能壓力與時間邏輯分成不同案例,使用合適速度。
若接收端跟不上,先按案例策略選擇等待、保留原排程並記錄延遲,或中止。等待背壓會改變實際間隔,丟棄資料則改變內容集合;無論哪種都要記錄,不能只報送出檔案共有一萬筆而忽略真正到達多少。
每次重播前固定被測系統起始狀態與去重範圍。若使用相同事件鍵重跑,系統可能把全部視為已接受;可重設隔離測試資料,或使用獨立重播命名空間,但不能為了方便改掉原事件間的重複關係。
失敗時先確認輸入版本、時間軸、速度倍率與起點,再查排程誤差及接收端背壓。若內容完全相同但結果不同,檢查初始化、隨機狀態與併發順序。保留實際送出日誌,避免只拿理論腳本推定執行過程。
練習與常見問題
練習:原相對時間零、二百、八百毫秒,採四倍速,目標應為零、五十、二百毫秒,兩段等待五十與一百五十。若實際送出零、七十、二百一十,第二筆落後二十、第三筆落後十,依事先容差判定而不是事後放寬。
驗收另放一組事件時間倒序但接收時間遞增的資料,確認接收情境重播保留這個特徵。對重播後的輸出比對唯一事件數、最新狀態與品質,時間測試與業務結果一起看,才能知道原故障是否被重現。
問:全部資料一次送完算重播嗎?答:可測批次內容處理,但不能宣稱保留原始時間條件。
問:同時刻事件可以任意排序嗎?答:要固定且揭露排序規則,避免每次結果不同。
問:加速十倍能證明原速逾時正確嗎?答:不能,系統計時與輸入間隔的關係已改變。
問:重播鍵都換新比較方便嗎?答:可能破壞去重與修訂關係,應保留原關係並隔離執行範圍。
參考:Python time:monotonic、sleep與經過時間量測的定義;本文排程與案例為教學設計。