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]
> <javascript:>> 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] <javascript:>.
> To post to this group, send email to [email protected]
> <javascript:>.
> 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 an 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.
For more options, visit https://groups.google.com/d/optout.