Hi,
I am using *JBehave Core 4.3.5* with *JBehave Web Selenium 3.6-beta-2*.
After debugging I found out that the code never goes inside if
(!future.isDone())
{So it never initialized duration. Not sure what I am doing wrong. I am
only running 1 story at a time.
public void waitUntilAllDoneOrFailed(RunContext context) {
if ( runningStories.values().isEmpty() ) {
return;
}
boolean allDone = false;
boolean started = false;
while (!allDone || !started) {
allDone = true;
for (RunningStory runningStory : runningStories.values()) {
if ( runningStory.isStarted() ){
started = true;
Story story = runningStory.getStory();
Future<ThrowableStory> future = runningStory.getFuture();
*if **(!future.isDone()) {*
allDone = false;
StoryDuration duration = runningStory.getDuration();
runningStory.updateDuration();
if (duration.timedOut()) {
embedderMonitor.storyTimeout(story, duration);
context.cancelStory(story, duration);
future.cancel(true);
if (embedderControls.failOnStoryTimeout()) {
throw new StoryExecutionFailed(story.getPath(),
new StoryTimedOut(duration));
}
continue;
}
} else {
try {
ThrowableStory throwableStory = future.get();
Throwable throwable = throwableStory.getThrowable();
if (throwable != null) {
context.addFailure(story.getPath(), throwable);
if (!embedderControls.ignoreFailureInStories()) {
continue;
}
}
} catch (Throwable e) {
context.addFailure(story.getPath(), e);
if (!embedderControls.ignoreFailureInStories()) {
continue;
}
}
}
} else {
started = false;
allDone = false;
}
}
tickTock();
}
writeStoryDurations(runningStories.values());
}
public StoriesRunner() {
setBrowser();
try {
if (lifeCycleSteps instanceof PerStoriesWebDriverSteps) {
JUnitReportingRunner.recommendedControls(configuredEmbedder());
configuredEmbedder().useExecutorService(new DirectExecutorService(){
}.create(
configuredEmbedder()
.embedderControls()
.doBatch(false)
.doGenerateViewAfterStories(true)
.doIgnoreFailureInStories(false)
.doIgnoreFailureInView(false)
.doSkip(false)
.doVerboseFailures(false)
.doVerboseFiltering(false)
.useStoryTimeouts("3000")
));
/* Required to run stories with annotated meta filters */
configuredEmbedder().useMetaFilters(Arrays.asList(getListOfStoriesToRun().split(",")));
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public Configuration configuration() {
Class<? extends Embeddable> embeddableClass = this.getClass();
return new SeleniumConfiguration()
.useWebDriverProvider(driverProvider)
.useSeleniumContext(context)
.useStepCollector(stepCollector)
/*.useStepMonitor(new SeleniumStepMonitor(contextView,
context, new SilentStepMonitor()))*/
.useStoryLoader(new LoadFromClasspath(embeddableClass))
.useParameterConverters(new
ParameterConverters().addConverters(new
ParameterConverters.DateConverter(new
SimpleDateFormat("yyyy-MM-dd"))))
.useStoryReporterBuilder(new StoryReporterBuilder()
.withCodeLocation(codeLocationFromClass(embeddableClass))
.withDefaultFormats()
.withFormats(Format.STATS,
Format.CONSOLE,
Format.XML,
Format.TXT,
/*Format.HTML,*/
screenShootingFormat)
.withFailureTrace(true)
);
}
private String getListOfStoriesToRun() throws IOException {
if (System.getProperty("stories") == null) {
//System.out.print(System.getProperty("story"));
return readProperties.getStories();
} else {
return System.getProperty("stories");
}
}
@Override
protected List<String> storyPaths() {
return new
StoryFinder().findPaths(CodeLocations.codeLocationFromPath("./src/main/resources"),
"**/*.story", "");
}
On Thu, Nov 1, 2018 at 8:02 AM Maganti Suryanarayana murthy <
[email protected]> wrote:
> Latest jbehave jars solved the problem
>
> On Wed, Oct 31, 2018, 10:45 PM Gajendra Sahu <[email protected]
> wrote:
>
>> Any updates on this? I am facing the same issue.
>>
>> Running using JunitStories and the storyDuration.props has durations 0.
>>
>> On Friday, 23 February 2018 11:58:17 UTC-6, mauro.talevi wrote:
>>>
>>> Please package all this in a downloadable zip that can be opened and
>>> run. Don't forget a readme with tool versions etc
>>>
>>> On 23 Feb 2018, at 18:32, Maganti Suryanarayana murthy <
>>> [email protected]> wrote:
>>>
>>> Hi Mauro Talevi,
>>>
>>> I have used gradle as a build file and please find the code base that i
>>> am using. I am pasing build.gradle file and apptechJbehaveStories.java
>>>
>>> Build.gradle:
>>>
>>> def buildNumber = System.getProperty('buildNumber') ?: '0'
>>> def buildVersion = '1.0.0-' + buildNumber
>>>
>>> version = buildVersion
>>>
>>> apply plugin: 'groovy'
>>> apply plugin: 'java'
>>> apply plugin: 'maven'
>>>
>>>
>>> repositories {
>>> mavenCentral()
>>> }
>>>
>>> configurations {
>>> jbehave
>>> }
>>>
>>> dependencies {
>>> testCompile group: 'junit', name: 'junit', version: '4.11'
>>> compile(group: 'org.jbehave.web', name: 'jbehave-web-selenium',
>>> version:'4.0-beta-1') {
>>> exclude(module: 'selenium-remote-control')
>>> exclude(module: 'selenium-java')
>>> exclude(module: 'jbehave-core')
>>> }
>>> compile 'org.springframework:spring-webmvc:5.0.2.RELEASE'
>>> compile 'org.jbehave.site:jbehave-site-resources:3.3.1'
>>> compile 'org.jbehave:jbehave-spring:4.1.3'
>>> compile 'org.jbehave:jbehave-core:4.1.3'
>>> compile 'log4j:log4j:1.2.16'
>>> compile group: 'org.seleniumhq.selenium', name: 'selenium-java',
>>> version: '3.7.1'
>>> compile group: 'commons-collections', name: 'commons-collections',
>>> version: '3.2.1'
>>> testCompile group: 'org.jbehave', name: 'jbehave-core', version:
>>> '4.1.3'
>>> compile 'org.jbehave.site:jbehave-site-resources:3.3.1:@zip'
>>> }
>>>
>>> /** userDefined task to copy the srories from /src/main/stories into
>>> build/classes/test/stories*/
>>> task copyStories(type: Copy) {
>>> from 'src/main/resources' into "${buildDir}/classes/test"
>>> from 'src/main/stories' into "${buildDir}/classes/test/stories"
>>> }
>>>
>>>
>>> task copyJbehaveStyle(type: Copy) {
>>> from(zipTree(jarPath("jbehave-core"))) {
>>> include "style/*"
>>> }
>>> into("${buildDir}/classes/jbehave/view")
>>> }
>>>
>>> task copyJbehaveUtilities(type: Copy) {
>>> from(zipTree(jarPath("jbehave-site-resources"))) {
>>> include "js/**/*"
>>> include "style/**/*"
>>> include "images/*"
>>> }
>>> into("${buildDir}/classes/jbehave/view")
>>> }
>>>
>>> def jarPath(String jarName) {
>>> configurations.testCompile.find({ it.name.startsWith(jarName)
>>> }).absolutePath
>>> }
>>>
>>>
>>> /** to specify the source for java and resources for test task, by
>>> default this is refered to src/test folder in gradle and maven*/
>>> sourceSets {
>>> test {
>>> java {
>>> srcDir "src/main/java"
>>> }
>>> resources {
>>> srcDir "src/main/resources"
>>> }
>>> }
>>> }
>>>
>>> test {
>>> systemProperty "metaFilters", System.getProperty("metaFilters", "")
>>> doFirst {
>>> copy {
>>> from(zipTree(jarPath("jbehave-core"))) {
>>> include "style/*"
>>> }
>>> into("build/reports/jbehave/view")
>>>
>>> }
>>> copy {
>>> from(zipTree(jarPath("jbehave-site-resources"))) {
>>> include "js/**/*"
>>> include "style/**/*"
>>> include "images/*"
>>> }
>>> into("build/reports/jbehave/view")
>>> }
>>> }
>>> systemProperties System.getProperties()
>>> dependsOn([clean,copyStories,copyJbehaveUtilities,copyJbehaveStyle])
>>> }
>>>
>>>
>>> apptechJBehaveStories.java
>>>
>>> package com.apptech.qmo;
>>>
>>> import com.apptech.qmo.ipt.QMOHtmlOutput;
>>> import com.apptech.qmo.ipt.QMOStoryData;
>>> import com.apptech.qmo.ipt.QMOStoryReporterBuilder;
>>> import com.apptech.qmo.ipt.utils.Loggers;
>>> import com.google.common.util.concurrent.MoreExecutors;
>>> import org.apache.log4j.Logger;
>>> import org.apache.log4j.PropertyConfigurator;
>>> import org.jbehave.core.Embeddable;
>>> import org.jbehave.core.configuration.Configuration;
>>> import org.jbehave.core.embedder.Embedder;
>>> import org.jbehave.core.embedder.StoryControls;
>>> import org.jbehave.core.embedder.StoryTimeouts;
>>> import org.jbehave.core.failures.FailingUponPendingStep;
>>> import org.jbehave.core.failures.PendingStepStrategy;
>>> import org.jbehave.core.i18n.LocalizedKeywords;
>>> import org.jbehave.core.io.CodeLocations;
>>> import org.jbehave.core.io.LoadFromClasspath;
>>> import org.jbehave.core.io.StoryFinder;
>>> import org.jbehave.core.junit.JUnitStories;
>>> import org.jbehave.core.model.ExamplesTableFactory;
>>> import org.jbehave.core.model.TableTransformers;
>>> import org.jbehave.core.parsers.RegexStoryParser;
>>> import org.jbehave.core.reporters.CrossReference;
>>> import org.jbehave.core.reporters.Format;
>>> import org.jbehave.core.reporters.HtmlTemplateOutput;
>>> import org.jbehave.core.reporters.StoryReporterBuilder;
>>> import org.jbehave.core.steps.InjectableStepsFactory;
>>> import org.jbehave.core.steps.ParameterControls;
>>> import org.jbehave.core.steps.ParameterConverters;
>>> import org.jbehave.core.steps.spring.SpringStepsFactory;
>>> import org.jbehave.web.selenium.*;
>>> import org.springframework.context.ApplicationContext;
>>> import
>>> org.springframework.context.annotation.AnnotationConfigApplicationContext;
>>>
>>> import java.net.URL;
>>> import java.text.SimpleDateFormat;
>>> import java.util.ArrayList;
>>> import java.util.Arrays;
>>> import java.util.List;
>>> import java.util.Properties;
>>>
>>> import static com.apptech.qmo.ipt.utils.DriverProvider.driver;
>>> import static org.jbehave.core.io.CodeLocations.codeLocationFromClass;
>>> import static org.jbehave.core.io.CodeLocations.getPathFromURL;
>>> import static org.jbehave.core.reporters.Format.*;
>>>
>>> public class apptechJbehaveStories extends JUnitStories {
>>> private static final String _STORIES_SEPARATOR = ",";
>>> public static QMOHtmlOutput qmoHtmlOutput;
>>> public static QMOStoryData storyData;
>>> public static List<String> storyToExecute = null;
>>> static CrossReference crossReference = new
>>> CrossReference().withJsonOnly().withOutputAfterEachStory(true);
>>> Logger log = Logger.getLogger(apptechJbehaveStories.class);
>>> PendingStepStrategy pendingStepStrategy = new
>>> FailingUponPendingStep();
>>> ContextView contextView = new LocalFrameContextView().sized(640,
>>> 120);
>>> SeleniumContext seleniumContext = new SeleniumContext();
>>> // SeleniumStepMonitor stepMonitor = new
>>> SeleniumStepMonitor(contextView,
>>> seleniumContext,crossReference.getStepMonitor());
>>> Format[] formats = new Format[]{new
>>> SeleniumContextOutput(seleniumContext), Format.CONSOLE, XML, Format.HTML};
>>> StoryReporterBuilder reporterBuilder = new
>>> QMOStoryReporterBuilder(storyData)
>>>
>>> .withCodeLocation(codeLocationFromClass(apptechJbehaveStories.class)).withFailureTrace(true)
>>>
>>> .withFailureTraceCompression(true).withDefaultFormats().withFormats(formats)
>>> .withCrossReference(crossReference);
>>> private ApplicationContext applicationContext;
>>> private WebDriverProvider driverProvider = new
>>> PropertyWebDriverProvider();
>>> private WebDriverSteps lifecycleSteps = new
>>> PerStoriesWebDriverSteps(driverProvider);
>>>
>>> public apptechJbehaveStories() {
>>> super();
>>> try {
>>> System.setProperty("webdriver.chrome.driver",
>>> "src/main/resources/drivers/chromedriver.exe");
>>> storyData = new QMOStoryData();
>>> String path =
>>> apptechJbehaveStories.class.getProtectionDomain().getCodeSource().getLocation().getPath()
>>> + "stories/log4j.properties";
>>> PropertyConfigurator.configure(path);
>>> if (lifecycleSteps instanceof PerStoriesWebDriverSteps) {
>>>
>>> configuredEmbedder().useExecutorService(MoreExecutors.newDirectExecutorService());
>>> }
>>> } catch (Exception e) {
>>> e.printStackTrace();
>>> }
>>> }
>>>
>>> @Override
>>> public Configuration configuration() {
>>> new WebDriverScreenshotOnFailure(driverProvider, new
>>> QMOStoryReporterBuilder());
>>> Class<? extends Embeddable> embeddableClass = this.getClass();
>>> Properties viewResources = new Properties();
>>> viewResources.put("decorateNonHtml", "true");
>>> LoadFromClasspath resourceLoader = new
>>> LoadFromClasspath(embeddableClass);
>>> TableTransformers tableTranformers = new TableTransformers();
>>> // Start from default ParameterConverters instance
>>> ParameterConverters parameterConverters = new
>>> ParameterConverters(resourceLoader, tableTranformers);
>>> ExamplesTableFactory examplesTableFactory = new
>>> ExamplesTableFactory(new LocalizedKeywords(), resourceLoader,
>>> parameterConverters, tableTranformers);
>>> // add custom converters
>>> parameterConverters.addConverters(new
>>> ParameterConverters.DateConverter(new SimpleDateFormat("yyyy-MM-dd")),
>>> new
>>> ParameterConverters.ExamplesTableConverter(examplesTableFactory));
>>>
>>> return new
>>> SeleniumConfiguration().useSeleniumContext(seleniumContext)
>>> .useWebDriverProvider(driverProvider)
>>> .usePendingStepStrategy(pendingStepStrategy)
>>> .useStoryControls(new
>>> StoryControls().doResetStateBeforeScenario(true))
>>> .useStoryLoader(new
>>> LoadFromClasspath(apptechJbehaveStories.class))
>>> .useStoryParser(new
>>> RegexStoryParser(examplesTableFactory))
>>> .useStoryReporterBuilder(new
>>> QMOStoryReporterBuilder(storyData)
>>>
>>> .withCodeLocation(CodeLocations.codeLocationFromPath(getClassPath()))
>>> .withFailureTrace(true)
>>> .withFailureTraceCompression(true)
>>> .withCrossReference(crossReference)
>>> .withDefaultFormats()
>>> .withFormats(Format.CONSOLE, Format.HTML,
>>> Format.XML,Format.STATS))
>>> .useParameterControls(new ParameterControls()
>>> .useDelimiterNamedParameters(true))
>>> .useParameterConverters(parameterConverters)
>>> .useStepMonitor(crossReference.getStepMonitor());
>>> }
>>>
>>> private List<String> getMetaFilters() {
>>> String metaFilterStr = System.getProperty("meta.filter");
>>> metaFilterStr = metaFilterStr == null ? "" : metaFilterStr;
>>> List<String> metaFilters =
>>> Arrays.asList(metaFilterStr.split(","));
>>> log.info("**** MetaFilters = " + metaFilters);
>>> return metaFilters;
>>> }
>>>
>>> private String getClassPath() {
>>> URL fileUrl = codeLocationFromClass(this.getClass());
>>> String classpath = getPathFromURL(fileUrl);
>>> System.out.println("getClassPath classpath = " + classpath);
>>> // class may come from a jar file
>>> if (classpath.endsWith(".jar!")) {
>>> int idx = classpath.lastIndexOf('.');
>>> classpath = classpath.substring(0, idx);
>>> }
>>> return classpath;
>>> }
>>>
>>> @Override
>>> public InjectableStepsFactory stepsFactory() {
>>> if (this.applicationContext == null) {
>>> AnnotationConfigApplicationContext applicationContext = new
>>> AnnotationConfigApplicationContext(com.apptech.qmo.ipt.configurations.SpringConfiguration.class);
>>> this.applicationContext = applicationContext;
>>> }
>>> return new SpringStepsFactory(configuration(),
>>> this.applicationContext);
>>> }
>>>
>>> public static class CustomTimeoutParser implements
>>> StoryTimeouts.TimeoutParser {
>>>
>>> public boolean isValid(String timeout) {
>>> return timeout.matches("(\\d+)secs");
>>> }
>>>
>>> public long asSeconds(String timeout) {
>>> return
>>> Long.parseLong(org.apache.commons.lang3.StringUtils.substringBefore(timeout,
>>> "secs"));
>>> }
>>>
>>> }
>>>
>>> @Override
>>> public void run() throws Throwable {
>>> Embedder embedder = configuredEmbedder();
>>> embedder.useMetaFilters(getMetaFilters());
>>> // These should be enabled so that even though the stories fail
>>> it wont go to catch method. Its useful when running multiple scenarios
>>> embedder.embedderControls().doIgnoreFailureInStories(true);
>>> embedder.embedderControls().doIgnoreFailureInView(false);
>>> embedder.embedderControls().doGenerateViewAfterStories(true);
>>>
>>> embedder.configuration().storyControls().doIgnoreMetaFiltersIfGivenStory(true);
>>> embedder.useTimeoutParsers(new CustomTimeoutParser());
>>> List<String> storyPaths = storyPaths();
>>> try {
>>> embedder.runStoriesAsPaths(storyPaths);
>>> } catch (Exception e) {
>>> Loggers.CONSOLE_LOGGER.error("STORY FAILED DUE TO:");
>>> e.printStackTrace(System.err);
>>> Loggers.FILE_LOGGER.error("STORY FAILED DUE TO:");
>>> e.printStackTrace(System.err);
>>> Loggers.CONSOLE_LOGGER.info("Driver instance is closing");
>>> Loggers.FILE_LOGGER.info("Driver instance is closing");
>>> embedder.generateCrossReference();
>>> throw new Throwable(e.fillInStackTrace());
>>> } finally {
>>> try {
>>> Loggers.CONSOLE_LOGGER.info("Driver instance is
>>> closing");
>>> driver.quit();
>>> Loggers.FILE_LOGGER.info("Driver instance is closing");
>>> } catch (Exception e) {
>>> System.out.println("Issue in closing driver instance in
>>> run method: " + e.getMessage());// Wantedly not caught the exception
>>> }
>>> embedder.generateCrossReference();
>>> }
>>> }
>>>
>>> public String getStoryFromStoryPaths(String storyName, List<String>
>>> storyPaths) {
>>> for (String story : storyPaths) {
>>> System.out.println("story = " + story);
>>> int stroryLength = story.split("/").length;
>>> if (story.split("/")[stroryLength -
>>> 1].equalsIgnoreCase(storyName)) return story;
>>> }
>>> return "";
>>> }
>>>
>>> @Override
>>> protected List<String> storyPaths() {
>>> final List<String> globList = new ArrayList<String>();
>>> final String[] globs = storyFilter().split(_STORIES_SEPARATOR);
>>> for (final String story : globs) {
>>> globList.add("**/*" + story + (story.endsWith(".story") ? ""
>>> : ".story"));
>>> }
>>> String classpath = getClassPath();
>>> log.info("classpath=" + classpath);
>>> List<String> paths = new StoryFinder().findPaths(classpath,
>>> globList, null);
>>> log.info("**** story paths = " + paths.toString());
>>> return paths;
>>> }
>>>
>>> private String storyFilter() {
>>> String storyFilter = System.getProperty("story.filter");
>>> if (storyFilter == null) {
>>> storyFilter = "";
>>> }
>>> return storyFilter;
>>> }
>>>
>>> public String captureReportName() {
>>> String storyName = null;
>>> String fileNames[] = reporterBuilder.outputDirectory().list();
>>> for (int i = 0; i < fileNames.length; i++) {
>>> if (fileNames[i].contains("html") &
>>> !fileNames[i].contains("BeforeStories")) {
>>> String name[] = fileNames[i].split(".html");
>>> storyName = name[0];
>>> }
>>> }
>>> return storyName;
>>> }
>>> }
>>>
>>>
>>>
>>> On Thursday, February 22, 2018 at 12:19:29 PM UTC-6, mauro.talevi wrote:
>>>>
>>>> You need to provide a sample project that reproduces the issue for us
>>>> to help you.
>>>>
>>>> On 21 Feb 2018, at 16:39, Maganti Suryanarayana murthy <
>>>> [email protected]> wrote:
>>>>
>>>> Any help on this
>>>> ?
>>>>
>>>> On Tuesday, February 20, 2018 at 10:16:58 AM UTC-6, Maganti
>>>> Suryanarayana murthy wrote:
>>>>>
>>>>> Any one is facing above issue ?
>>>>>
>>>>> On Tuesday, February 20, 2018 at 9:42:28 AM UTC-6, Maganti
>>>>> Suryanarayana murthy wrote:
>>>>>>
>>>>>> Jbehave story report is not showing the time in report i.e., the
>>>>>> Duration is shown as 00:00:00.000. I am using gradle as a build tool.
>>>>>>
>>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "JBehave User" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> To view this discussion on the web, visit
>>>> https://groups.google.com/d/msgid/jbehave-user/6376be18-29ad-444f-9670-79a4a6eae694%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/jbehave-user/6376be18-29ad-444f-9670-79a4a6eae694%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>>
>>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "JBehave User" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> To view this discussion on the web, visit
>>> https://groups.google.com/d/msgid/jbehave-user/045c006d-6548-466d-ab71-311b365880e6%40googlegroups.com
>>> <https://groups.google.com/d/msgid/jbehave-user/045c006d-6548-466d-ab71-311b365880e6%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>> --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "JBehave User" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/jbehave-user/aKfyLJmdsyY/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected].
>> To post to this group, send email to [email protected].
>> To view this discussion on the web, visit
>> https://groups.google.com/d/msgid/jbehave-user/604eab3b-5b98-4908-a71b-c6b1680f0354%40googlegroups.com
>> <https://groups.google.com/d/msgid/jbehave-user/604eab3b-5b98-4908-a71b-c6b1680f0354%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
--
*Regards,*
Gajendra Sahu
--
You received this message because you are subscribed to the Google Groups
"JBehave User" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send an email to [email protected].
To view this discussion on the web, visit
https://groups.google.com/d/msgid/jbehave-user/CAK%3DAUZVw2e9rbSLuBmT7WHL4RD%2BeFT5Cu7bL%2B_E95pBbMAzXzg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.