MS UnitTestFramework检索和记录异常c#

时间:2016-01-26 14:46:25

标签: c# log4net microsoft-test-manager vs-unit-testing-framework

我刚刚开始使用MS的UnitTestFramework进行相当广泛的自动化项目。我注意到的一件事是,当我的代码中出现错误 - 而不是我测试的应用程序时 - 框架捕获该错误并以愉快的方式使测试失败,从而允许完成测试迭代。但是,我希望能够看到这些例外&我的log4net日志中的堆栈跟踪,到目前为止,我发现在我的测试清理中没有办法抓住它们(或者在try catch块之外的任何地方,我不打算在每个方法中使用它)。

任何人都知道如何将这些例外记录到我的日志中吗?

2 个答案:

答案 0 :(得分:4)

您可以通过First-Chance Exception Notifications -

使用AppDomain.FirstChanceException Event
  

此活动仅为通知。处理此事件无法处理   异常或以任何方式影响后续异常处理。   在引发事件并调用事件处理程序之后,   公共语言运行库(CLR)开始搜索处理程序   例外。 FirstChanceException提供应用程序域   第一次有机会检查任何管理的异常。

这样的事情(请注意它在a method marked as AssemblyInitialize, which means it runs once per test run中,并且代码排除了测试失败时MSTest抛出的AssertFailedException。您可能还想排除其他异常,否则可能会有很多异常日志中的“噪音”。)

[TestClass]
public class Initialize
{
    [AssemblyInitialize]
    public static void InitializeLogging(TestContext testContext)
    {
         AppDomain.CurrentDomain.FirstChanceException += (source, e) =>
         {
           if (e.Exception is AssertFailedException == false)
                LogManager.GetLogger("TestExceptions").Error(e.Exception);
         };
    }
}

答案 1 :(得分:0)

如果您可以替换[TestMethod]属性,那么可以定义自己的属性MyTestMethod,例如,从默认属性派生如下:

public class MyTestMethodAttribute : TestMethodAttribute
{
    public override TestResult[] Execute(ITestMethod testMethod)
    {
        TestResult[] testResults = base.Execute(testMethod);
        foreach (var testResult in testResults.Where(e => e.Outcome == UnitTestOutcome.Failed))
            testResult.LogOutput += $"Exception `{testResult.TestFailureException.GetType().Name}` with message `{testResult.TestFailureException.Message}`.";
        return testResults;
    }
}

随后的测试随后在Visual Studio的“测试资源管理器”的标准输出面板中生成预期的日志消息Exception TestFailedException with message Assert.Fail failed. Some exception text.

[TestClass]
public class Tests
{
    [MyTestMethod]
    public void Test()
        => Assert.Fail("Some exception text");
}

当测试并行执行时,该方法也适用。