Log4net перехватывает исключение, что приводит к прохождению отчета о шаге в экстенте - PullRequest
0 голосов
/ 15 января 2019

У меня есть log4net для регистрации сообщений и отчетов по экстентам с использованием specflow / xunit. В случае, если возникнут какие-либо ошибки / исключения, и у меня нет оператора try / catch в log4net, тогда отчет экстента перехватывает исключение и печатает его как неудачный шаг в отчете. Но если у меня есть операторы 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 голосов
/ 15 января 2019

Что происходит при использовании try / catch:

Это не имеет ничего общего с log4net, но вы поймали исключение. Если вы этого не сделаете, исключение будет передаваться через стек до тех пор, пока что-то его не перехватит или не попадет в глобальный обработчик. Если вы do поймаете его в своем коде, он остановится на этом. Он будет считаться «обработанным», и после блока захвата поток управления продолжится.

Таким образом, ваш механизм отчетов не «видит», что было исключением, потому что вы ловите его до того, как оно достигнет места, где механизм его поймает.

Как заставить двигатель узнавать об исключении:

Вам необходимо отбросить исключение:

catch(Exception ex){
    Log.error("unable to click");
    Console.WriteLine(ex.StackTrace);
    throw;
}

тогда он будет пузыриться как обычно. Поймать его останавливает дальнейшее образование пузырей - потому что ожидается, что он будет обработан соответствующим образом в блоке захвата. Если вы используете блок catch только для регистрации, вам нужно снова выдать то же исключение.

Mind: Существует разница между throw; и throw ex;. Они будут производить разные стековые трассы. throw; сохранит трассировку стека, а throw ex сбросит ее. (см. https://stackoverflow.com/a/730255/982149)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...