首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解MSTest TestContext

理解MSTest TestContext
EN

Stack Overflow用户
提问于 2014-06-16 17:32:30
回答 5查看 70.8K关注 0票数 41

使用MSTest,我需要从[TestInitialize]方法中获取当前测试的名称。您可以从TestContext.TestName属性获得此信息。

在传递给[ClassInitialize]方法的静态[ClassInitialize]和声明为公共属性(并由测试运行程序设置)之间,我发现了一个意想不到的行为差异。

考虑以下代码:

代码语言:javascript
复制
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测试运行程序输出复制粘贴):

代码语言:javascript
复制
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]的场景,或者最好忽略它,而不使用它?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-17 14:36:54

因为[ClassInitialize]在开始时才被调用,所以测试名是TestMethod1。这在第一次测试运行后就过时了。

每个方法都设置了TestContext,因此具有当前的测试名称。

是的,有点傻。

票数 33
EN

Stack Overflow用户

发布于 2014-06-17 14:32:30

该方法

代码语言:javascript
复制
[ClassInitialize]
public static void SetupTests(TestContext testContext) { }

在设置属性集TestContext之前调用。因此,如果您需要SetupTests中的上下文,那么这个参数是有用的。否则使用TestContext属性,该属性在每个属性之前设置。

代码语言:javascript
复制
[TestInitialize]
public void SetupTest() { }
票数 6
EN

Stack Overflow用户

发布于 2019-06-28 16:35:03

如果要将在方法ClassInitialize中创建的对象传递给清理方法和测试,则必须将其初始化上下文保存在单独的静态变量中,而不是常规的TestContext。只有这样,您才能在以后的代码中检索它。

代码语言:javascript
复制
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方法的上下文对象,因此在返回之后,除非显式保存它们,否则它们将永远丢失。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24249133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档