How to get the exception that was thrown when a Cucumber test failed in Java?

前端 未结 7 743
攒了一身酷
攒了一身酷 2021-01-13 02:07

I can perform actions on test failure by using:

@After
public void afterTest(Scenario scenario) {
    if (scenario.isFailed()) {
        /*Do stuff*/
    }
}         


        
相关标签:
7条回答
  • 2021-01-13 02:50

    The problem with the work around suggested by Frank Escobar:

    By using reflection to reach into a frameworks internals you're depending on implementation details. This is a bad practice, when ever the framework changes its implementation your code may break as you will observe in Cucumber v5.0.0.

    Hooks in Cucumber are designed to manipulate the test execution context before and after a scenario. They're not made to report on the test execution itself. Reporting is cross cutting concern and best managed by using the plugin system.

    For example:

    package com.example;
    
    import io.cucumber.plugin.ConcurrentEventListener;
    import io.cucumber.plugin.event.EventPublisher;
    import io.cucumber.plugin.event.Result;
    import io.cucumber.plugin.event.Status;
    import io.cucumber.plugin.event.TestCase;
    import io.cucumber.plugin.event.TestCaseFinished;
    
    public class MyTestListener implements ConcurrentEventListener {
        @Override
        public void setEventPublisher(EventPublisher publisher) {
            publisher.registerHandlerFor(TestCaseFinished.class, this::handleTestCaseFinished);
        }
    
        private void handleTestCaseFinished(TestCaseFinished event) {
            TestCase testCase = event.getTestCase();
            Result result = event.getResult();
            Status status = result.getStatus();
            Throwable error = result.getError();
            String scenarioName = testCase.getName();
            String id = "" + testCase.getUri() + testCase.getLine();
            System.out.println("Testcase " + id + " - " + status.name());
        }
    }
    

    When using JUnit 4 and TestNG you can activate this plugin using:

    @CucumberOptions(plugin="com.example.MyTestListener")
    

    With JUnit 5 you add it to junit-platform.properties:

    cucumber.plugin=com.example.MyTestListener 
    

    Or if you are using the CLI

    --plugin com.example.MyTestListener 
    
    0 讨论(0)
提交回复
热议问题