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:
- Pengujian harus ditandai dengan nilai metadata 'ProcessUnderTest'. Ini memungkinkan UMM untuk mengidentifikasi proses yang sedang diuji.
- Baris perintah Te.exe harus menyertakan '/userModeMonitor' untuk mengaktifkan fungsionalitas UMM.
Poin-poin berikut harus dipertahankan saat menggunakan kode UMM;
- Jika ada beberapa instans bernama Proses Di bawah Pengujian yang berjalan, maka instans yang ditemukan pertama kali akan digunakan.
- Pengguna yang menjalankan otomatisasi pengujian harus memiliki izin yang memadai untuk menerima peristiwa debugger dari Proses Di bawah Pengujian.
- 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:
- Pengujian berjalan tanpa masalah. Ini hasil terbaik.
- Tanpa UMM diaktifkan, pengguna menutup instans MSPaint selama eksekusi. Dalam hal ini, pengujian akan lulus, tetapi pembersihan akan gagal dengan 'InvalidOperationException'.
- 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.