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