我为使用specflow / xunit的日志记录消息和范围报告实现了log4net。 如果发生任何错误/异常,并且我没有log4net的try / catch语句,那么范围报告将捕获异常并将其打印为报告中的失败步骤。但是,如果我有try和catch语句,而log4net正在捕获这些知识,则范围报告不会将其记录为失败的步骤,并与通过的步骤相同,但是应该失败。
如何使范围报告认为log4net捕获到异常/错误,并且此步骤必须失败。
下面是我尝试失败的方法的try / catch语句
public void ClickonLoginButton()
{
try{
ClickonElement(LoginbuttonLocator);
Log.info("successfully clicked");
}
catch(exception ex){
Log.error("unable to click");
Console.WriteLine(ex.StackTrace);
}
}
我的范围报告事后代码:
[AfterStep]
public void InsertReportingSteps()
{
var stepType = ScenarioStepContext.Current.StepInfo.StepDefinitionType.ToString();
if (ScenarioContext.Current.TestError == null)
{
if (stepType == "Given")
_scenario.CreateNode<Given>(ScenarioStepContext.Current.StepInfo.Text);
else if (stepType == "When")
_scenario.CreateNode<When>(ScenarioStepContext.Current.StepInfo.Text);
else if (stepType == "Then")
_scenario.CreateNode<Then>(ScenarioStepContext.Current.StepInfo.Text);
else if (stepType == "And")
_scenario.CreateNode<And>(ScenarioStepContext.Current.StepInfo.Text);
}
else if (ScenarioContext.Current.TestError != null)
{
if (stepType == "Given")
_scenario.CreateNode<Given>(ScenarioStepContext.Current.StepInfo.Text).Fail(ScenarioContext.Current.TestError.InnerException);
else if (stepType == "When")
_scenario.CreateNode<When>(ScenarioStepContext.Current.StepInfo.Text).Fail(ScenarioContext.Current.TestError.InnerException);
else if (stepType == "Then")
{
string Runname = screenshot();
_scenario.AddScreenCaptureFromPath("C:\\Users\\xxxx- PC\\Desktop\\XUnit_Assignement_3\\XUnit_Assignement\\target\\ErrorScreenshots\\"
+ Runname + ".Png");
_scenario.CreateNode<Then>(ScenarioStepContext.Current.StepInfo.Text).
Fail(ScenarioContext.Current.TestError.Message);
_scenario.Fail("Failed Because of Some issues",
MediaEntityBuilder.CreateScreenCaptureFromPath(@"C:\Users\xxxx- PC\Desktop\XUnit_Assignement_3\XUnit_Assignement\TestResults\image.JPG",
"Failed").Build());
}
}
答案 0 :(得分:1)
使用try / catch时会发生什么:
它与log4net无关,但与您捕获异常有关。 如果不这样做,该异常将在整个堆栈中传递,直到有东西捕获到它或最终在全局处理程序中结束为止。 如果您这样做将其捕获到您的代码中,它将停止在此处。它将被视为“已处理”,并且控制流程在catch块之后继续进行。
因此,您的报表引擎不会“看到”存在 异常,因为您在它到达引擎可以捕获的地方之前就捕获了它。
如何使引擎意识到异常:
您需要重新抛出异常:
catch(Exception ex){
Log.error("unable to click");
Console.WriteLine(ex.StackTrace);
throw;
}
然后它将像往常一样冒泡。捕获它可以阻止它进一步冒泡-因为期望在catch块中对其进行相应的处理。如果仅将catch块用于记录,则需要再次引发相同的异常。
思想:throw;
和throw ex;
之间是有区别的。它们将产生不同的堆栈跟踪。 throw;
将保留堆栈跟踪,而throw ex
将对其进行重置。
(请参阅https://stackoverflow.com/a/730255/982149)