Noções básicas sobre o MSTest TestContext
Usando o MSTest, eu precisava obter o nome do teste atual de dentro do[TestInitialize]
método. Você pode obter isso noTestContext.TestName
propriedade.
Eu encontrei uma diferença inesperada no comportamento entre um estáticoTestContext
que é passado para o[ClassInitialize]
e um declarado como uma propriedade pública (e definido pelo executor de teste).
Considere o seguinte código:
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); }
}
}
Isso faz com que seja produzido o seguinte (cópia colada da saída do executor de teste do Resharper no VS2013):
TestContext.TestName='TestMethod1' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod2' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod3' static _testContext.TestName='TestMethod1'
Eu já havia assumido que as duas instâncias deTestContext
seria equivalente, mas claramente não são.
public TestContext
propriedade se comporta como eu esperooprivate static TestContext
valor que é passado para o[ClassInitialize]
método não. Desde aTestContext
possui propriedades relacionadas ao teste atualmente em execução, essa implementação parece enganosa e interrompidaExiste algum cenário em que você realmente prefere usar oTestContext
passado para o[ClassInitialize]
método, ou é melhor ignorado e nunca usado?