如何使用MSTest TestContext获取错误消息?

时间:2019-07-20 03:25:59

标签: c# mstest

我正在尝试从mstest获取失败的测试用例的错误消息。

我在网上发现了一些使用TestContext的东西,下面是我的代码段。

public static string GetErrorMessageFromTestContext(TestContext testContext) {

        BindingFlags privateGetterFlags = BindingFlags.GetField |
                                            BindingFlags.GetProperty |
                                            BindingFlags.NonPublic |
                                            BindingFlags.Instance |
                                           BindingFlags.FlattenHierarchy;

        var m_message = string.Empty;
        Type t = testContext.GetType();

        if (testContext.CurrentTestOutcome == UnitTestOutcome.Failed)
        {
            var field = t.GetField("m_currentResult", privateGetterFlags);
            object m_currentResult = field.GetValue(testContext);

            field = m_currentResult.GetType().GetField("m_errorInfo", 
            privateGetterFlags);
            var m_errorInfo = field.GetValue(m_currentResult);

            field = m_errorInfo.GetType().GetField("m_message", 
            privateGetterFlags);
            m_message = field.GetValue(m_errorInfo) as string;
        }

        return m_message;
    }

这件事应该从失败的情况下返回错误消息。但是,执行该行时:

var field = t.GetField(“ m_currentResult”,privateGetterFlags);

字段被分配为空。不知道是什么原因,所以我也接受其他解决方案。谢谢!

1 个答案:

答案 0 :(得分:0)

您的解决方案不起作用,因为这是MSTest v1示例,很可能您正在使用MSTest v2。您不会在v2的TestContext中找到消息,因为它在那里不存在。您需要检查TestResult类以获取此消息。

获取TestResult类的一种方法是重写TestMethodAttribute并按以下示例所示使用它:

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject
{
    [TestClass]
    public class UnitTest
    {
        [MyTestMethod]
        public void TestMethod()
        {
            Assert.IsTrue(false);
        }
    }

    public class MyTestMethodAttribute : TestMethodAttribute
    {
        public override TestResult[] Execute(ITestMethod testMethod)
        {
            TestResult[] results = base.Execute(testMethod);

            foreach (TestResult result in results)
            {
                if (result.Outcome == UnitTestOutcome.Failed)
                {
                    string message = result.TestFailureException.Message;
                }
            }

            return results;
        }
    }
}