prashant-ramcharan / courgette-jvm

Multiprocess | Parallel Cucumber-JVM | Parallelize your Java Cucumber tests on a feature level or on a scenario level.
MIT License
132 stars 38 forks source link

initializationError #55

Closed niagara1983 closed 6 years ago

niagara1983 commented 6 years ago

Hi prashant, I just upgraded to version 2.3.2 and my scenarios are passing but at the end of the run I get the following error java.lang.StringIndexOutOfBoundsException: start 0, end -1, length 0 at java.base/java.lang.AbstractStringBuilder.checkRangeSIOOBE(AbstractStringBuilder.java:1698) at java.base/java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:991) at java.base/java.lang.StringBuilder.substring(StringBuilder.java:77) at courgette.runtime.report.JsonReportParser.addStepRowData(JsonReportParser.java:218) at courgette.runtime.report.JsonReportParser.lambda$addSteps$2(JsonReportParser.java:163) at java.base/java.util.ArrayList$Itr.forEachRemaining(ArrayList.java:927) at courgette.runtime.report.JsonReportParser.addSteps(JsonReportParser.java:144) at courgette.runtime.report.JsonReportParser.lambda$parseJsonReport$1(JsonReportParser.java:135) at java.base/java.util.ArrayList.forEach(ArrayList.java:1378) at courgette.runtime.report.JsonReportParser.parseJsonReport(JsonReportParser.java:135) at courgette.runtime.report.JsonReportParser.getReportFeatures(JsonReportParser.java:49) at courgette.runtime.CourgetteHtmlReporter.generateHtmlReport(CourgetteHtmlReporter.java:59) at courgette.runtime.CourgetteHtmlReporter.create(CourgetteHtmlReporter.java:51) at courgette.runtime.CourgetteRunner.createCourgetteReport(CourgetteRunner.java:129) at courgette.api.junit.Courgette.run(Courgette.java:89) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:116) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:59) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:39) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) at com.sun.proxy.$Proxy1.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.base/java.lang.Thread.run(Thread.java:844)

it looks this occurs during the generation of the report. Any idea how to fix this?

prashant-ramcharan commented 6 years ago

Hi @niagara1983

I assume you using Cucumber data tables in your scenarios and one of them is commented out?

This then throws an exception when parsing for step row data.

In the meantime, to workaround this issue, comment back the Cucumber data table in your scenario(s)

I'll provide a fix for this in 2.4.0

niagara1983 commented 6 years ago

your assumption is correct. But I don't have a commented out line in the scenarios. see attached file for the cucumber.json cucumber.json.zip

prashant-ramcharan commented 6 years ago

Unfortunately, I cannot open the zip file, says its corrupted.

niagara1983 commented 6 years ago

cucumber.json.zip

Try this one

prashant-ramcharan commented 6 years ago

Thanks - this works.

So the issue is in the Courgette json parser which assumed your Cucumber data table contained a row header + row cell.

In your case, your tests only has a row cell therefore the Courgette json parser threw an exception.

This will be fixed in the next release.

niagara1983 commented 6 years ago

that makes totally sense because this issue does not occur in other scenarios. Thanks Prashant. Any idea on when you are planning the next release?

prashant-ramcharan commented 6 years ago

In addition to this fix, I will be upgrading to Cucumber-JVM 3.0.1 in the next release which should be in a day or 2.

prashant-ramcharan commented 6 years ago

This is now released.

From Cucumber 3 - Data tables have moved into a new package. You will have to update your tests accordingly.

io.cucumber.datatable.DataTable
niagara1983 commented 6 years ago

Thanks a lot prashant!

niagara1983 commented 6 years ago

I have made the changes and I am getting the following error:

cucumber.runtime.CucumberException: java.lang.NoSuchMethodException: cucumber.runtime.groovy.GroovyBackend.<init>(cucumber.runtime.io.ResourceLoader, io.cucumber.stepexpression.TypeRegistry) at cucumber.runtime.Reflections.newInstance(Reflections.java:53) at cucumber.runtime.Reflections.instantiateSubclasses(Reflections.java:35) at cucumber.runtime.Runtime.loadBackends(Runtime.java:89) at cucumber.runtime.Runtime.<init>(Runtime.java:42) at courgette.runtime.CourgetteFeatureLoader.createRuntime(CourgetteFeatureLoader.java:60) at courgette.runtime.CourgetteFeatureLoader.<init>(CourgetteFeatureLoader.java:30) at courgette.api.junit.Courgette.<init>(Courgette.java:36) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:88) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:59) at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:39) at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) at com.sun.proxy.$Proxy1.processTestClass(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:146) at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128) at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) at java.base/java.lang.Thread.run(Thread.java:844) Caused by: java.lang.NoSuchMethodException: cucumber.runtime.groovy.GroovyBackend.<init>(cucumber.runtime.io.ResourceLoader, io.cucumber.stepexpression.TypeRegistry) at java.base/java.lang.Class.getConstructor0(Class.java:3302) at java.base/java.lang.Class.getConstructor(Class.java:2110) at cucumber.runtime.Reflections.newInstance(Reflections.java:45)

prashant-ramcharan commented 6 years ago

Can you run any feature successfully using Cucumber version 3.0.1 because this exception is thrown by Cucumber?

Without using the Courgette runner.

prashant-ramcharan commented 6 years ago

Add this to your build.gradle

testCompile group: 'io.cucumber', name: 'cucumber-groovy', version: '2.0.1'
niagara1983 commented 6 years ago

I already had that line in my build.gradle file. could it be a conflict between cucumber core 2.0.1 and the one that comes with courgette-jvm:2.4.0, which is 3.0.1.

build.gradle.zip

prashant-ramcharan commented 6 years ago

try changing to testCompile

testCompile group: 'io.cucumber', name: 'cucumber-groovy', version: '2.0.1'
prashant-ramcharan commented 6 years ago

cucumber-groovy simply inherits the cucumber-core module that's present in your project so there won't be any conflicts.

niagara1983 commented 6 years ago

gotcha. I am still getting the same error ... I updated this project https://github.com/niagara1983/ui-automation to reproduce this error. if I go back to previous version courgette-jvm 2.3.2, things run fine with the original issue and everything runs fine with courgette-jvm 1.4.3. Would you mind taking a look on my project? worse case scenario, I can go back to courgette-jvm 2.3.2 and update my datatable to workaround the issue for now. I like the new reports in 2.3.2 :-) so I would like to use it.

prashant-ramcharan commented 6 years ago

Right, so the cucumber-groovy library is not updated to run with Cucumber 3.

The GroovyBackend is missing the following constructor so Cucumber 3 cannot create the runtime.

public GroovyBackend(ResourceLoader resourceLoader, TypeRegistry typeRegistry) {
}

https://github.com/cucumber/cucumber-jvm-groovy/blob/master/groovy/src/main/java/cucumber/runtime/groovy/GroovyBackend.java#L57-L59


Until cucumber-groovy is updated to support cucumber 3, you can use this workaround:

In your build.gradle, add this.

    //courgette
    testCompile ('io.github.prashant-ramcharan:courgette-jvm:2.4.0') {
        exclude group: 'io.cucumber'
    }

    testCompile 'io.cucumber:cucumber-core:2.4.0'
    testCompile 'io.cucumber:cucumber-java:2.4.0'
    testCompile 'io.cucumber:cucumber-junit:2.4.0'

    testCompile group: 'io.cucumber', name: 'cucumber-groovy', version: '2.0.1'

I can confirm this works!

niagara1983 commented 6 years ago

Thank you very much for the prompt replies and for providing this workaround.