共用方式為


使用者模式監視器

使用者模式監視器可讓測試取得更多有關執行「受測程式」的內容,以取得更多內容來調查測試失敗,或從現有測試啟用更好的驗證。 目前的「使用者模式監視器」實作提供基本實作,後續版本提供更多自訂和設定。

簡介

使用者模式監視器 (UMM) 會使用低階 Windows API,通知來自指定進程的所有「偵錯工具」事件 - 執行緒啟動和停止、模組載入、當機,以及處理例外狀況,只命名一些。 收到偵錯工具事件時,UMM 程式碼可以採取數個動作的其中一個,包括記錄批註、記錄錯誤 (以失敗測試) ,或甚至接受「受測進程」的迷你傾印。

啟用使用者模式監視器

若要為指定的測試案例啟用 UMM,您需要提供兩個組態:

  1. 測試必須以 'ProcessUnderTest' 中繼資料值標示。 這可讓 UMM 識別正在測試的程式。
  2. Te.exe命令列應該包含 '/userModeMonitor' 以開啟 UMM 功能。

使用 UMM 程式碼時,應該考慮下列幾點;

  1. 如果執行中名為 Process Under Test 的多個實例,則會使用第一次探索到的實例。
  2. 執行測試自動化的使用者必須具有足夠的許可權,才能從 「受測試的進程」接收偵錯工具事件。
  3. 執行所有安裝裝置之後,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」程式。
  • 測試有一個安裝程式裝置,可確保沒有任何預先存在的實例正在執行,並啟動單一實例進行測試。
  • 測試也有清除裝置,可關閉在安裝裝置中啟動的實例。

「測試」非常直接,讓我們看看可能的結果:

  1. 測試會在沒有問題的情況下執行。 這是最佳結果。
  2. 若未啟用 UMM,使用者會在執行期間關閉 MSPaint 實例。 在此情況下,測試將會通過,但清除將會失敗,並出現 'InvalidOperationException'。
  3. 啟用 UMM 後,使用者會在執行期間關閉 MSPaint 實例。 在此情況下,UMM 程式碼會記錄錯誤,顯示程式關閉失敗測試。 清除會失敗,因為 (2) 。

啟用 UMM 後,會立即報告錯誤行為,並直接影響測試結果。 這是較佳的測試模式,因為錯誤會儘快回報,並提供額外的內容來協助偵錯或瞭解測試失敗。