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.

opublic 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 interrompida

Existe algum cenário em que você realmente prefere usar oTestContext passado para o[ClassInitialize] método, ou é melhor ignorado e nunca usado?

questionAnswers(3)

yourAnswerToTheQuestion