Cucumber Java:如何强制生成 JSON 插件
Cucumber Java: How to force JSON plugin generation
概述: 在某些情况下,我想在中途停止 运行 黄瓜测试包——例如,当 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
访问它,但我没有得到我需要的东西。
为什么不退出?
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;
}
}
}
找到了一个很脏但可行的解决方案并得到了我需要的东西。在这里发布我的解决方案以备不时之需。
创建自定义黄瓜 运行ner 实现以获取 运行 时间实例。
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 提供一种开箱即用的方法。如果有更好的方法,请在此处post进行,以便我在验证后接受您的回答。
概述: 在某些情况下,我想在中途停止 运行 黄瓜测试包——例如,当 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
访问它,但我没有得到我需要的东西。
为什么不退出?
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;
}
}
}
找到了一个很脏但可行的解决方案并得到了我需要的东西。在这里发布我的解决方案以备不时之需。
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 提供一种开箱即用的方法。如果有更好的方法,请在此处post进行,以便我在验证后接受您的回答。