Apa faktor utama dalam memilih Kerangka Kerja Mengejek?


15

Saya ingin memulai dengan objek dalam unit test saya. Tampaknya ada banyak kerangka kerja mengejek yang baik di luar sana.

  1. Apakah kerangka kerja yang berbeda memiliki target audiens yang berbeda?
  2. Faktor apa yang harus saya pertimbangkan ketika memilih kerangka mana yang tepat untuk situasi saya?

Saya bekerja di lingkungan .Net, tetapi saya bermaksud agar pertanyaan itu dapat diterapkan pada kerangka kerja yang mengejek secara umum.
epotter

Jawaban:


14

Apakah kerangka kerja yang berbeda memiliki audiens target yang berbeda?

Iya. Beberapa kerangka kerja seperti Microsoft Moles , TypeMock Isolator , dan JustMock , memungkinkan Anda untuk dapat mengejek apa saja. Alat-alat tiruan ini umumnya lebih baik bagi para pengembang yang ingin menggunakannya pada kode lama yang ada karena tidak mungkin untuk mengubah seperti itu menjadi desain yang lebih dapat diuji. *

Secara tradisional, desain yang dapat diuji berarti bahwa basis kode perlu menggunakan antarmuka, kelas abstrak, metode virtual, kelas unsealed, dll. Oleh karena itu, kerangka kerja mengejek tradisional seperti Moq dan RhinoMock bekerja dengan baik dengan kode yang dikembangkan menggunakan Test Driven Development, Injeksi Ketergantungan, dan konsep lain semacam itu. Ngomong-ngomong, saya akan sangat merekomendasikan menggunakan Dependency Injection karena Anda mendapatkan lebih dari sekadar kode yang dapat diuji, tetapi juga kode yang lebih dapat dikelola.

Faktor apa yang harus saya pertimbangkan ketika memilih kerangka mana yang tepat untuk situasi saya?

  • Aktivitas Pengembangan. Alat-alat seperti Moq, dan RhinoMocks sangat aktif dan populer dan dengan demikian terkini.
  • Open Source Vs. Komersial . Pertimbangkan berbagai pro dan kontra yang khas untuk perbandingan ini. Biaya, Dukungan, dll ...
  • Kematangan. Seberapa baru alat ini. Apakah ini dalam versi beta (seperti Microsoft Moles) atau sudah ada beberapa rilis stabil? Misalnya, saya suka Moles untuk kode lawas, tetapi ada beberapa bug yang perlu diatasi di dalamnya dan akan ada menunggu bersama sebelum diatasi (rilis berikutnya November 2011).
  • Dokumentasi. Ada beberapa buku dan blog yang mencakup pengujian unit, ejekan, ejekan otomatis, dll. Selain itu seberapa bagus dokumentasi alat itu sendiri?
  • Sintaks . Setiap alat memiliki cara sendiri untuk mengatakan hal yang sama. Lihat mana yang lebih cocok untuk Anda.
  • Kecepatan . Alat yang menggunakan profiling CLR (TypeMock, Moles, JustMock), bisa jauh lebih lambat daripada yang tradisional (Moq, RhinoMocks). Penalti kecepatan ini mungkin menjadi masalah karena Anda mengumpulkan banyak tes unit. Aturan praktisnya adalah jika tes membutuhkan waktu lebih dari 1/10 detik, ini terlalu lambat.
  • Dukungan Masyarakat . Apakah pengembang lain menulis alat lain yang memperluas (atau bekerja sebagai pujian) ke alat mengejek? Ada proyek Moq.Contrib yang menambahkan kemampuan Auto- mocking ke Moq (yang membantu mempercepat waktu penulisan tes). Lebih baik lagi, ada AutoFixture , AutoFixture.AutoMoq, AutoFixture.AutoRhinoMocks, yang juga memungkinkan untuk Auto-mocking, ditambah pembuatan variabel anonim.

* Lihat Bekerja Secara Efektif dengan Legacy Code , untuk cara bagaimana perlahan-lahan memperbaiki kode tanpa menguji kode yang dapat digunakan dengan alat pengujian tradisional (dan ejekan).


2

The MOQ tutorial memiliki bagian latar belakang, filosofi, dan kontroversi yang tepat di awal yang membahas ini dalam kaitannya dengan beberapa alat khusus: TypeMock Isolator, RhinoMocks, dan MOQ. Ini ditulis untuk menjelaskan Moq, jadi secara alami agak miring, tetapi saya merasa itu cukup membantu bagi saya ketika mencoba memahami beberapa perbedaan dalam kerangka kerja mengejek.

Saya menemukan tanggapan untuk utas SO ini di C # Mocking Frameworks juga berguna. Sebagian besar hanya merujuk pada satu Kerangka Mengejek yang benar-benar bermanfaat bagi pengguna, tetapi ada tanggapan dari HaraldV tentang cara yang membahas pengejek berbasis proxy dan pengejek berbasis profiler.

Saya juga dapat menemukan grafik perbandingan online. Perhatikan bahwa ini dari 2009, jadi saya tidak yakin ini mutakhir; setidaknya ada satu komentar yang menyatakan bahwa info pada TypeMock dan callback sudah usang, tetapi bagan mungkin baik untuk mengangkat masalah untuk dipertimbangkan bahkan jika Anda perlu melakukan kerja keras untuk melihat seperti apa keadaan saat ini: RhinoMocks, Moq, NMock, dan bagan perbandingan TypeMock

Ada proyek di Google Code dengan kasus uji dalam beberapa kerangka kerja ejekan untuk perbandingan kode yang mudah: ejekan-kerangka kerja-bandingkan


2
  1. Kemudahan penggunaan. Beberapa kerangka kerja memiliki idiom penggunaan yang lebih maju. Misalnya, MOQ memungkinkan penggunaan lambdas untuk menyandikan harapan. Beberapa perpustakaan lama tidak mendukung ini.
  2. Kecepatan. Setiap pengujian unit harus cepat sehingga seluruh perpustakaan Anda tidak membutuhkan waktu berjam-jam untuk berjalan. Beberapa kerangka kerja mengejek memiliki tiruan yang dihasilkan secara statis, yang cepat. Kerangka kerja lain secara dinamis menghasilkan kode saat runtime, yang lebih lambat.
  3. Dukung. Anda menginginkan kerangka kerja yang didukung secara aktif dengan perbaikan dan diperbarui untuk mendukung versi .NET baru, saat dirilis.
  4. Kekuasaan. Sebagian besar kerangka kerja mengejek yang saya teliti kurang lebih sama dalam hal kekuatan. Ada satu pengecualian penting. Microsoft Moles memungkinkan untuk mengejek "metode non-virtual / statis dalam tipe tertutup." Setahu saya, ini adalah sesuatu yang tidak didukung oleh kerangka kerja mengejek lainnya.

Di tim saya, kami memilih Microsoft Moles . Ia menang secara signifikan di # 2, # 3, dan # 4, meskipun itu kurang idiomatis daripada kebanyakan alternatif dan berada di ujung bawah di # 1.


Sekarang banyak kerangka kerja seperti TypeMock, JustMock memungkinkan mengejek metode statis, kelas disegel dll
muruge
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.