Grundlegendes zum MSTest-Testkontext
Unter Verwendung von MSTest musste ich den Namen des aktuellen Tests aus dem Internet abrufen[TestInitialize]
Methode. Sie können dies von der bekommenTestContext.TestName
Eigentum.
Ich habe einen unerwarteten Unterschied im Verhalten zwischen einer statischen gefundenTestContext
das ist in die übergeben[ClassInitialize]
Methode und eine, die als öffentliche Eigenschaft deklariert ist (und vom Testläufer festgelegt wird).
Betrachten Sie den folgenden Code:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestContext.Tests
{
[TestClass]
public class UnitTest1
{
public TestContext TestContext { get; set; }
private static TestContext _testContext;
[ClassInitialize]
public static void SetupTests(TestContext testContext)
{
_testContext = testContext;
}
[TestInitialize]
public void SetupTest()
{
Console.WriteLine(
"TestContext.TestName='{0}' static _testContext.TestName='{1}'",
TestContext.TestName,
_testContext.TestName);
}
[TestMethod] public void TestMethod1() { Assert.IsTrue(true); }
[TestMethod] public void TestMethod2() { Assert.IsTrue(true); }
[TestMethod] public void TestMethod3() { Assert.IsTrue(true); }
}
}
Dadurch wird Folgendes ausgegeben (kopiert und aus der Ausgabe des Resharper-Testläufers in VS2013 eingefügt):
TestContext.TestName='TestMethod1' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod2' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod3' static _testContext.TestName='TestMethod1'
Ich hatte vorher angenommen, dass die beiden Instanzen vonTestContext
wäre gleichwertig, aber eindeutig nicht.
public TestContext
Eigentum verhält sich wie ich es erwarteDasprivate static TestContext
Wert, der an das übergeben wird[ClassInitialize]
Methode nicht. Schon seitTestContext
Hat Eigenschaften, die sich auf den aktuell ausgeführten Test beziehen, erscheint diese Implementierung irreführend und fehlerhaftGibt es ein Szenario, in dem Sie eigentlich lieber die verwenden würden?TestContext
übergeben an die[ClassInitialize]
Methode, oder es wird am besten ignoriert und nie verwendet?