Cucumber Java:如何强制生成JSON插件

时间:2018-04-24 08:24:01

标签: java cucumber cucumber-jvm cucumber-java cucumber-junit

概述:有些情况我想在中途停止正在运行的黄瓜测试包 - 例如,当x次测试失败时。

我可以做得很好,但我希望在测试停止时生成json文件(plugin = {json:...})。这可行吗?

到目前为止我尝试了什么:

  • 调试并查看报告/插件生成的位置。似乎这行执行时:

    Cucumber.java: runtime.getEventBus().send.....
    
        @Override
        protected Statement childrenInvoker(RunNotifier notifier) {
            final Statement features = super.childrenInvoker(notifier);
            return new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    features.evaluate();
                    runtime.getEventBus().send(new TestRunFinished(runtime.getEventBus().getTime()));
                    runtime.printSummary();
                }
            };
        }
    

    我希望访问runtime字段,但它有一个private修饰符。我也试过通过reflections访问它,但我并没有得到我需要的东西。

  • 2 个答案:

    答案 0 :(得分:1)

    找到了一个非常脏但却有效的解决方案并得到了我需要的东西。在这里发布我的解决方案以防任何人可能需要。

  • 创建自定义黄瓜转轮实现以获取运行时实例。

    public final class Foo extends Cucumber {
        static Runtime runtime;
    
        /**
         * Constructor called by JUnit.
         *
         * @param clazz the class with the @RunWith annotation.
         * @throws IOException         if there is a problem
         * @throws InitializationError if there is another problem
         */
        public Foo(Class clazz) throws InitializationError, IOException {
            super(clazz);
        }
    
        @Override
        protected Runtime createRuntime(ResourceLoader resourceLoader, ClassLoader classLoader, RuntimeOptions runtimeOptions) throws InitializationError, IOException {
            runtime = super.createRuntime(resourceLoader, classLoader, runtimeOptions);
            return runtime;
        }
    }
    

  • 根据使用的插件调用生成文件的同一行:

    public final class ParentHook {
    
        @Before
        public void beforeScenario(Scenario myScenario) {
    
        }
    
        @After
        public void afterScenario() {
            if (your condition to stop the test) {
               //custom handle to stop the test
               myHandler.pleaseStop();
               Foo.runtime.getEventBus().send(new TestRunFinished(Foo.runtime.getEventBus().getTime()));
            }
        }
    }
    

  • 但是,这将要求您通过Foo.class运行测试,例如: @RunWith(Foo.class)代替@RunWith(Cucumber.class)

    这里价值不是很高,但它符合我目前的需要。我希望Cucumber提供一种开箱即用的方法。如果有更好的方法,请在此处发布,以便我可以在验证后接受您的答案。

  • 答案 1 :(得分:0)

    为什么不退出?

    import cucumber.api.Scenario;
    import cucumber.api.java.After;
    import cucumber.api.java.Before;
    import cucumber.api.java.en.When;
    
    public class StepDefinitions {
    
      private static int failureCount = 0;
      private int threshold = 20;
    
      @When("^something$")
      public void do_something() {
        // something
      }
    
      @After
      public void after(Scenario s) {
        if (s.isFailed()) ++failureCount;
      }
    
      @Before
      public void before() {
        if (failureCount > threshold) {
          if (driver !=null) {
             driver.quit();
             driver = null;
          }
        }
    }