使用MSTest,我需要从[TestInitialize]方法中获取当前测试的名称。您可以从TestContext.TestName属性获得此信息。
在传递给[ClassInitialize]方法的静态[ClassInitialize]和声明为公共属性(并由测试运行程序设置)之间,我发现了一个意想不到的行为差异。
考虑以下代码:
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); }
}
}这将导致输出以下内容(从VS2013中的Resharper测试运行程序输出复制粘贴):
TestContext.TestName='TestMethod1' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod2' static _testContext.TestName='TestMethod1'
TestContext.TestName='TestMethod3' static _testContext.TestName='TestMethod1'我之前曾假设TestContext的两个实例是等价的,但显然它们不是。
public TestContext属性的行为与我预期的一样[ClassInitialize]方法的[ClassInitialize]值不会。由于TestContext具有与当前正在运行的测试相关的属性,此实现似乎具有误导性和中断性。是否有任何实际希望使用传递给TestContext方法的[ClassInitialize]的场景,或者最好忽略它,而不使用它?
发布于 2014-06-17 14:36:54
因为[ClassInitialize]在开始时才被调用,所以测试名是TestMethod1。这在第一次测试运行后就过时了。
每个方法都设置了TestContext,因此具有当前的测试名称。
是的,有点傻。
发布于 2014-06-17 14:32:30
该方法
[ClassInitialize]
public static void SetupTests(TestContext testContext) { }在设置属性集TestContext之前调用。因此,如果您需要SetupTests中的上下文,那么这个参数是有用的。否则使用TestContext属性,该属性在每个属性之前设置。
[TestInitialize]
public void SetupTest() { }发布于 2019-06-28 16:35:03
如果要将在方法ClassInitialize中创建的对象传递给清理方法和测试,则必须将其初始化上下文保存在单独的静态变量中,而不是常规的TestContext。只有这样,您才能在以后的代码中检索它。
public TestContext TestContext { get; set; } // regular test context
private static TestContext ClassTestContext { get; set; } // global class test context
[ClassInitialize]
public static void ClassInit(TestContext context)
{
ClassTestContext = context;
context.Properties["myobj"] = <Some Class Level Object>;
}
[ClassCleanup]
public static void ClassCleanup()
{
object myobj = (object)ClassTestContext.Properties["myobj"];
}
[TestMethod]
public void Test()
{
string testname = (string)TestContext.Properties["TestName"] // object from regular context
object myobj = (object)ClassTestContext.Properties["myobj"]; // object from global class context
}MSTest框架不保留传递给ClassInitialize/AssemblyInitialize方法的上下文对象,因此在返回之后,除非显式保存它们,否则它们将永远丢失。
https://stackoverflow.com/questions/24249133
复制相似问题