Proyek Uji NUnit vs Visual Studio 2008 untuk Unit Testing? [Tutup]

254

Saya akan memulai proyek baru di tempat kerja dan ingin masuk ke unit testing. Kami akan menggunakan VS 2008, C #, dan hal-hal ASP.NET MVC. Saya melihat menggunakan NUnit atau proyek uji bawaan yang dimiliki VS2008, tetapi saya terbuka untuk meneliti saran lain. Apakah satu sistem lebih baik dari yang lain atau mungkin lebih mudah digunakan / dipahami daripada yang lain? Saya mencari untuk mengatur proyek ini sebagai semacam "praktik terbaik" untuk upaya pengembangan kami ke depan.

Terima kasih atas bantuan dan sarannya !!

Ryan Skarin
sumber

Jawaban:

99

Daok menamai semua pro dari proyek uji VS2008, ini adalah pro dari NUnit.

  • NUnit memiliki kerangka kerja mengejek.
  • NUnit dapat dijalankan di luar IDE, ini dapat berguna jika Anda ingin menjalankan tes pada server non MS build seperti CC.Net
  • NUnit memiliki lebih banyak versi yang keluar dari visual studio. Anda tidak perlu menunggu bertahun-tahun untuk versi baru Dan Anda tidak harus menginstal versi baru IDE untuk mendapatkan fitur baru.
  • Ada ekstensi yang dikembangkan untuk NUnit seperti tes baris dll.
  • Tes Visual Studio membutuhkan waktu lama untuk memulai karena suatu alasan. Ini lebih baik di tahun 2008 tetapi masih terlalu lambat untuk seleraku. Menjalankan tes dengan cepat untuk melihat apakah Anda tidak merusak sesuatu bisa terlalu lama. NUnit dengan sesuatu seperti Testdriven.Net untuk menjalankan tes dari IDE sebenarnya jauh lebih cepat. terutama saat menjalankan tes tunggal.
    Menurut Kjetil Klaussen ini disebabkan oleh Visual Studio testrunner, menjalankan tes MSTest di TestDriven.Net membuat kinerja MSTest sebanding dengan NUnit.
Mendelt
sumber
19
Tidak bisakah Anda menggunakan mstest.exe untuk menjalankan tes MSTest di luar IDE?
Phillip Wells
13
Nunit memiliki kerangka kerja mengejek tidak banyak keuntungan. Saya telah menggunakan proyek uji unit VS 2008 dengan kerangka kerja Moq yang menggunakan pendekatan baru, meningkatkan pohon ekspresi LINQ: code.google.com/p/moq
DSO
5
Satu lagi nilai tambah untuk Nunit, bagi saya, adalah bahwa Resharper memiliki UI yang sangat bagus yang melilitinya yang jauh lebih cepat daripada komponen pengujian VS. Bahkan hyperlink jejak tumpukan tes gagal ke kode Anda.
Jeff Putz
7
Pengujian unit termasuk dalam versi profesional VS 2008.
user179700
3
@ Jeff Putz: Resharper dapat menjalankan tes unit Visual Studio juga, bahkan di luar proyek uji.
Paul Ruane
64

Kerangka kerja unit-testing sebenarnya tidak terlalu penting, karena Anda dapat mengonversi kelas uji dengan file proyek terpisah dan kompilasi bersyarat (seperti ini, VS-> NUnit):

 #Jika! NUNIT
  menggunakan Microsoft.VisualStudio.TestTools.UnitTesting;
 #lain
  menggunakan NUnit.Framework;
  menggunakan TestClass = NUnit.Framework.TestFixtureAttribute;
  menggunakan TestMethod = NUnit.Framework.TestAttribute;
  menggunakan TestInitialize = NUnit.Framework.SetUpAttribute;
  menggunakan TestCleanup = NUnit.Framework.TearDownAttribute;
  menggunakan TestContext = System.String;
  menggunakan DeploymentItem = NUnit.Framework.DescriptionAttribute;
 #berakhir jika

Plugin TestDriven.Net bagus dan tidak terlalu mahal ... Dengan hanya VS2008 Anda harus menemukan tes dari kelas tes atau daftar tes. Dengan TestDriven.Net Anda dapat menjalankan tes Anda langsung dari kelas yang Anda uji. Bagaimanapun, uji unit harus mudah dipelihara dan dekat dengan pengembang.

Tuomas Hietanen
sumber
12
Saya memilih yang satu ini karena NUnit memiliki sintaksis yang lebih kaya daripada MSTest, yang berarti Anda dapat beralih dari MSTest -> NUnit, tetapi tidak sebaliknya kecuali jika Anda SANGAT hati-hati. Sejarah menunjukkan setidaknya salah satu dari kita tidak.
Thomas Eyde
2
Saya setuju dengan Thomas. Ini akan bekerja dengan asumsi Anda menggunakan pernyataan pernyataan paling dasar, tetapi model kendala NUnit sangat kuat dan cukup alasan untuk memilih NUnit daripada MSTest.
Tandai
Saya percaya, pendekatan ini diambil oleh pola ms dan grup latihan dalam tes EntLib.
robi-y
1
@Dan Neely jika Anda menguji kemaluan Anda melakukan hal yang salah :(
JDPeckham
2
@ JDPeckham Saya tidak mengatakan bahwa konvensi tentang apa yang seharusnya / tidak boleh dilakukan dengan alat tidak penting, tetapi pada akhirnya menyelesaikan pekerjaan adalah hal yang paling penting. Jika itu berarti memukul paku dengan sisi belakang kapak karena vendor alat tidak menjual palu maka produsen kapak hanya akan harus hidup dengan menjadi marah.
Dan Is Fiddling By Firelight
34

Manfaat / perubahan Kerangka Pengujian Unit Built-in VS2008

  1. Versi 2008 sekarang tersedia dalam edisi profesional (sebelum diperlukan versi VS yang mahal, ini hanya untuk pengujian unit pengembang.) Yang meninggalkan banyak pengembang dengan satu-satunya pilihan kerangka pengujian terbuka / eksternal.
  2. Dibangun pada API yang didukung oleh satu perusahaan.
  3. Gunakan alat yang sama untuk menjalankan dan membuat tes (Anda dapat menjalankannya menggunakan baris perintah juga MSTest)
  4. Desain sederhana (tidak diberi kerangka kerja Mock, tetapi ini merupakan titik awal yang bagus bagi banyak programmer)
  5. Dukungan jangka panjang diberikan (saya masih ingat apa yang terjadi pada nDoc, saya tidak ingin berkomitmen pada kerangka kerja pengujian yang mungkin tidak didukung dalam 5 tahun, tapi saya masih menganggap nUnit kerangka kerja yang hebat.)
  6. Jika menggunakan server tim pondasi sebagai backend Anda, Anda dapat membuat item kerja atau bug dengan data pengujian yang gagal dengan cara sederhana.
Simara
sumber
4
Saya pikir itu masih mengatakan tentang pandangan Microsoft tentang pengujian bahwa itu TIDAK dalam versi Standar, hanya Profesional dan di atas.
J Wynia
Setuju, saya ingin melihatnya dalam standar dan atas. Dalam versi kilat itu akan berlebihan bagi pemula.
Simara
1
@J Wynia: Membaca keputusan mereka untuk hanya memasukkannya ke dalam Profesional dan di atas sebagai mengatakan sesuatu tentang pandangan mereka tentang pengujian adalah membaca terlalu banyak ke dalamnya. Ini lebih cenderung keputusan bisnis daripada keputusan filosofis.
jason
@Simara Testing harus melekat pada siklus hidup pengembangan. Harus disediakan dalam edisi ekspres.
eastender
33

Saya telah menggunakan NUnit selama 2 tahun. Semua baik-baik saja tetapi saya harus mengatakan bahwa sistem Unit di VS cukup bagus karena ada di dalam Gui dan dapat lebih mudah melakukan tes untuk fungsi pribadi tanpa harus dipusingkan. Juga, Unit Testing VS memungkinkan Anda melakukan peliputan dan hal-hal lain yang tidak bisa dilakukan oleh NUnit saja.

Patrick Desjardins
sumber
44
Anda seharusnya tidak menyentuh kemaluan Anda. Semua bercanda samping, satu aliran pemikiran adalah bahwa semua yang Anda butuhkan tes adalah Anda metode publik Memanggil semua metode publik Anda harus memanggil semua metode pribadi Anda. Jika metode pribadi tidak dipanggil melalui metode publik, metode pribadi itu berlebihan.
Lieven Keersmaekers
7
@ Lieven: jika Anda menguji privat melalui publik Anda benar-benar melakukan tes integrasi dan bukan tes unit. (Tentu saja saya bukan fanatik TDD dan aku mungkin hanya menguji publik ... tapi aku merasa seperti membantu untuk memulai perkelahian)
Matthew Whited
11
@ Matius, pengujian integrasi menguji dua unit atau lebih secara bersamaan. Menguji metode pribadi hanya merupakan pelanggaran (besar) enkapsulasi dan dapat menyebabkan tes unit rapuh yang harus dimodifikasi setiap kali perubahan implementasi.
Omer Rauchwerger
3
Anda juga dapat menggunakan [assembly: InternalsVisibleTo (...)] dengan arahan kompiler untuk menghapusnya saat Anda membuat RTM build.
Iain Galloway
1
Saya menyentuh privat saya sepanjang waktu :) Saya pikir ada nilai khusus dalam menguji anggota pribadi untuk menghindari overhead dari pengujian penelepon yang memerlukan banyak pengaturan kompleks.
Crackerjack
14

Satu gangguan kecil dari kerangka pengujian Visual Studio adalah bahwa hal itu akan membuat banyak file uji coba yang cenderung mengacaukan direktori proyek Anda - meskipun ini bukan masalah besar.

Juga, jika Anda tidak memiliki plugin seperti TestDriven.NET, Anda tidak dapat men-debug unit tes NUnit Anda (atau MbUnit, xUnit, dll.) Dalam lingkungan Visual Studio, seperti yang Anda bisa dengan kerangka kerja pengujian Microsoft VS, yang dibangun di dalamnya.

Tarsius
sumber
3
Anda dapat men-debug pengujian NUnit dalam Visual Studio 2005.
Jason Short
Anda juga dapat men-debug xunit tetapi tidak jelas cara mengaturnya (halaman properti)
annakata
1
Anda dapat dengan mudah men-debug NUnit dengan melampirkan debugger ke proses NUnit yang berjalan seperti kata grimus. Tidak ada kerugian nyata di sini.
Anne Schuessler
1: Jumlah tes yang dapat dikonfigurasi dalam pengaturan VS - Saya mengaturnya menjadi satu. 2: Setuju dengan komentar di atas - mungkin tapi canggung, 3: Secara keseluruhan, saya lebih suka lingkungan pengujian yang dibangun dalam VS.
RaoulRubin
14

Agak di luar topik, tetapi jika Anda menggunakan NUnit, saya dapat merekomendasikan penggunaan ReSharper - ini menambahkan beberapa tombol ke VS UI yang membuatnya jauh lebih mudah untuk dijalankan dan men-debug tes dari dalam IDE.

Ulasan ini sedikit kedaluwarsa, tetapi menjelaskan ini secara lebih rinci:

http://codebetter.com/blogs/paul.laudeman/archive/2006/08/15/Using-ReSharper-as-an-essential-part-of-your-TDD-toolkit.aspx

Richard Ev
sumber
Dengan plugin Gallio ke R # Anda dapat menjalankan MSTest juga.
Kjetil Klaussen
CodeRush menempatkan ikon pada tes tepat di kode sehingga Anda dapat menjalankan satu tes, atau semua tes di kelas atau di namespace. Lihat di sini: community.devexpress.com/blogs/markmiller/archive/2009/11/16/…
Ryan Lundy
Resharper juga akan menjalankan tes MSTest.
JDPeckham
11

XUnit adalah kemungkinan lain untuk proyek greenfield. Mungkin ada sintaks yang lebih intuitif, tetapi tidak benar-benar kompatibel dengan kerangka kerja lain.

http://www.codeplex.com/xunit

Ben Fulton
sumber
11

Daging sapi utama saya dengan tes unit VS lebih dari NUnit adalah penciptaan tes VS cenderung menyuntikkan banyak kode yang dihasilkan untuk akses anggota pribadi.

Beberapa mungkin ingin menguji metode pribadi mereka, beberapa mungkin tidak, itu topik yang berbeda.

Kekhawatiran saya adalah ketika saya sedang menulis unit test mereka harus sangat dikontrol jadi saya tahu persis apa yang saya uji dan bagaimana saya mengujinya. Jika ada kode yang dibuat secara otomatis, saya kehilangan sebagian dari kepemilikan itu.

Ian Suttle
sumber
11

Saya telah melakukan beberapa TDD menggunakan keduanya dan (mungkin saya sedikit bodoh) nUnit tampaknya jauh lebih cepat dan lebih mudah digunakan untuk saya. Dan ketika saya banyak bicara, saya sangat berarti.

Di MS Test, ada terlalu banyak atribut, di mana-mana - kode yang melakukan tes sebenarnya adalah garis kecil yang dapat Anda baca di sana-sini. Kekacauan besar. Dalam nUnit, kode yang melakukan pengujian hanya mendominasi atribut, seperti yang seharusnya.

Juga, di nUnit, Anda hanya perlu mengklik tes yang ingin Anda jalankan (hanya satu? Semua tes yang mencakup kelas? Perakitan? Solusi?). Satu klik. Dan jendelanya jernih dan besar. Anda mendapatkan lampu hijau dan merah yang jelas. Anda benar-benar tahu apa yang terjadi dalam satu pandangan.

Dalam VSTS, daftar tes macet di bagian bawah layar, itu kecil dan jelek. Anda harus melihat dua kali untuk mengetahui apa yang terjadi. Dan Anda tidak dapat menjalankan hanya satu tes (well, saya belum mengetahuinya!).

Tapi saya mungkin salah, tentu saja - saya baru saja membaca sekitar 21 posting blog tentang "Bagaimana cara melakukan TDD sederhana menggunakan VSTS". Saya harus membaca lebih lanjut, Anda benar.

Untuk nUnit, saya membacanya. Dan saya TDD pada hari yang sama. Dengan menyenangkan.

Ngomong-ngomong, saya biasanya suka produk Microsoft. Visual Studio benar-benar alat terbaik yang bisa dibeli pengembang - tetapi TDD dan manajemen Item Kerja dalam Visual Studio Team System benar-benar menyebalkan.

Semua yang terbaik. Sylvain.

Sylvain Rodrigue
sumber
9

Saya mendapat pesan bahwa "struktur file NUnit lebih kaya daripada VSTest" ... Tentu saja jika Anda lebih suka struktur file NUnit, Anda dapat menggunakan solusi ini dengan cara lain, seperti ini (NUnit-> VS):

 #if !MSTEST
  using NUnit.Framework;
 #else
  using Microsoft.VisualStudio.TestTools.UnitTesting;
  using TestFixture = Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute;
  using Test = Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute;
  using SetUp = Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute;
  using TearDown = Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute;
 #endif

Atau konversi lain ... :-) Ini menggunakan di sini hanya alias ke kompiler.

Tuomas Hietanen
sumber
1
Saya tidak mengerti apa yang Anda katakan di sini.
PositiveGuy
tidak ada pengaturan tingkat / teardown fixture :( atau apakah mereka menganggap kita menggunakan ctor dan dtor?
JDPeckham
9

Pertama saya ingin memperbaiki pernyataan yang salah: Anda dapat menjalankan msTest di luar visual studio menggunakan baris perintah. Meskipun beberapa alat CI seperti TeamCity memiliki dukungan yang lebih baik untuk NUnit (mungkin akan berubah karena msTest menjadi lebih populer). Dalam proyek saya saat ini, kami menggunakan keduanya dan satu-satunya perbedaan besar yang kami temukan adalah bahwa mstest selalu berjalan sebagai 32bit sedangkan NUnit berjalan sebagai uji 32bit atau 64bit yang hanya penting jika kode Anda menggunakan kode asli yang bergantung pada 32/64.

Dror Helper
sumber
8

Saya mulai dengan MSTest tetapi beralih karena satu alasan sederhana. MSTest tidak mendukung Warisan Metode Uji dari majelis lain.

Saya benci gagasan untuk menulis tes yang sama beberapa kali. Terutama pada proyek besar di mana metode pengujian dapat dengan mudah mencapai 100-an tes.

NUnit benar-benar melakukan apa yang saya butuhkan. Satu-satunya hal yang hilang dengan NUnit adalah Visual Studio Addin yang telah dapat menampilkan status Merah / Hijau (Seperti VSTS) dari setiap tes.


sumber
7

Jika Anda mempertimbangkan MSTest atau nUnit, maka saya sarankan Anda melihat mbUnit. Alasan saya adalah

  1. Kompatibilitas TestDriven.Net. Tidak ada yang mengalahkan, TestDriven.Net.ReRunWithDebugger terikat dengan kombinasi keyboard.
  2. Kerangka kerja Gallio. Gallio adalah pelari ujian seperti nUnits. Satu-satunya perbedaan adalah tidak peduli jika Anda menulis tes Anda di nUnit, msTest, xUnit atau mbUnit. Mereka semua lari.
  3. Kompatibilitas dengan nUnit. Semua fitur di nUnit didukung oleh mbUnit. Saya pikir Anda bahkan tidak perlu mengubah atribut Anda (harus memeriksanya), hanya referensi dan penggunaan Anda.
  4. Koleksi menegaskan. mbUnit memiliki lebih banyak Assert cases, termasuk kelas CollectionAssert. Pada dasarnya Anda tidak perlu lagi menulis tes Anda sendiri untuk melihat apakah 2 koleksi itu sama.
  5. Tes kombinatorial. Bukankah lebih keren jika Anda bisa menyediakan dua set data dan mendapatkan tes untuk semua kombinasi data. Itu di mbUnit.

Saya awalnya mengambil mbUnit karena fungsinya [RowTest ....], dan saya belum menemukan satu alasan pun untuk kembali. Saya memindahkan semua suite tes aktif saya dari nUnit, dan tidak pernah melihat ke belakang. Sejak itu saya telah mengonversi dua tim pengembangan berbeda ke manfaatnya.

AlSki
sumber
6

Sejauh yang saya tahu, ada empat kerangka kerja yang tersedia untuk pengujian unit dengan .NET hari ini

  • NUnit
  • MbUnit
  • MSTest
  • xUnit

NUnit selalu berada di depan tetapi kesenjangan telah ditutup pada sekitar setahun terakhir. Saya masih lebih suka NUnit sendiri, terutama karena mereka menambahkan antarmuka yang lancar beberapa waktu lalu yang membuat tes sangat mudah dibaca.

Jika Anda baru memulai dengan unit yang mengujinya, mungkin tidak ada banyak perbedaan. Setelah Anda mencapai kecepatan Anda akan berada dalam posisi yang lebih baik untuk menilai kerangka mana yang terbaik untuk kebutuhan Anda.

gilles27
sumber
6

Saya tidak suka kerangka kerja pengujian VS bawaan karena memaksa Anda untuk membuat proyek terpisah sebagai lawan memiliki tes Anda sebagai bagian dari proyek yang Anda uji.

Gene Mitelman
sumber
3
Anda sebenarnya dapat mengelabui Visual Studio dengan mengedit file proyek secara manual dan menambahkan nilai ProjectTypeGuids yang digunakan untuk mengidentifikasi proyek pengujian: & lt; ProjectTypeGuids & gt; {3AC096D0-A1C2-E12C-1390-A8335801FDAB}; {FAE04EC0-301F-11D3- BF4B-00C04F79EFBC} & lt; / ProjectTypeGuids & gt;
Paul Ruane
5

MSTest pada dasarnya NUnit sedikit dikerjakan ulang, dengan beberapa fitur baru (seperti pengaturan perakitan dan teardown, tidak hanya fixture dan tingkat pengujian), dan kehilangan beberapa bit terbaik (seperti sintaks kendala 2,4 baru). NUnit lebih matang, dan ada lebih banyak dukungan dari vendor lain; dan tentu saja karena selalu gratis (sedangkan MSTest hanya membuatnya menjadi versi Profesional 2008, sebelum itu itu cara SKU lebih mahal), sebagian besar proyek ALT.NET menggunakannya.

Karena itu, ada beberapa perusahaan yang sangat enggan untuk menggunakan sesuatu yang tidak memiliki label Microsoft di atasnya, dan terutama kode OSS. Jadi memiliki kerangka kerja pengujian MS resmi mungkin menjadi motivasi bahwa perusahaan-perusahaan perlu mendapatkan pengujian; dan mari kita jujur, itu pengujian yang penting, bukan alat apa yang Anda gunakan (dan menggunakan kode Tuomas Hietanen di atas, Anda hampir dapat membuat kerangka pengujian Anda dapat dipertukarkan).

David Keaveny
sumber
Saya suka sintaks contraint NUnit tetapi saya pikir Anda harus membaca ini mengenai SetUpdan TearDownatribut: jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html
Nobody
4

Dengan rilis dalam .NET 4.0 dari sistem Kontrak Kode dan ketersediaan pemeriksa statis , Anda perlu secara teoritis menulis lebih sedikit kasus uji dan alat seperti Pex akan membantu mengidentifikasi kasus-kasus itu. Terkait hal ini dengan diskusi yang sedang berlangsung, jika Anda perlu melakukan lebih sedikit dengan tes unit Anda karena kontrak Anda menutupi ekor Anda, maka mengapa tidak langsung saja menggunakan potongan bawaan karena itu adalah salah satu ketergantungan yang kurang untuk dikelola. Hari-hari ini, saya semua tentang kesederhanaan. :-)

Lihat juga:

Norman H.
sumber
3

Saya lebih suka menggunakan kerangka uji MS kecil, tetapi untuk saat ini saya tetap dengan NUnit. Masalah dengan MS umumnya (untuk saya)

  • File "tes" yang dibagikan (tanpa tujuan) yang harus dipertahankan
  • Daftar tes menyebabkan konflik dengan banyak pengembang / VCS
  • UI terintegrasi yang buruk - pengaturan yang membingungkan, pemilihan tes yang memberatkan
  • Tidak ada pelari eksternal yang baik

Peringatan - Jika saya menguji situs aspx, saya pasti akan menggunakan MS - Jika saya mengembangkan solo, juga MS akan baik-baik saja - Jika saya memiliki keterampilan terbatas dan tidak dapat mengkonfigurasi NUnit :)

Saya merasa jauh lebih mudah untuk hanya menulis tes saya dan menjalankan NUnitGUI atau salah satu ujung depan lainnya (testDriven jauh jauh jauh lebih mahal). Menyiapkan debugging dengan versi commandline juga cukup mudah.

Andrew Backer
sumber
Saat ini saya menggunakan Resharper untuk menjalankan Tes MS, jadi saya tidak terlalu keberatan. Saya lebih suka CodeRush + RefactorPro, meskipun bukan itu yang kami gunakan di sini. Mungkin mereka memiliki pelari yang layak untuk MS Test sekarang juga.
Andrew Backer