TestContext.TestName 属性永远不会改变

Posted

技术标签:

【中文标题】TestContext.TestName 属性永远不会改变【英文标题】:The TestContext.TestName property NEVER changes 【发布时间】:2012-11-09 18:14:34 【问题描述】:

目标:

我想使用 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'技能很差,或者正在做一些真正的事情愚蠢的。希望这是有道理的,有人知道答案。

提前致谢,

安迪

【问题讨论】:

【参考方案1】:

发生这种情况是因为 [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

【讨论】:

我遇到了类似的问题,然后我只是将 ClassInitialize 更改为 TestInitialize 以上下文作为参数。它可以编译,但测试告诉 TestInitialize 方法使用了错误的签名(它不能接受参数)。如果 ClassInitialize 应该绑定到测试方法而不是整个类,为什么在地球上会使用上下文?为什么TestInitialize 不接受上下文?如果ClassInitializeTestContext 作为参数,我们怎么能猜到我们需要添加一个属性呢?难以置信的不直观。 如何初始化TestContext?我必须假设您在 Console.WriteLine(TestContext.TestName); 处收到 NullReferenceException在初始化() 答案我发现:你没有。如果您将其命名为“TestContext” 效果很好!但我赞同@fernacolo 的观点这是一个糟糕的设计。更重要的是,如果您不公开 TestContext 属性,您的测试类将被静默忽略,不会出现任何警告/错误。这必须完全按照 Schaliasos 的说法进行。 感谢 @Gary... 对于 mstest,您只需将属性 public TestContext TestContext get; set; 添加到一个类中,它就会神奇地为每个测试正确填充。不需要任何 TestInitialize 或 ClassInitialize 或尝试手动捕获 TestContext。只是魔术。令人难以置信的是,这在任何地方都没有记录!!!【参考方案2】:

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

希望对你有帮助

【讨论】:

以上是关于TestContext.TestName 属性永远不会改变的主要内容,如果未能解决你的问题,请参考以下文章

下载Gradle永远拥有Android属性:…此处不允许…

Cookie的存储读取删除修改 (cookie.Expires读取永远是零时间)

WPF:一旦我在代码中设置了一个属性,它就会永远忽略 XAML 绑定......我该如何防止这种情况发生?

在 NHibernate 中使用字符串枚举 - GetValue 永远不会被解雇

jquery easy ui datagrid 怎样设置宽度,让列永远百分之百填充

在word中怎么使正在编辑的信息永远处于页面最顶端?