Bagikan melalui


Monitor Mode Pengguna

Monitor Mode Pengguna memungkinkan pengujian untuk mendapatkan lebih banyak konteks tentang eksekusi 'proses di bawah pengujian' untuk mendapatkan lebih banyak konteks untuk menyelidiki kegagalan pengujian, atau untuk mengaktifkan verifikasi yang lebih baik dari pengujian yang ada. Implementasi Monitor Mode Pengguna saat ini menyediakan implementasi dasar, dengan lebih banyak penyesuaian dan konfigurasi yang datang dalam rilis berikutnya.

Pengenalan

User Mode Monitor (UMM) menggunakan Windows API tingkat rendah untuk diberi tahu tentang semua peristiwa 'debugger' yang berasal dari proses tertentu - mulai dan hentikan utas, beban modul, crash, dan pengecualian yang ditangani hanya untuk beberapa. Setelah menerima peristiwa debugger, kode UMM dapat mengambil salah satu dari beberapa tindakan, termasuk komentar pengelogan, kesalahan pengelogan (untuk gagal dalam pengujian), atau bahkan mengambil minidump dari Proses Sedang Diuji.

Mengaktifkan Monitor Mode Pengguna

Untuk mengaktifkan UMM untuk kasus pengujian tertentu, Anda perlu menyediakan dua bagian konfigurasi:

  1. Pengujian harus ditandai dengan nilai metadata 'ProcessUnderTest'. Ini memungkinkan UMM untuk mengidentifikasi proses yang sedang diuji.
  2. Baris perintah Te.exe harus menyertakan '/userModeMonitor' untuk mengaktifkan fungsionalitas UMM.

Poin-poin berikut harus dipertahankan saat menggunakan kode UMM;

  1. Jika ada beberapa instans bernama Proses Di bawah Pengujian yang berjalan, maka instans yang ditemukan pertama kali akan digunakan.
  2. Pengguna yang menjalankan otomatisasi pengujian harus memiliki izin yang memadai untuk menerima peristiwa debugger dari Proses Di bawah Pengujian.
  3. Kode UMM akan 'melampirkan' ke Proses Di bawah Pengujian setelah semua perlengkapan penyiapan dijalankan, dan 'lepaskan' sebelum perlengkapan pembersihan dijalankan. Ini memungkinkan perlengkapan penyiapan pengujian untuk memulai Proses Di bawah Pengujian, dan melakukan inisialisasi yang diperlukan untuk mempersiapkan pengujian.

Monitor Mode Pengguna yang Didukung 'Tindakan'

Monitor Mode Pengguna memiliki sekumpulan 'Tindakan' yang dapat diambil ketika peristiwa debugger tertentu terjadi dalam proses yang dipantau. Dalam implementasi saat ini, peristiwa tertentu hanya akan memanggil tindakan defaultnya; saat ini tidak ada dukungan konfigurasi.

Tindakan Deskripsi
LogComment Menambahkan komentar ke log, dengan informasi kontekstual dari peristiwa tersebut.
LogError Mencatat kesalahan ke log, yang akan gagal dalam pengujian saat ini.
Minidump Menulis minidump dan menyimpannya ke Log.
Ignore Tidak melakukan apa-apa.

Pemantau Mode Pengguna yang Didukung 'Peristiwa'

Monitor Mode Pengguna menampilkan 'peristiwa' yang dapat menerapkan salah satu 'tindakan' yang tercantum, di atas. Tabel berikut ini memperlihatkan daftar peristiwa yang dilaporkan saat ini, bersama dengan Tindakan default yang akan dilakukan saat peristiwa diterima.

Kejadian Tindakan Default (tindakan default peluang kedua)
Membuat utas Ignore
Keluar dari utas Ignore
Membuat proses Ignore
Proses keluar LogError
Muat modul LogComment
Membongkar modul Ignore
Kesalahan sistem Ignore
Titik henti awal LogError
Beban modul awal Ignore
Output debuggee LogComment
Pelanggaran akses LogError (LogError)
Kegagalan pernyataan LogError (LogError)
Aplikasi macet LogError (LogError)
Putuskan pengecualian instruksi LogError
Hentikan pengecualian instruksi berlanjut Ignore
Pengecualian C++ EH LogError (LogError)
Pengecualian CLR LogError (LogError)
Pengecualian pemberitahuan CLR LogError (Abaikan)
pengecualian Control-LogError LogError
Control-LogError pengecualian berlanjut Ignore
Pengecualian Control-C LogError
Pengecualian Control-C berlanjut Ignore
Data tidak sejajar LogError (LogError)
Pengecualian perintah debugger Ignore
Pelanggaran halaman penjaga LogError (LogError)
Instruksi ilegal LogError (LogError)
Kesalahan I/O dalam halaman LogError (LogError)
Integer divide-by-zero LogError (LogError)
Luapan bilangan bulat LogError (LogError)
Handel tidak valid LogError
Handel tidak valid berlanjut LogError
Urutan kunci tidak valid LogError (LogError)
Panggilan sistem tidak valid LogError (LogError)
Port terputus LogError (LogError)
Layanan macet LogError (LogError)
Pengecualian langkah tunggal LogError
Pengecualian langkah tunggal berlanjut Ignore
Luapan penyangga tumpukan LogError (LogError)
Tumpukan luapan LogError (LogError)
Pemverifikasi berhenti LogError (LogError)
Pengecualian Visual C++ Abaikan (Abaikan)
Debugger bangun LogError (LogError)
Titik henti WOW64 LogError (Abaikan)
Pengecualian langkah tunggal WOW64 LogError (Abaikan)
Pengecualian lainnya LogError (LogError)

Contoh

Untuk mengilustrasikan penggunaan fungsionalitas UMM, mari kita lihat contoh tes (sedikit sulit) yang mengotomatiskan '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;
    }
}

Berikut adalah perincian cepat struktur pengujian:

  • Tes 'SimpleInteraction' mewakili pengujian yang berinteraksi dengan aplikasi berbasis UI - dalam hal ini adalah "MSPaint.exe". Perhatikan, bahwa metadata "ProcessUnderTest" telah diterapkan untuk menyebutkan bahwa pengujian ini menguji proses "mspaint.exe".
  • Pengujian ini memiliki perlengkapan penyiapan yang memastikan bahwa tidak ada instans yang sudah ada sebelumnya yang berjalan, dan meluncurkan satu instans untuk diuji.
  • Pengujian ini juga memiliki perlengkapan pembersihan yang menutup instans yang diluncurkan dalam perlengkapan penyiapan.

'Tes' sangat lurus ke depan, mari kita lihat kemungkinan hasilnya:

  1. Pengujian berjalan tanpa masalah. Ini hasil terbaik.
  2. Tanpa UMM diaktifkan, pengguna menutup instans MSPaint selama eksekusi. Dalam hal ini, pengujian akan lulus, tetapi pembersihan akan gagal dengan 'InvalidOperationException'.
  3. Dengan UMM diaktifkan, pengguna menutup instans MSPaint selama eksekusi. Dalam hal ini, kode UMM akan mencatat kesalahan yang menunjukkan bahwa proses ditutup gagal dalam pengujian. Pembersihan gagal seperti dalam kasus (2).

Dengan UMM diaktifkan, perilaku yang salah segera dilaporkan, dan secara langsung mempengaruhi hasil pengujian. Ini adalah pola pengujian yang jauh lebih baik karena kesalahan dilaporkan sedini mungkin dan konteks tambahan disediakan untuk membantu penelusuran kesalahan atau memahami kegagalan pengujian.