Bahasa

Isolasi kode yang sedang diuji dengan Microsoft Fakes

Isolasi kode adalah strategi pengujian yang sering diterapkan dengan alat seperti Microsoft Fakes, di mana kode yang Anda uji dipisahkan dari aplikasi lainnya. Pemisahan ini dicapai dengan mengganti bagian-bagian aplikasi yang berinteraksi dengan kode yang sedang diuji menggunakan stub atau shim. Ini adalah bagian-bagian kecil kode yang dikendalikan oleh pengujian Anda, yang mensimulasikan perilaku komponen asli yang digantikannya.

Manfaat dari pendekatan ini adalah memungkinkan Anda untuk fokus pada pengujian fungsionalitas spesifik kode dalam isolasi. Jika pengujian gagal, Anda tahu penyebabnya adalah dalam kode terisolasi dan bukan di tempat lain. Selain itu, penggunaan stub dan shim, yang disediakan oleh Microsoft Fakes, memungkinkan Anda untuk menguji kode Anda bahkan jika bagian lain dari aplikasi Anda belum berfungsi.

Persyaratan

  • Visual Studio Enterprise
  • Proyek .NET Framework
  • .NET Core, .NET 5.0 atau yang lebih baru, dan dukungan proyek bergaya SDK pada Visual Studio 2019 dan yang lebih baru. Untuk informasi selengkapnya, lihat Microsoft Fakes untuk proyek gaya .NET Core dan SDK.

Note

Pembuatan profil dengan Visual Studio tidak tersedia untuk pengujian yang menggunakan Microsoft Fakes.

Peran Microsoft Fakes dalam Isolasi Kode

Microsoft Fakes berperan penting dalam isolasi kode dengan menyediakan dua mekanisme - stub dan shim.

  • Stub: Ini digunakan untuk mengganti kelas dengan pengganti kecil yang mengimplementasikan antarmuka yang sama. Ini mengharuskan aplikasi Anda dirancang singgah sehingga setiap komponen hanya bergantung pada antarmuka, bukan pada komponen lain.

  • Shims: Ini digunakan untuk memodifikasi kode terkompilasi aplikasi Anda saat runtime. Alih-alih melakukan panggilan metode tertentu, aplikasi menjalankan kode shim yang disediakan pengujian Anda. Shim memungkinkan Anda mengganti panggilan ke assembly yang tidak dapat Anda ubah, seperti assembly .NET.

Biasanya, stub digunakan untuk pemanggilan di dalam solusi Visual Studio Anda, dan shim untuk pemanggilan ke assembly lain yang direferensikan. Ini karena dalam solusi Anda, merupakan praktik yang baik untuk mengurangi ketergantungan antarkomponen dengan mendefinisikan antarmuka sesuai kebutuhan stubbing. Namun, rakitan eksternal sering kali tidak dilengkapi dengan definisi antarmuka terpisah, sehingga shim digunakan sebagai gantinya.

Diagram yang memperlihatkan Fakes menggantikan komponen lain.

Rekomendasi tentang Kapan Menggunakan Stub

Stub biasanya digunakan untuk pemanggilan di dalam solusi Visual Studio Anda karena merupakan praktik yang baik untuk mengurangi ketergantungan antar komponen dengan mendefinisikan antarmuka sesuai kebutuhan stubbing. Namun, rakitan eksternal, seperti System.dll, biasanya tidak disediakan dengan definisi antarmuka terpisah, sehingga shim akan digunakan dalam kasus ini sebagai gantinya.

Menggunakan stub melibatkan desain aplikasi Anda sehingga komponen yang berbeda tidak bergantung satu sama lain, tetapi hanya pada definisi antarmuka. Pemisahan ini membuat aplikasi lebih tangguh dan fleksibel, serta memungkinkan Anda menghubungkan komponen yang sedang diuji ke implementasi stub dari antarmuka untuk tujuan pengujian.

Dalam praktiknya, Anda dapat menghasilkan jenis stub dari definisi antarmuka di Visual Studio, lalu mengganti komponen nyata dengan stub dalam pengujian Anda.

Rekomendasi tentang Kapan Menggunakan Shim

Meskipun stub digunakan untuk pemanggilan di dalam solusi Visual Studio Anda, shim biasanya digunakan untuk pemanggilan ke assembly lain yang direferensikan. Ini karena assembly eksternal seperti System.dll biasanya tidak disediakan dengan definisi antarmuka terpisah, sehingga shim harus digunakan sebagai penggantinya.

Namun, ada beberapa faktor yang perlu dipertimbangkan saat menggunakan shim:

Kinerja: Shim bekerja lebih lambat karena menulis ulang kode Anda saat dijalankan. Stub tidak memiliki overhead kinerja ini dan dapat berjalan secepat metode virtual.

Metode statis, jenis tertutup: Anda hanya dapat menggunakan stub untuk mengimplementasikan antarmuka. Oleh karena itu, jenis stub tidak dapat digunakan untuk metode statis, metode non-virtual, metode virtual yang disegel, metode dalam jenis tertutup, dan sebagainya.

Tipe internal: Baik stub maupun shim dapat digunakan dengan tipe internal yang dibuat dapat diakses dengan menggunakan atribut assembly InternalsVisibleToAttribute​.

Metode privat: Shim dapat mengganti panggilan ke metode privat jika semua tipe pada signature metode terlihat. Stub hanya dapat menggantikan metode yang terlihat.

Antarmuka dan metode abstrak: Stub menyediakan implementasi antarmuka dan metode abstrak yang dapat digunakan dalam pengujian. Shim tidak dapat menginstrumentasi antarmuka dan metode abstrak karena keduanya tidak memiliki isi metode.


Migrasi Microsoft Fakes dari .NET Framework ke Proyek Bergaya SDK

Memigrasikan proyek pengujian .NET Framework Anda yang menggunakan Microsoft Fakes ke proyek .NET Framework bergaya SDK, .NET Core, atau .NET 5+.

Anda hanya memerlukan sedikit perubahan pada penyiapan .NET Framework Anda agar Microsoft Fakes dapat beralih ke .NET Core atau .NET 5.0. Kasus yang harus Anda pertimbangkan adalah:

  • Jika Anda menggunakan templat proyek kustom, Anda perlu memastikan bahwa templat tersebut bergaya SDK dan build untuk kerangka kerja target yang kompatibel.

  • Jenis tertentu ada di rakitan yang berbeda dalam .NET Framework dan .NET Core/.NET 5.0 (misalnya, System.DateTime ada di System/mscorlib di .NET Framework, dan dalam System.Runtime di .NET Core dan .NET 5.0), dan dalam skenario ini Anda perlu mengubah rakitan yang dipalsukan.

  • Jika Anda memiliki referensi rakitan ke rakitan palsu dan proyek pengujian, Anda mungkin melihat peringatan build tentang referensi yang hilang yang mirip dengan:

    (ResolveAssemblyReferences target) ->
    warning MSB3245: Could not resolve this reference. Could not locate the assembly "AssemblyName.Fakes". Check to make sure the assembly exists on disk.
    If this reference is required by your code, you may get compilation errors.
    

    Peringatan ini muncul karena perubahan yang diperlukan pada pembuatan Fakes dan dapat diabaikan. Ini dapat dihindari dengan menghapus referensi perakitan dari file proyek, karena kita sekarang secara implisit menambahkannya selama build.

Menjalankan tes Microsoft Fakes

Selama rakitan Microsoft Fakes ada di direktori FakesAssemblies yang dikonfigurasi (Defaultnya adalah $(ProjectDir)FakesAssemblies), Anda dapat menjalankan pengujian menggunakan tugas vstest.

Pengujian terdistribusi dengan task vstest untuk proyek .NET Core dan .NET 5+ yang menggunakan Microsoft Fakes memerlukan Visual Studio 2019 Update 9 Preview 20201020-06 atau yang lebih baru.

Kompatibilitas dan Dukungan untuk Microsoft Fakes di Berbagai Versi .NET dan Visual Studio

Microsoft Fakes pada proyek lama yang menggunakan .NET Framework sebagai target (bukan gaya SDK).

  • Pembuatan assembly Microsoft Fakes didukung pada Visual Studio Enterprise 2015 dan versi yang lebih baru.
  • Pengujian Microsoft Fakes dapat dijalankan dengan semua paket NuGet Microsoft.TestPlatform yang tersedia.
  • Cakupan kode didukung untuk proyek pengujian yang menggunakan Microsoft Fakes di Visual Studio Enterprise 2015 dan yang lebih baru.

Microsoft Palsu dalam .NET Framework bergaya SDK, .NET Core, dan proyek .NET 5.0 atau yang lebih baru

  • Pembuatan assembly Microsoft Fakes diperkenalkan dalam pratinjau di Visual Studio Enterprise 2019 Update 6 dan diaktifkan secara bawaan di Update 8.
  • Pengujian Microsoft Fakes untuk proyek yang menargetkan .NET Framework dapat dijalankan dengan semua paket NuGet Microsoft.TestPlatform yang tersedia.
  • Pengujian Microsoft Fakes untuk proyek yang menargetkan .NET Core dan .NET 5.0 atau yang lebih baru dapat dijalankan dengan paket NuGet Microsoft.TestPlatform versi 16.9.0-preview-20210106-01 dan yang lebih baru.
  • Cakupan kode didukung untuk proyek pengujian yang menargetkan .NET Framework menggunakan Microsoft Fakes di Visual Studio Enterprise versi 2015 dan yang lebih tinggi.
  • Dukungan cakupan kode untuk proyek pengujian yang menargetkan .NET Core dan .NET 5.0 atau yang lebih baru menggunakan Microsoft Fakes tersedia di Visual Studio 2019 pembaruan 9 dan yang lebih tinggi.