Fixed issue #17 - no scenario or no steps now is handled ok

This commit is contained in:
Kingsley Hendrickse 2012-06-15 15:17:06 +01:00
parent 203331d86e
commit 41e7e1e42f
7 changed files with 161 additions and 102 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ target
.DS_Store .DS_Store
.log .log
.idea .idea
velocity.log

View File

@ -159,11 +159,14 @@ public class FeatureReportGenerator {
tagMap = createOrAppendToTagMap(tagMap, feature.getTagList(), scenarioList); tagMap = createOrAppendToTagMap(tagMap, feature.getTagList(), scenarioList);
} }
} }
for (Element scenario : feature.getElements()) {
if (scenario.hasTags()) { if (Util.hasScenarios(feature)) {
scenarioList = addScenarioUnlessExists(scenarioList, new ScenarioTag(scenario, feature.getFileName())); for (Element scenario : feature.getElements()) {
if (scenario.hasTags()) {
scenarioList = addScenarioUnlessExists(scenarioList, new ScenarioTag(scenario, feature.getFileName()));
}
tagMap = createOrAppendToTagMap(tagMap, scenario.getTagList(), scenarioList);
} }
tagMap = createOrAppendToTagMap(tagMap, scenario.getTagList(), scenarioList);
} }
} }
return tagMap; return tagMap;
@ -247,7 +250,10 @@ public class FeatureReportGenerator {
int steps = 0; int steps = 0;
for (TagObject tag : allTags) { for (TagObject tag : allTags) {
for (ScenarioTag scenarioTag : tag.getScenarios()) { for (ScenarioTag scenarioTag : tag.getScenarios()) {
steps += scenarioTag.getScenario().getSteps().length; Step[] stepList = scenarioTag.getScenario().getSteps();
if (stepList != null && stepList.length != 0) {
steps += stepList.length;
}
} }
} }
return steps; return steps;
@ -256,9 +262,13 @@ public class FeatureReportGenerator {
private String getTotalDuration() { private String getTotalDuration() {
Long duration = 0L; Long duration = 0L;
for (Feature feature : allFeatures) { for (Feature feature : allFeatures) {
for (Element scenario : feature.getElements()) { if (Util.hasScenarios(feature)) {
for (Step step : scenario.getSteps()) { for (Element scenario : feature.getElements()) {
duration = duration + step.getDuration(); if (Util.hasSteps(scenario)) {
for (Step step : scenario.getSteps()) {
duration = duration + step.getDuration();
}
}
} }
} }
} }
@ -269,8 +279,10 @@ public class FeatureReportGenerator {
Long duration = 0L; Long duration = 0L;
for (TagObject tagObject : allTags) { for (TagObject tagObject : allTags) {
for (ScenarioTag scenario : tagObject.getScenarios()) { for (ScenarioTag scenario : tagObject.getScenarios()) {
for (Step step : scenario.getScenario().getSteps()) { if (Util.hasSteps(scenario)) {
duration = duration + step.getDuration(); for (Step step : scenario.getScenario().getSteps()) {
duration = duration + step.getDuration();
}
} }
} }
} }
@ -289,7 +301,7 @@ public class FeatureReportGenerator {
return Util.findStatusCount(totalSteps, Util.Status.SKIPPED); return Util.findStatusCount(totalSteps, Util.Status.SKIPPED);
} }
private int getTotalPending(){ private int getTotalPending() {
return Util.findStatusCount(totalSteps, Util.Status.UNDEFINED); return Util.findStatusCount(totalSteps, Util.Status.UNDEFINED);
} }
@ -317,7 +329,7 @@ public class FeatureReportGenerator {
return skipped; return skipped;
} }
private int getTotalTagPending(){ private int getTotalTagPending() {
int pending = 0; int pending = 0;
for (TagObject tag : allTags) { for (TagObject tag : allTags) {
pending += tag.getNumberOfPending(); pending += tag.getNumberOfPending();
@ -328,9 +340,13 @@ public class FeatureReportGenerator {
private List<Util.Status> getAllStepStatuses() { private List<Util.Status> getAllStepStatuses() {
List<Util.Status> steps = new ArrayList<Util.Status>(); List<Util.Status> steps = new ArrayList<Util.Status>();
for (Feature feature : allFeatures) { for (Feature feature : allFeatures) {
for (Element scenario : feature.getElements()) { if (Util.hasScenarios(feature)) {
for (Step step : scenario.getSteps()) { for (Element scenario : feature.getElements()) {
steps.add(step.getStatus()); if (Util.hasSteps(scenario)) {
for (Step step : scenario.getSteps()) {
steps.add(step.getStatus());
}
}
} }
} }
} }

View File

@ -1,26 +1,27 @@
package net.masterthought.jenkins; //package net.masterthought.jenkins;
//
//
import java.io.File; //import java.io.File;
import java.util.ArrayList; //import java.util.ArrayList;
import java.util.List; //import java.util.List;
//
public class Runner { //public class Runner {
//
public static void main(String[] args) throws Exception { // public static void main(String[] args) throws Exception {
File rd = new File("/Users/kings/.jenkins/jobs/cucumber-jvm/builds/7/cucumber-html-reports"); // File rd = new File("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports");
List<String> list = new ArrayList<String>(); // List<String> list = new ArrayList<String>();
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/french.json"); // list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/french.json");
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/co_cucumber.json"); // list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/co_cucumber.json");
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/ccp_cucumber.json"); // list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/ccp_cucumber.json");
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/ss_cucumber.json"); // list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/ss_cucumber.json");
list.add("/Users/kings/.jenkins/jobs/cucumber-jvm/builds/7/cucumber-html-reports/cukes.json"); //// list.add("/Users/kings/.jenkins/jobs/cucumber-jvm/builds/7/cucumber-html-reports/cukes.json");
list.add("/Users/kings/.jenkins/jobs/cucumber-jvm/builds/7/cucumber-html-reports/cucumber.json"); //// list.add("/Users/kings/.jenkins/jobs/cucumber-jvm/builds/7/cucumber-html-reports/cucumber.json");
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/result.json");
FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(list,rd,"","7","cucumber-jvm",false,true); //
featureReportGenerator.generateReports(); // FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(list,rd,"","15","aaaaa",false,true);
// boolean result = featureReportGenerator.getBuildStatus(); // featureReportGenerator.generateReports();
// System.out.println("status: " + result); //// boolean result = featureReportGenerator.getBuildStatus();
//// System.out.println("status: " + result);
} //
} // }
//}

View File

@ -10,7 +10,7 @@ import java.util.List;
public class TagObject { public class TagObject {
private String tagName; private String tagName;
private List<ScenarioTag> scenarios = new ArrayList<ScenarioTag>(); private List<ScenarioTag> scenarios = new ArrayList<ScenarioTag>();
private List<Element> elements = new ArrayList<Element>(); private List<Element> elements = new ArrayList<Element>();
@ -19,47 +19,51 @@ public class TagObject {
return tagName; return tagName;
} }
public String getFileName(){ public String getFileName() {
return tagName.replace("@","").trim() + ".html"; return tagName.replace("@", "").trim() + ".html";
} }
public List<ScenarioTag> getScenarios() { public List<ScenarioTag> getScenarios() {
return scenarios; return scenarios;
} }
public void setScenarios(List<ScenarioTag> scenarioTagList){ public void setScenarios(List<ScenarioTag> scenarioTagList) {
this.scenarios = scenarioTagList; this.scenarios = scenarioTagList;
} }
public TagObject(String tagName, List<ScenarioTag> scenarios){ public TagObject(String tagName, List<ScenarioTag> scenarios) {
this.tagName = tagName; this.tagName = tagName;
this.scenarios = scenarios; this.scenarios = scenarios;
} }
private void getElements() { private void getElements() {
for(ScenarioTag scenarioTag : scenarios){ for (ScenarioTag scenarioTag : scenarios) {
elements.add(scenarioTag.getScenario()); elements.add(scenarioTag.getScenario());
} }
} }
public Integer getNumberOfScenarios(){ public Integer getNumberOfScenarios() {
return this.scenarios.size(); return this.scenarios.size();
} }
public String getDurationOfSteps() { public String getDurationOfSteps() {
Long duration = 0L; Long duration = 0L;
for (ScenarioTag scenarioTag : scenarios) { for (ScenarioTag scenarioTag : scenarios) {
for (Step step : scenarioTag.getScenario().getSteps()) { if (Util.hasSteps(scenarioTag)) {
duration = duration + step.getDuration(); for (Step step : scenarioTag.getScenario().getSteps()) {
} duration = duration + step.getDuration();
}
}
} }
return Util.formatDuration(duration); return Util.formatDuration(duration);
} }
public int getNumberOfSteps(){ public int getNumberOfSteps() {
int totalSteps = 0; int totalSteps = 0;
for(ScenarioTag scenario : scenarios){ for (ScenarioTag scenario : scenarios) {
totalSteps += scenario.getScenario().getSteps().length; if (Util.hasSteps(scenario)) {
totalSteps += scenario.getScenario().getSteps().length;
}
} }
return totalSteps; return totalSteps;
} }
@ -72,22 +76,23 @@ public class TagObject {
return Util.findStatusCount(getStatuses(), Util.Status.FAILED); return Util.findStatusCount(getStatuses(), Util.Status.FAILED);
} }
public int getNumberOfSkipped() { public int getNumberOfSkipped() {
return Util.findStatusCount(getStatuses(), Util.Status.SKIPPED); return Util.findStatusCount(getStatuses(), Util.Status.SKIPPED);
} }
public int getNumberOfPending() { public int getNumberOfPending() {
return Util.findStatusCount(getStatuses(), Util.Status.UNDEFINED); return Util.findStatusCount(getStatuses(), Util.Status.UNDEFINED);
} }
private List<Util.Status> getStatuses() { private List<Util.Status> getStatuses() {
List<Util.Status> statuses = new ArrayList<Util.Status>(); List<Util.Status> statuses = new ArrayList<Util.Status>();
for(ScenarioTag scenarioTag : scenarios){ for (ScenarioTag scenarioTag : scenarios) {
if (Util.hasSteps(scenarioTag)) {
for (Step step : scenarioTag.getScenario().getSteps()) { for (Step step : scenarioTag.getScenario().getSteps()) {
statuses.add(step.getStatus()); statuses.add(step.getStatus());
} }
} }
}
return statuses; return statuses;
} }
@ -98,7 +103,7 @@ public class TagObject {
return step.getStatus(); return step.getStatus();
} }
}; };
Element[] elementList = new Element[elements.size()]; Element[] elementList = new Element[elements.size()];
List<Util.Status> results = Util.collectScenarios(elements.toArray(elementList), scenarioStatus); List<Util.Status> results = Util.collectScenarios(elements.toArray(elementList), scenarioStatus);
return results.contains(Util.Status.FAILED) ? Util.Status.FAILED : Util.Status.PASSED; return results.contains(Util.Status.FAILED) ? Util.Status.FAILED : Util.Status.PASSED;
@ -107,5 +112,5 @@ public class TagObject {
public String getRawStatus() { public String getRawStatus() {
return getStatus().toString().toLowerCase(); return getStatus().toString().toLowerCase();
} }
} }

View File

@ -62,9 +62,13 @@ public class Feature {
private List<Util.Status> lookUpSteps() { private List<Util.Status> lookUpSteps() {
List<Util.Status> stepStatuses = new ArrayList<Util.Status>(); List<Util.Status> stepStatuses = new ArrayList<Util.Status>();
for (Element element : elements) { if (Util.itemExists(elements)) {
for (Step step : element.getSteps()) { for (Element element : elements) {
stepStatuses.add(step.getStatus()); if (Util.hasSteps(element)) {
for (Step step : element.getSteps()) {
stepStatuses.add(step.getStatus());
}
}
} }
} }
return stepStatuses; return stepStatuses;
@ -106,7 +110,7 @@ public class Feature {
} }
public int getNumberOfScenarios() { public int getNumberOfScenarios() {
return elements.length; return Util.itemExists(elements) ? elements.length : 0;
} }
public int getNumberOfSteps() { public int getNumberOfSteps() {
@ -135,9 +139,13 @@ public class Feature {
public String getDurationOfSteps() { public String getDurationOfSteps() {
Long totalDuration = 0L; Long totalDuration = 0L;
for (Element element : elements) { if (Util.itemExists(elements)) {
for (Step step : element.getSteps()) { for (Element element : elements) {
totalDuration = totalDuration + step.getDuration(); if (Util.hasSteps(element)) {
for (Step step : element.getSteps()) {
totalDuration = totalDuration + step.getDuration();
}
}
} }
} }
return Util.formatDuration(totalDuration); return Util.formatDuration(totalDuration);

View File

@ -1,5 +1,6 @@
package net.masterthought.jenkins.json; package net.masterthought.jenkins.json;
import net.masterthought.jenkins.ScenarioTag;
import org.joda.time.Period; import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter; import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder; import org.joda.time.format.PeriodFormatterBuilder;
@ -19,7 +20,7 @@ public class Util {
return listItem.size() != 0; return listItem.size() != 0;
} }
public static boolean itemExists(Tag[] tags) { public static <T> boolean itemExists(T[] tags) {
boolean result = false; boolean result = false;
if (tags != null) { if (tags != null) {
result = tags.length != 0; result = tags.length != 0;
@ -59,22 +60,49 @@ public class Util {
return result; return result;
} }
public static boolean hasSteps(Element element) {
boolean result = element.getSteps() == null || element.getSteps().length == 0;
if(result){
System.out.println("[WARNING] scenario has no steps: " + element.getName());
}
return !result;
}
public static boolean hasSteps(ScenarioTag scenario) {
boolean result = scenario.getScenario().getSteps() == null || scenario.getScenario().getSteps().length == 0;
if(result){
System.out.println("[WARNING] scenario tag has no steps: " + scenario.getScenario().getName());
}
return !result;
}
public static boolean hasScenarios(Feature feature) {
boolean result = feature.getElements() == null || feature.getElements().length == 0;
if(result){
System.out.println("[WARNING] feature has no scenarios: " + feature.getName());
}
return !result;
}
public static enum Status { public static enum Status {
PASSED, FAILED, SKIPPED, UNDEFINED, MISSING PASSED, FAILED, SKIPPED, UNDEFINED, MISSING
} }
public static <T, R> List<R> collectScenarios(Element[] list, Closure<String, Element> clo) { public static <T, R> List<R> collectScenarios(Element[] list, Closure<String, Element> clo) {
List<R> res = new ArrayList<R>(); List<R> res = new ArrayList<R>();
if(Util.itemExists(list)){
for (final Element t : list) { for (final Element t : list) {
res.add((R) clo.call(t)); res.add((R) clo.call(t));
} } }
return res; return res;
} }
public static <T, R> List<R> collectSteps(Step[] list, Closure<String, Step> clo) { public static <T, R> List<R> collectSteps(Step[] list, Closure<String, Step> clo) {
List<R> res = new ArrayList<R>(); List<R> res = new ArrayList<R>();
for (final Step t : list) { if(Util.itemExists(list)){
for (final Step t : list) {
res.add((R) clo.call(t)); res.add((R) clo.call(t));
}
} }
return res; return res;
} }

View File

@ -1,28 +1,28 @@
Wed Jun 06 17:10:56 BST 2012 [debug] AvalonLogChute initialized using file 'velocity.log' Fri Jun 15 15:15:17 BST 2012 [debug] AvalonLogChute initialized using file 'velocity.log'
Wed Jun 06 17:10:56 BST 2012 [trace] ******************************************************************* Fri Jun 15 15:15:17 BST 2012 [trace] *******************************************************************
Wed Jun 06 17:10:56 BST 2012 [debug] Starting Jakarta Velocity v1.5-SNAPSHOT (compiled: 2006-07-21 06:25:35) Fri Jun 15 15:15:17 BST 2012 [debug] Starting Jakarta Velocity v1.5-SNAPSHOT (compiled: 2006-07-21 06:25:35)
Wed Jun 06 17:10:56 BST 2012 [trace] RuntimeInstance initializing. Fri Jun 15 15:15:17 BST 2012 [trace] RuntimeInstance initializing.
Wed Jun 06 17:10:56 BST 2012 [debug] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties Fri Jun 15 15:15:17 BST 2012 [debug] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties
Wed Jun 06 17:10:56 BST 2012 [debug] Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute Fri Jun 15 15:15:17 BST 2012 [debug] Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute
Wed Jun 06 17:10:56 BST 2012 [debug] Using logger class org.apache.velocity.runtime.log.AvalonLogChute Fri Jun 15 15:15:17 BST 2012 [debug] Using logger class org.apache.velocity.runtime.log.AvalonLogChute
Wed Jun 06 17:10:56 BST 2012 [debug] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl) Fri Jun 15 15:15:17 BST 2012 [debug] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl)
Wed Jun 06 17:10:56 BST 2012 [debug] ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader Fri Jun 15 15:15:17 BST 2012 [debug] ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Wed Jun 06 17:10:56 BST 2012 [trace] ClasspathResourceLoader : initialization complete. Fri Jun 15 15:15:17 BST 2012 [trace] ClasspathResourceLoader : initialization complete.
Wed Jun 06 17:10:56 BST 2012 [debug] ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl) Fri Jun 15 15:15:17 BST 2012 [debug] ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl)
Wed Jun 06 17:10:56 BST 2012 [trace] Default ResourceManager initialization complete. Fri Jun 15 15:15:17 BST 2012 [trace] Default ResourceManager initialization complete.
Wed Jun 06 17:10:56 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Literal Fri Jun 15 15:15:17 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Literal
Wed Jun 06 17:10:56 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Macro Fri Jun 15 15:15:17 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Macro
Wed Jun 06 17:10:56 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Parse Fri Jun 15 15:15:17 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Parse
Wed Jun 06 17:10:56 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Include Fri Jun 15 15:15:17 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Include
Wed Jun 06 17:10:56 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach Fri Jun 15 15:15:17 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach
Wed Jun 06 17:10:56 BST 2012 [debug] Created '20' parsers. Fri Jun 15 15:15:17 BST 2012 [debug] Created '20' parsers.
Wed Jun 06 17:10:56 BST 2012 [trace] Velocimacro : initialization starting. Fri Jun 15 15:15:17 BST 2012 [trace] Velocimacro : initialization starting.
Wed Jun 06 17:10:56 BST 2012 [debug] Velocimacro : "velocimacro.library" is not set. Trying default library: VM_global_library.vm Fri Jun 15 15:15:17 BST 2012 [debug] Velocimacro : "velocimacro.library" is not set. Trying default library: VM_global_library.vm
Wed Jun 06 17:10:56 BST 2012 [debug] Velocimacro : Default library not found. Fri Jun 15 15:15:17 BST 2012 [debug] Velocimacro : Default library not found.
Wed Jun 06 17:10:56 BST 2012 [debug] Velocimacro : allowInline = true : VMs can be defined inline in templates Fri Jun 15 15:15:17 BST 2012 [debug] Velocimacro : allowInline = true : VMs can be defined inline in templates
Wed Jun 06 17:10:56 BST 2012 [debug] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions Fri Jun 15 15:15:17 BST 2012 [debug] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions
Wed Jun 06 17:10:56 BST 2012 [debug] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed. Fri Jun 15 15:15:17 BST 2012 [debug] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed.
Wed Jun 06 17:10:56 BST 2012 [debug] Velocimacro : autoload off : VM system will not automatically reload global library macros Fri Jun 15 15:15:17 BST 2012 [debug] Velocimacro : autoload off : VM system will not automatically reload global library macros
Wed Jun 06 17:10:56 BST 2012 [trace] Velocimacro : initialization complete. Fri Jun 15 15:15:17 BST 2012 [trace] Velocimacro : initialization complete.
Wed Jun 06 17:10:56 BST 2012 [trace] RuntimeInstance successfully initialized. Fri Jun 15 15:15:17 BST 2012 [trace] RuntimeInstance successfully initialized.
Wed Jun 06 17:10:56 BST 2012 [debug] ResourceManager : found templates/tagOverview.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader Fri Jun 15 15:15:17 BST 2012 [debug] ResourceManager : found templates/tagOverview.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader