如何使用 MSTest TestContext 获取错误消息?
How to get error message with MSTest TestContext?
我正在尝试从 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;
}
这个东西应该 return 来自失败案例的错误消息。但是,在执行行时:
var 字段 = t.GetField("m_currentResult", privateGetterFlags);
正在为字段分配空值。不确定是什么原因,所以我也对其他解决方案持开放态度。谢谢!
您的解决方案不起作用,因为这是 MSTest v1 示例,很可能您使用的是 MSTest v2。您不会在 v2 的 TestContext
中找到消息,因为那里不存在它。您需要检查 TestResult
class 才能收到此消息。
获得 TestResult
class 的一种方法是覆盖 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;
}
}
}
我正在尝试从 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;
}
这个东西应该 return 来自失败案例的错误消息。但是,在执行行时:
var 字段 = t.GetField("m_currentResult", privateGetterFlags);
正在为字段分配空值。不确定是什么原因,所以我也对其他解决方案持开放态度。谢谢!
您的解决方案不起作用,因为这是 MSTest v1 示例,很可能您使用的是 MSTest v2。您不会在 v2 的 TestContext
中找到消息,因为那里不存在它。您需要检查 TestResult
class 才能收到此消息。
获得 TestResult
class 的一种方法是覆盖 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;
}
}
}