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
.log
.idea
velocity.log

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,6 @@
package net.masterthought.jenkins.json;
import net.masterthought.jenkins.ScenarioTag;
import org.joda.time.Period;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;
@ -19,7 +20,7 @@ public class Util {
return listItem.size() != 0;
}
public static boolean itemExists(Tag[] tags) {
public static <T> boolean itemExists(T[] tags) {
boolean result = false;
if (tags != null) {
result = tags.length != 0;
@ -59,22 +60,49 @@ public class Util {
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 {
PASSED, FAILED, SKIPPED, UNDEFINED, MISSING
}
public static <T, R> List<R> collectScenarios(Element[] list, Closure<String, Element> clo) {
List<R> res = new ArrayList<R>();
if(Util.itemExists(list)){
for (final Element t : list) {
res.add((R) clo.call(t));
}
} }
return res;
}
public static <T, R> List<R> collectSteps(Step[] list, Closure<String, Step> clo) {
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));
}
}
return res;
}

View File

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