使用者模式監視器
使用者模式監視器可讓測試取得更多有關執行「受測程式」的內容,以取得更多內容來調查測試失敗,或從現有測試啟用更好的驗證。 目前的「使用者模式監視器」實作提供基本實作,後續版本提供更多自訂和設定。
簡介
使用者模式監視器 (UMM) 會使用低階 Windows API,通知來自指定進程的所有「偵錯工具」事件 - 執行緒啟動和停止、模組載入、當機,以及處理例外狀況,只命名一些。 收到偵錯工具事件時,UMM 程式碼可以採取數個動作的其中一個,包括記錄批註、記錄錯誤 (以失敗測試) ,或甚至接受「受測進程」的迷你傾印。
啟用使用者模式監視器
若要為指定的測試案例啟用 UMM,您需要提供兩個組態:
- 測試必須以 'ProcessUnderTest' 中繼資料值標示。 這可讓 UMM 識別正在測試的程式。
- Te.exe命令列應該包含 '/userModeMonitor' 以開啟 UMM 功能。
使用 UMM 程式碼時,應該考慮下列幾點;
- 如果執行中名為 Process Under Test 的多個實例,則會使用第一次探索到的實例。
- 執行測試自動化的使用者必須具有足夠的許可權,才能從 「受測試的進程」接收偵錯工具事件。
- 執行所有安裝裝置之後,UMM 程式碼會「附加」至「待測進程」,並在清除裝置執行之前先「中斷連結」。 這可讓測試的設定裝置啟動 「測試中進程」,並執行任何必要的初始化來準備測試。
支援的使用者模式監視器 「動作」
使用者模式監視器有一組「動作」,可在受監視的進程中發生指定的偵錯工具事件時採取。 在目前的實作中,指定的事件只會叫用它的預設動作;目前沒有組態支援。
動作 | 描述 |
---|---|
LogComment | 將批註新增至記錄,其中包含事件的內容資訊。 |
LogError | 將錯誤記錄至記錄檔,這會失敗目前的測試。 |
迷你傾印 | 寫出迷你傾印,並將它儲存至記錄檔。 |
忽略 | 不執行任何動作。 |
支援的使用者模式監視器 「事件」
使用者模式監視器會顯示可套用上述其中一個「動作」的「事件」。 下表顯示目前的報告事件清單,以及接收事件時將執行的預設動作。
事件 | 預設動作 (第二個機率預設動作) |
---|---|
建立執行緒 | 忽略 |
結束執行緒 | 忽略 |
建立程式 | 忽略 |
結束程式 | LogError |
載入模組 | LogComment |
卸載模組 | 忽略 |
系統錯誤 | 忽略 |
初始中斷點 | LogError |
初始模組載入 | 忽略 |
偵錯輸出 | LogComment |
存取違規 | LogError (LogError) |
宣告失敗 | LogError (LogError) |
應用程式停止回應 | LogError (LogError) |
中斷指令例外狀況 | LogError |
中斷指令例外狀況繼續 | 忽略 |
C++ EH 例外狀況 | LogError (LogError) |
CLR 例外狀況 | LogError (LogError) |
CLR 通知例外狀況 | LogError (Ignore) |
Control-LogError例外狀況 | LogError |
Control-LogError例外狀況繼續 | 忽略 |
Control-C 例外狀況 | LogError |
Control-C 例外狀況繼續 | 忽略 |
資料不對齊 | LogError (LogError) |
偵錯工具命令例外狀況 | 忽略 |
防護頁面違規 | LogError (LogError) |
不合法的指令 | LogError (LogError) |
頁面內 I/O 錯誤 | LogError (LogError) |
整數除以零 | LogError (LogError) |
整數溢位 | LogError (LogError) |
不正確控制碼 | LogError |
不正確控制碼繼續 | LogError |
不正確鎖定順序 | LogError (LogError) |
系統呼叫無效 | LogError (LogError) |
埠中斷連線 | LogError (LogError) |
服務停止回應 | LogError (LogError) |
單一步驟例外狀況 | LogError |
單一步驟例外狀況繼續 | 忽略 |
堆疊緩衝區溢位 | LogError (LogError) |
堆疊溢位 | LogError (LogError) |
驗證器停止 | LogError (LogError) |
Visual C++ 例外狀況 | 忽略 (忽略) |
喚醒偵錯工具 | LogError (LogError) |
WOW64 中斷點 | LogError (Ignore) |
WOW64 單一步驟例外狀況 | LogError (Ignore) |
其他例外狀況 | LogError (LogError) |
例子
為了說明如何使用 UMM 功能,讓我們看看自動化 'MSPaint' 的測試 (稍微) 範例:
namespace UserModeMonitorExample
{
using System;
using System.Diagnostics;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using WEX.Logging.Interop;
using WEX.TestExecution;
[TestClass]
public class BasicExample
{
[TestInitialize]
public void TestInitialize()
{
Process[] runningPaintInstances = Process.GetProcessesByName("mspaint.exe");
Verify.IsTrue(runningPaintInstances.Length == 0, "There are no running instances of mspaint.exe");
this.mspaintUnderTest = Process.Start("mspaint.exe");
}
[TestCleanup]
public void TestCleanup()
{
// Close the 'mspaint under test' - if it's already gone, this will throw, but that's no big deal.
this.mspaintUnderTest.CloseMainWindow();
}
[TestMethod]
[TestProperty("ProcessUnderTest", "mspaint.exe")]
[TestProperty("Description", "Shows how a test can be failed if the UI is closed from underneath the test.")]
public void SimpleInteraction()
{
Log.Comment("If the 'user mode monitor' is enabled and mspaint.exe is closed,");
Log.Comment("then this test will be failed.");
Log.Comment("Sleeping for 5 seconds");
Thread.Sleep(TimeSpan.FromSeconds(5));
}
private Process mspaintUnderTest;
}
}
以下是測試結構的快速分解:
- 'SimpleInteraction' 測試代表與 UI 型應用程式互動的測試,在此案例中為 「MSPaint.exe」。 請注意,「ProcessUnderTest」 中繼資料已套用至呼叫,指出此測試正在測試「mspaint.exe」程式。
- 測試有一個安裝程式裝置,可確保沒有任何預先存在的實例正在執行,並啟動單一實例進行測試。
- 測試也有清除裝置,可關閉在安裝裝置中啟動的實例。
「測試」非常直接,讓我們看看可能的結果:
- 測試會在沒有問題的情況下執行。 這是最佳結果。
- 若未啟用 UMM,使用者會在執行期間關閉 MSPaint 實例。 在此情況下,測試將會通過,但清除將會失敗,並出現 'InvalidOperationException'。
- 啟用 UMM 後,使用者會在執行期間關閉 MSPaint 實例。 在此情況下,UMM 程式碼會記錄錯誤,顯示程式關閉失敗測試。 清除會失敗,因為 (2) 。
啟用 UMM 後,會立即報告錯誤行為,並直接影響測試結果。 這是較佳的測試模式,因為錯誤會儘快回報,並提供額外的內容來協助偵錯或瞭解測試失敗。