it-swarm.com.de

Wie führe ich eine Testmethode mit mehreren Parametern in MSTest aus?

NUnit hat eine Funktion namens "Werte", wie unten dargestellt:

[Test]
public void MyTest(
    [Values(1,2,3)] int x,
    [Values("A","B")] string s)
{
    // ...
}

Dies bedeutet, dass die Testmethode sechsmal ausgeführt wird:

MyTest(1, "A")
MyTest(1, "B")
MyTest(2, "A")
MyTest(2, "B")
MyTest(3, "A")
MyTest(3, "B")

Wir verwenden jetzt MSTest. Gibt es eine Entsprechung dafür, damit ich denselben Test mit mehreren Parametern ausführen kann?

[TestMethod]
public void Mytest()
{
    // ...
}
124
The Light

Es wird in MSTest leider nicht unterstützt. Anscheinend gibt es ein Erweiterungsmodell und Sie können es selbst implementieren . Eine andere Option wäre die Verwendung von datengesteuerte Tests .

Meine persönliche Meinung wäre allerdings, einfach bei NUnit zu bleiben ...

BEARBEITEN: Ab Visual Studio 2012, Update 1, verfügt MSTest über eine ähnliche Funktion. Siehe @ McAdens Antwort unten.

43
jeroenh

EDIT 4: So wie es aussieht, ist MSTest V2 am 17. Juni 2016 fertiggestellt: https://blogs.msdn.Microsoft.com/visualstudioalm/2016/06/17/taking -the-mstest-framework-forward-with-mstest-v2 /

Ursprüngliche Antwort:

Seit ungefähr einer Woche ist in Visual Studio 2012 Update 1 etwas Ähnliches möglich:

[DataTestMethod]
[DataRow(12,3,4)]
[DataRow(12,2,6)]
[DataRow(12,4,3)]
public void DivideTest(int n, int d, int q)
{
  Assert.AreEqual( q, n / d );
}

[~ # ~] edit [~ # ~]: Dies ist anscheinend nur im Unit-Test-Projekt für WinRT/Metro verfügbar. Schade

EDIT 2: Die folgenden Metadaten wurden mit "Gehe zu Definition" in Visual Studio gefunden:

#region Assembly Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll, v11.0.0.0
// C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0\ExtensionSDKs\MSTestFramework\11.0\References\CommonConfiguration\neutral\Microsoft.VisualStudio.TestPlatform.UnitTestFramework.dll
#endregion

using System;

namespace Microsoft.VisualStudio.TestPlatform.UnitTestFramework
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class DataTestMethodAttribute : TestMethodAttribute
    {
        public DataTestMethodAttribute();

        public override TestResult[] Execute(ITestMethod testMethod);
    }
}

EDIT 3: Dieses Problem wurde in den UserVoice-Foren von Visual Studio angesprochen. Letzte Aktualisierung lautet:

ERSTE SCHRITTE · Visual Studio-Team ADMIN Visual Studio-Team (Produktteam, Microsoft Visual Studio) hat geantwortet · 25. April 2016 Vielen Dank für das Feedback. Daran haben wir begonnen.

Pratap Lakshman Visual Studio

https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/3865310-allow-use-of-datestmethod-datarow-in-all-unit

137
McAden

Diese Funktion ist in Vorabversion jetzt verfügbar und funktioniert mit VS 2015.

Beispielsweise:

[TestClass]
public class UnitTest1
{
    [DataTestMethod]
    [DataRow(1, 2, 2)]
    [DataRow(2, 3, 5)]
    [DataRow(3, 5, 8)]
    public void AdditionTest(int a, int b, int result)
    {
        Assert.AreEqual(result, a + b);
    }
}
25
Pompair

Da niemand etwas erwähnt hat - nicht genau dasselbe wie die Attribute Value (oder TestCase) von NUnit, aber MSTest hat das Attribut DataSource , mit dem Sie dies tun können Ähnliches. Sie können es an eine Datenbank oder eine XML-Datei anschließen - nicht so einfach wie die Funktion von NUnit, erledigt aber die Aufgabe.

10
k.m

MSTest hat ein leistungsfähiges Attribut namens DataSource . Mit diesem Attribut können Sie einen datengesteuerten Test nach Ihren Wünschen durchführen. Sie können Ihre Testdaten in XML, CSV oder in einer Datenbank haben. Hier sind einige Links, die Sie führen

http://visualstudiomagazine.com/articles/2009/09/15/unit-testing-with-vsts2008-part-3.aspxhttp://msdn.Microsoft.com/ de-de/library/ms182527.aspx
http://msdn.Microsoft.com/en-us/library/ms243192.aspx

Hoffe das wird dir helfen.

7
Pritam Karmakar

MsTest unterstützt diese Funktion nicht, Sie können jedoch ein eigenes Attribut implementieren, um dies zu erreichen. schau dir das unten an:

http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html

4

Die Implementierung ist sehr einfach - Sie sollten die Eigenschaft TestContext und TestPropertyAttribute verwenden.

Beispiel

public TestContext TestContext { get; set; }
private List<string> GetProperties()
{
    return TestContext.Properties
        .Cast<KeyValuePair<string, object>>()
        .Where(_ => _.Key.StartsWith("par"))
        .Select(_ => _.Value as string)
        .ToList();
}

//usage
[TestMethod]
[TestProperty("par1", "http://getbootstrap.com/components/")]
[TestProperty("par2", "http://www.wsj.com/europe")]
public void SomeTest()
{
    var pars = GetProperties();
    //...
}
4
Andrey Burykin

Es gibt natürlich einen anderen Weg, der in diesem Thread nicht behandelt wurde, d. H. Durch Vererbung der Klasse, die die TestMethod enthält. Im folgenden Beispiel wurde nur eine Testmethode definiert, es wurden jedoch zwei Testfälle erstellt.

In Visual Studio 2012 werden zwei Tests im TestExplorer erstellt:

  1. DemoTest_B10_A5.test
  2. DemoTest_A12_B4.test

    public class Demo
    {
        int a, b;
    
        public Demo(int _a, int _b)
        {
            this.a = _a;
            this.b = _b;
        }
    
        public int Sum()
        {
            return this.a + this.b;
        }
    }
    
    public abstract class DemoTestBase
    {
        Demo objUnderTest;
        int expectedSum;
    
        public DemoTestBase(int _a, int _b, int _expectedSum)
        {
            objUnderTest = new Demo(_a, _b);
            this.expectedSum = _expectedSum;
        }
    
        [TestMethod]
        public void test()
        {
            Assert.AreEqual(this.expectedSum, this.objUnderTest.Sum());
        }
    }
    
    [TestClass]
    public class DemoTest_A12_B4 : DemoTestBase
    {
        public DemoTest_A12_B4() : base(12, 4, 16) { }
    }
    
    public abstract class DemoTest_B10_Base : DemoTestBase
    {
        public DemoTest_B10_Base(int _a) : base(_a, 10, _a + 10) { }
    }
    
    [TestClass]
    public class DemoTest_B10_A5 : DemoTest_B10_Base
    {
        public DemoTest_B10_A5() : base(5) { }
    }
    
4
Soumya Dutta

Ich konnte The DataRowAttribute nicht in Visual Studio 2015 zum Laufen bringen. Am Ende hatte ich Folgendes:

[TestClass]
public class Tests
{
    private Foo _toTest;

    [TestInitialize]
    public void Setup()
    {
        this._toTest = new Foo();       
    }

    [TestMethod]
    public void ATest()
    {
        this.Perform_ATest(1, 1, 2);
        this.Setup();

        this.Perform_ATest(100, 200, 300);
        this.Setup();

        this.Perform_ATest(817001, 212, 817213);
        this.Setup();

    }

    private void Perform_ATest(int a, int b, int expected)
    {
        //Obviously this would be way more complex...

        Assert.IsTrue(this._toTest.Add(a,b) == expected);    
    }
}

public class Foo
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

Die wirkliche Lösung besteht darin, nur NUnit zu verwenden (es sei denn, Sie stecken in MSTest fest, wie ich es in diesem speziellen Fall bin).

3
Brandon