11

目标:

我想使用 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'记录为他们的测试名称在我的结果存储库中。单独运行测试它工作正常,但这对我来说没有用,因为我需要能够对我的应用程序运行 10's/100's/1000's 测试并让 testContext 处理 testname 或我。

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

提前致谢,

安迪

4

2 回答 2

15

发生这种情况是因为[ClassInitialize]整个测试运行只执行一次,并且您_ctx在那里初始化。使用[TestInitialize]相反,它在每个测试方法之前执行并覆盖TestContext 类

[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
}
于 2012-11-21T14:42:28.177 回答
-1

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

希望这可以帮助

于 2012-11-21T13:28:46.290 回答