TestContext.TestName属性永远不会更改

时间:2012-11-21 13:20:29

标签: c# .net visual-studio unit-testing mstest

目标:

我想使用TestContext.TestName属性来提取正在运行的测试的名称,以便我的[TestCleanup]函数可以在每次测试完成时自动将结果记录到我们的定制结果存储库中。

问题:

即使在我的基本'健全性检查'测试项目中,其中包含5个与以下结构类似的测试:

[TestMethod]
public void TestMethodX()
{
    Console.WriteLine(String.Format("In Test '{0}'",_ctx.TestName));
    Assert.IsTrue(true);
}

使用下面的类'初始值设定项'为我设置_ctx:

[ClassInitialize]
public static void ClassInit(TestContext Context)
{
    _ctx = Context;
    Console.WriteLine("In ClassInit()");
}

[[注意:Console.WriteLines纯粹是我将鼠标悬停在上面并检查值/属性等]。]

_ctx.TestName从测试运行中的第一个测试的名称改变,即如果我要运行所有五个测试('TestMethod1','TestMethod2','TestMethod3'等)他们所有记录'TestMethod1'作为我的结果库中的testname。 单独运行测试它工作正常,但这对我没用,因为我需要能够对我的应用程序运行10's / 100's / 1000的测试并让testContext处理testname或我。

我现在已经尝试了几次并搜索互联网负载并且没有其他任何人遇到这个问题,所以我要么:这个问题独一无二,“Google-Fu”技能很差,或者我正在做一些真实的事情笨。希望这是有道理的,有人有答案。

提前致谢,

安迪

2 个答案:

答案 0 :(得分:10)

这种情况正在发生,因为[ClassInitialize]仅在整个测试运行中执行一次,并在那里初始化_ctx。请改用[TestInitialize],在每个测试方法之前执行,并覆盖TestContext Class

[TestClass]
public class TestClass
{
    public TestContext TestContext { get; set; }

    [TestInitialize]
    public void Initialize()
    {
        // Runs once before each test method and logs the method's name
        Console.WriteLine(TestContext.TestName);
    }

    [TestMethod]
    public void TestMethod1()
    {
        // Logs the method name inside the method
        Console.WriteLine(String.Format("In Test '{0}'", TestContext.TestName));
    }

    // ... Your rest test methods here
}

答案 1 :(得分:-1)

可以将MSTest.exe输出配置为输出.trx(xml)文件,其中包含测试的完整结果,名称,传递或失败以及从这些测试中输出的任何内容,还有一个工具可以转换TRX文件到HTML http://trxtohtml.codeplex.com/

希望这有帮助