Apakah MSTest setara dengan NUnit's TestCase?


107

Saya menemukan TestCasefitur di NUnit cukup berguna sebagai cara cepat untuk menentukan parameter pengujian tanpa memerlukan metode terpisah untuk setiap pengujian. Apakah ada yang serupa di MSTest?

 [TestFixture]  
 public class StringFormatUtilsTest  
 {  
     [TestCase("tttt", "")]  
     [TestCase("", "")]  
     [TestCase("t3a4b5", "345")]  
     [TestCase("3&5*", "35")]  
     [TestCase("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 }  


Mengapa Anda tidak menggunakan NUnit?
Mike de Klerk

1
@MikedeKlerk: Nunit sangat lambat jika Anda menggunakan Entity Framework ... Tampaknya ini mencerminkan semua kelas yang Anda buat setiap kali Anda menjalankan pengujian.
Robert Harvey

Secara umum, NUnit memiliki lebih banyak fitur daripada MSTest, jika Anda menggunakan MSTest hanya untuk dapat menjalankan pengujian Anda dengan VS Test Explorer, maka Anda dapat melakukan hal yang sama dengan NUnit dengan menginstal ekstensi Adaptor Uji NUnit melalui NuGet
Stacked

Jawaban:


62

Microsoft baru-baru ini mengumumkan "MSTest V2" (lihat artikel-blog ). Hal ini memungkinkan Anda untuk secara konsisten (desktop, UWP, ...) menggunakan DataRowatribut-!

 [TestClass]  
 public class StringFormatUtilsTest  
 {  
     [DataTestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

Sekali lagi, Sayangnya, Visual Studio Express 'Test Explorer tidak mengenali tes ini. Tapi setidaknya versi VS "penuh" sekarang mendukung fitur itu!

Untuk menggunakannya, cukup instal paket NuGet MSTest.TestFramework dan MSTest.TestAdapter (keduanya pra-rilis seperti yang sekarang).

Jawaban yang lebih lama:

Jika tidak harus tetap menggunakan MSTest dan Anda hanya menggunakannya untuk dapat menjalankan tes melalui Test Explorer karena Anda hanya memiliki edisi Visual Studio Express, maka ini mungkin solusi untuk Anda:

Ada ekstensi VsTestAdapter VSIX untuk dapat menjalankan pengujian NUnit melalui Test Explorer. Sayangnya, pengguna VS Express tidak dapat menginstal ekstensi ... Tapi untungnya, VsTestAdapter hadir dengan NuGet-Package biasa juga!

Jadi, jika Anda adalah pengguna VS Express, cukup instal VsTestAdapter NuGet-Package dan nikmati menjalankan tes / testcases NUnit Anda melalui Test Explorer!


Sayangnya pernyataan di atas tidak benar. Meskipun sangat mungkin untuk menginstal paket melalui edisi Express, itu tidak berguna, karena tidak dapat menggunakan Test Explorer. Sebelumnya ada catatan tambahan pada versi lama TestAdapter, yang telah dihapus dari halaman deskripsi 2.0.0 :

Perhatikan bahwa ini tidak berfungsi dengan VS Express


4
MSTest "v2" sekarang adalah kerangka kerja default saat menggunakan VS 2017. Sekarang ini akan mendukung OOTB pada versi terbaru, info itu mungkin harus pergi ke atas jawaban.
Marc L.

34

Saya tahu ini adalah jawaban yang terlambat tetapi mudah-mudahan ini membantu orang lain.

Saya mencari solusi elegan ke mana-mana dan akhirnya menulisnya sendiri. Kami menggunakannya di lebih dari 20 proyek dengan ribuan pengujian unit dan ratusan ribu iterasi. Tidak pernah sekalipun ketinggalan.

https://github.com/Thwaitesy/MSTestHacks

1) Instal paket NuGet .

2) Mewarisi kelas pengujian Anda dari TestBase

public class UnitTest1 : TestBase
{ }

3) Buat Properti, Bidang atau Metode, yang mengembalikan IEnumerable

[TestClass]
public class UnitTest1 : TestBase
{
    private IEnumerable<int> Stuff
    {
        get
        {
            //This could do anything, get a dynamic list from anywhere....
            return new List<int> { 1, 2, 3 };
        }
    }
}

4) Tambahkan atribut MSTest DataSource ke metode pengujian Anda, dengan menunjuk kembali ke nama IEnumerable di atas. Ini harus sepenuhnya memenuhi syarat.

[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}

Hasil Akhir: 3 iterasi seperti Sumber Data normal :)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;

namespace Namespace
{
    [TestClass]
    public class UnitTest1 : TestBase
    {
        private IEnumerable<int> Stuff
        {
            get
            {
                //This could do anything, get a dynamic list from anywhere....
                return new List<int> { 1, 2, 3 };
            }
        }

        [TestMethod]
        [DataSource("Namespace.UnitTest1.Stuff")]
        public void TestMethod1()
        {
            var number = this.TestContext.GetRuntimeDataSourceObject<int>();

            Assert.IsNotNull(number);
        }
    }
}

Apakah ini juga berfungsi dengan beberapa parameter untuk setiap kasus?
Lonefish

Karena ada perubahan di pustaka yang mendasarinya, ini tidak bekerja dengan MsTest "v2" . Ini adalah default untuk VS15 (VS 2017).
Marc L.

3
Ya, jika Anda menggunakan MSTest V2, ada penyedia kasus pengujian baru yang mirip dengan NUnit. Jadi tidak perlu untuk pekerjaan ini sekitar 👏
Thwaitesy

Ini tampaknya tidak berfungsi di VS 2015, file konfigurasi aplikasi tidak terisi secara dinamis dan dengan demikian sumber datanya tidak ditemukan
Reed

13

Saya tahu ini adalah jawaban lain yang terlambat, tetapi di tim saya yang terkunci dalam menggunakan kerangka kerja MS Test, kami mengembangkan teknik yang hanya mengandalkan Jenis Anonim untuk menyimpan berbagai data pengujian, dan LINQ untuk mengulang dan menguji setiap baris. Ini tidak memerlukan kelas atau kerangka kerja tambahan, dan cenderung cukup mudah dibaca dan dipahami. Ini juga jauh lebih mudah untuk diterapkan daripada pengujian berbasis data menggunakan file eksternal atau database yang terhubung.

Misalnya, Anda memiliki metode ekstensi seperti ini:

public static class Extensions
{
    /// <summary>
    /// Get the Qtr with optional offset to add or subtract quarters
    /// </summary>
    public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
    {
        return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
    }
}

Anda bisa menggunakan dan array Anonymous Type yang digabungkan ke LINQ untuk menulis tes seperti ini:

[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
    // Arrange
    var values = new[] {
        new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
        new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
        // Could add as many rows as you want, or extract to a private method that
        // builds the array of data
    }; 
    values.ToList().ForEach(val => 
    { 
        // Act 
        int actualQuarter = val.inputDate.GetQuarterNumber(val.offset); 
        // Assert 
        Assert.AreEqual(val.expectedQuarter, actualQuarter, 
            "Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter); 
        }); 
    }
}

Saat menggunakan teknik ini, sebaiknya gunakan pesan yang diformat yang menyertakan data input di Assert untuk membantu Anda mengidentifikasi baris mana yang menyebabkan pengujian gagal.

Saya telah membuat blog tentang solusi ini dengan latar belakang dan detail lebih lanjut di AgileCoder.net .


4
Masalah terbesar dengan ini adalah bahwa jika ada kasus yang gagal dari larik nilai - seluruh pengujian gagal dan tidak ada lagi kasus yang diuji.
ytoledano

Ini menciptakan kasus uji yang dapat saling memengaruhi.
BartoszKP

@BartoszKP Hanya jika sistem yang diuji memiliki efek samping, dalam hal ini mungkin bukan teknik yang optimal.
Gary Ray

@ Gary.Ray Juga ketika sistem tidak memiliki efek samping belum . Juga ketika tes tidak lulus dan pengembang lain mencoba untuk memperbaikinya, dan membuang waktu berjam-jam mencoba untuk mencari tahu apakah ketergantungan itu penting atau tidak. Ini adalah sesuatu yang seharusnya tidak pernah Anda lakukan, titik.
BartoszKP

Cukup baik. +1
Trey Mack

7

Khlr memberikan penjelasan rinci yang bagus dan tampaknya pendekatan ini mulai bekerja di VS2015 Express untuk Desktop. Saya mencoba untuk meninggalkan komentar, tetapi kurangnya reputasi saya tidak memungkinkan saya untuk melakukannya.

Izinkan saya menyalin solusinya di sini:

[TestClass]  
 public class StringFormatUtilsTest  
 {  
     [TestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&amp;amp;5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

Untuk menggunakannya, cukup instal paket NuGet MSTest.TestFramework dan MSTest.TestAdapter .

Salah satu masalahnya adalah

Kesalahan CS0433 Jenis 'TestClassAttribute' ada di 'Microsoft.VisualStudio.QualityTools.UnitTestFramework, Versi = 10.0.0.0 dan' Microsoft.VisualStudio.TestPlatform.TestFramework, Versi = 14.0.0.0

Jadi, hapus Microsoft.VisualStudio.QualityTools.UnitTestFramework dari referensi proyek.

Anda sangat dipersilakan untuk mengedit balasan asli dan menghapus yang ini.


0

MSTest memiliki atribut DataSource, yang memungkinkan Anda untuk memberinya makan tabel database, csv, xml, dll. Saya telah menggunakannya dan bekerja dengan baik. Saya tidak tahu cara untuk meletakkan data tepat di atas sebagai atribut seperti dalam pertanyaan Anda, tetapi sangat mudah untuk mengatur sumber data eksternal dan file dapat disertakan dalam proyek. Saya sudah menjalankannya satu jam sejak saya mulai, dan saya bukan ahli pengujian otomatis.

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 memiliki tutorial lengkap berdasarkan input database.

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ memiliki tutorial berdasarkan input file XML.

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.