MSTest'in NUnit'in TestCase ile eşdeğeri var mı?


107

TestCaseNUnit'teki özelliği, her test için ayrı bir yönteme ihtiyaç duymadan test parametrelerini belirlemenin hızlı bir yolu olarak oldukça kullanışlı buluyorum . MSTest'te benzer bir şey var mı?

 [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);  
     }  
 }  


Neden NUnit kullanmıyorsun?
Mike de Klerk

1
@MikedeKlerk: Entity Framework kullanıyorsanız Nunit inanılmaz derecede yavaştır ... Görünüşe göre her testi çalıştırdığınızda oluşturulan tüm sınıflarınızı yansıtıyor.
Robert Harvey

Genel olarak konuşursak, NUnit, MSTest'ten daha fazla özelliğe sahiptir, testlerinizi VS Test Gezgini ile çalıştırmak için MSTest kullanıyorsanız, NuGet üzerinden NUnit Test Bağdaştırıcısı uzantısını yükleyerek aynısını NUnit ile yapabilirsiniz
Yığın

1
Deneyin DataRow(), bakınız: blogs.msdn.microsoft.com/devops/2016/06/17/…
Babak

Yanıtlar:


62

Microsoft kısa süre önce "MSTest V2" yi duyurdu ( blog makalesine bakın ). Bu, tutarlı bir şekilde (masaüstü, UWP, ...) DataRow-öznitelik! Özelliğini kullanmanızı sağlar !

 [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);  
     }  
 } 

Yine, Visual Studio Express'in Test Gezgini maalesef bu testleri tanımıyor. Ama en azından "tam" VS sürümleri artık bu özelliği destekliyor!

Bunu kullanmak için, NuGet paketlerini MSTest.TestFramework ve MSTest.TestAdapter ( şimdilik her ikisi de önceden yayınlanmıştır) yükleyin .

Daha eski cevap:

MSTest'e bağlı kalmanız gerekmiyorsa ve yalnızca Test Gezgini aracılığıyla testleri çalıştırabilmek için kullanıyorsanız çünkü yalnızca bir Visual Studio Express sürümünüz var, o zaman bu sizin için bir çözüm olabilir:

NUnit testlerini Test Gezgini aracılığıyla çalıştırabilmek için VsTestAdapter VSIX uzantısı vardır . Ne yazık ki, VS Express kullanıcıları uzantıları yükleyemez ... Ama neyse ki VsTestAdapter düz bir NuGet Paketi ile birlikte gelir !

Dolayısıyla, bir VS Express kullanıcısıysanız, VsTestAdapter NuGet Paketini kurun ve NUnit testlerinizi / test olaylarınızı Test Gezgini aracılığıyla çalıştırmanın keyfini çıkarın!


Maalesef yukarıda belirtilen ifade doğru değil. Paketi bir Express sürümü aracılığıyla kurmak tamamen mümkün olsa da, Test Gezgini'ni kullanamadığı için faydasızdır. Daha önce TestAdapter'ın 2.0.0'ın açıklama sayfasından kaldırılan eski bir sürümünde bir yan not vardı :

VS Express ile çalışmadığını unutmayın


4
MSTest "v2" artık VS 2017 kullanırken varsayılan çerçevedir. Artık bu, en son sürümde OOTB destekleneceğine göre, bu bilgi muhtemelen cevabın en üstüne gitmelidir.
Marc L.

34

Bunun geç bir cevap olduğunu biliyorum ama umarım başkalarına yardım eder.

Zarif bir çözüm için her yere baktım ve kendim bir çözüm yazdım. Binlerce birim testi ve yüzbinlerce yineleme ile 20'den fazla projede kullanıyoruz. Bir kez bile hiçbir şeyi kaçırmadım.

https://github.com/Thwaitesy/MSTestHacks

1) NuGet paketini kurun .

2) Test sınıfınızı TestBase'den devralın

public class UnitTest1 : TestBase
{ }

3) IEnumerable döndüren bir Özellik, Alan veya Yöntem oluşturun

[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) MSTest DataSource özniteliğini test yönteminize ekleyin ve yukarıdaki IEnumerable adına geri dönün. Bunun tam olarak nitelendirilmesi gerekiyor.

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

    Assert.IsNotNull(number);
}

Son Sonuç: Normal DataSource gibi 3 iterasyon :)

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);
        }
    }
}

Bu aynı zamanda her durum için birden fazla parametre ile çalışır mı?
Lonefish

Temel kitaplıkta bir değişiklik olduğu için bu, MsTest "v2" ile çalışmaz . Bu, VS15 (VS 2017) için varsayılandır.
Marc L.

3
Evet, MSTest V2 kullanıyorsanız, NUnit'e benzer yeni bir test senaryosu sağlayıcısı vardır. Bu yüzden bu işe gerek yok 👏
Thwaitesy

Bu VS 2015'te işe yaramıyor gibi görünüyor, uygulama yapılandırma dosyası dinamik olarak doldurulmuyor ve bu nedenle veri kaynakları bulunamıyor
Reed

13

Bunun başka bir geç cevap olduğunu biliyorum, ancak MS Test çerçevesini kullanmaya kilitlenen ekibimde, bir dizi test verisini tutmak için yalnızca Anonim Türlere ve her satırda döngü yapmak ve test etmek için LINQ'ya dayanan bir teknik geliştirdik. Ek sınıf veya çerçeve gerektirmez ve okunması ve anlaşılması oldukça kolay olma eğilimindedir. Ayrıca, harici dosyalar veya bağlı bir veritabanı kullanan veriye dayalı testlerden çok daha kolaydır.

Örneğin, şöyle bir uzantı yönteminiz olduğunu varsayalım:

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);
    }
}

LINQ ile birleştirilmiş Anonim Türleri aşağıdaki gibi bir test yazmak için kullanabilirsiniz:

[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); 
        }); 
    }
}

Bu tekniği kullanırken, hangi satırın testin başarısız olmasına neden olduğunu belirlemenize yardımcı olmak için Assert'teki giriş verilerini içeren biçimlendirilmiş bir mesaj kullanmak yararlıdır.

Bu çözüm hakkında daha fazla arka plan ve ayrıntıyla AgileCoder.net'te blog yazdım .


4
Bununla ilgili en büyük sorun, değerler dizisinden herhangi bir durum çıkarsa, tüm test başarısız olur ve daha fazla vaka test edilmez.
ytoledano

Bu, birbirini etkileyebilecek test senaryoları oluşturur.
BartoszKP

@BartoszKP Yalnızca test edilen sistemin yan etkileri varsa, bu durumda bu muhtemelen optimal bir teknik değildir.
Gary. Ray

@ Gary.Ray Ayrıca sistemin henüz yan etkileri olmadığında . Ayrıca bir test geçmediğinde ve başka bir geliştirici bunu düzeltmeye çalıştığında ve bağımlılığın önemli olup olmadığını anlamaya çalışırken saatler harcadığında. Bu asla yapmamanız gereken bir şey, nokta.
BartoszKP

Yeterince iyi. +1
Trey Mack

7

Khlr iyi bir ayrıntılı açıklama yaptı ve görünüşe göre bu yaklaşım VS2015 Express for Desktop'ta çalışmaya başladı. Yorum bırakmaya çalıştım, ancak itibar eksikliğim bunu yapmama izin vermedi.

Çözümü buraya kopyalayayım:

[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);  
     }  
 } 

Bunu kullanmak için NuGet paketlerini MSTest.TestFramework ve MSTest.TestAdapter kurmanız yeterlidir .

Bir problem şu ki

Hata CS0433 'TestClassAttribute' türü hem 'Microsoft.VisualStudio.QualityTools.UnitTestFramework, Sürüm = 10.0.0.0 hem de' Microsoft.VisualStudio.TestPlatform.TestFramework, Sürüm = 14.0.0.0'da mevcuttur

Bu nedenle, lütfen Microsoft.VisualStudio.QualityTools.UnitTestFramework'ü proje referanslarından kaldırın .

Orijinal yanıtı düzenleyebilir ve bunu silebilirsiniz.


0

MSTest, bir veritabanı tablosu, csv, xml vb. Beslemenizi sağlayacak DataSource özniteliğine sahiptir. Ben kullandım ve iyi çalışıyor. Verileri, sorunuzdaki gibi öznitelikler olarak tam olarak yerleştirmenin bir yolunu bilmiyorum, ancak harici veri kaynaklarını ayarlamak çok kolaydır ve dosyalar projeye dahil edilebilir. Başladığımdan bir saat sonra çalıştırdım ve otomatik bir test uzmanı değilim.

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396 , veritabanı girdisine dayalı tam bir eğiticiye sahiptir.

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/ , XML dosyası girdisine dayalı bir öğretici içerir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.