目标:
我想使用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's测试,并让testContext处理我或我的测试名。
我已经尝试了几次,搜索了互联网负载,并且没有其他人遇到这个问题,所以我要么是:这个问题的独特之处,或者“Google-Fu”的技能很差,或者正在做一些真正的愚蠢的事情。希望这是有道理的,并且有人会给出答案。
提前致谢,
安迪
最佳答案
之所以发生这种情况,是因为在整个测试运行中[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
}
关于c# - TestContext.TestName属性从不更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13494209/