概述:有些情况我想在中途停止正在运行的黄瓜测试包 - 例如,当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
访问它,但我并没有得到我需要的东西。
答案 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;
}
}
}