Log4net捕获异常,导致通过扩展报告

时间:2019-01-15 12:53:18

标签: c# selenium selenium-webdriver log4net selenium-extent-report

我为使用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());
                }
            }

1 个答案:

答案 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