From e971a554acf3730c92610bd4572338462ace146b Mon Sep 17 00:00:00 2001 From: Kingsley Hendrickse Date: Wed, 9 May 2012 17:05:58 +0100 Subject: [PATCH] Added tag based reporting --- .../jenkins/FeatureReportGenerator.java | 192 ++++++++++++- .../net/masterthought/jenkins/Runner.java | 44 +-- .../masterthought/jenkins/ScenarioTag.java | 23 ++ .../net/masterthought/jenkins/TagObject.java | 107 ++++++++ .../jenkins/XmlChartBuilder.java | 52 ++++ .../masterthought/jenkins/json/Element.java | 24 +- .../masterthought/jenkins/json/Feature.java | 24 ++ .../net/masterthought/jenkins/json/Util.java | 1 + .../resources/templates/featureOverview.vm | 1 + src/main/resources/templates/featureReport.vm | 65 +++-- src/main/resources/templates/tagOverview.vm | 257 ++++++++++++++++++ src/main/resources/templates/tagReport.vm | 177 ++++++++++++ velocity.log | 56 ++-- 13 files changed, 922 insertions(+), 101 deletions(-) create mode 100644 src/main/java/net/masterthought/jenkins/ScenarioTag.java create mode 100644 src/main/java/net/masterthought/jenkins/TagObject.java create mode 100644 src/main/resources/templates/tagOverview.vm create mode 100644 src/main/resources/templates/tagReport.vm diff --git a/src/main/java/net/masterthought/jenkins/FeatureReportGenerator.java b/src/main/java/net/masterthought/jenkins/FeatureReportGenerator.java index 539f581..2d12af2 100644 --- a/src/main/java/net/masterthought/jenkins/FeatureReportGenerator.java +++ b/src/main/java/net/masterthought/jenkins/FeatureReportGenerator.java @@ -27,6 +27,7 @@ public class FeatureReportGenerator { private List totalSteps; private String pluginUrlPath; private List allFeatures; + private List allTags; private static final String charEncoding = "UTF-8"; public FeatureReportGenerator(List jsonResultFiles, File reportDirectory, String pluginUrlPath, String buildNumber, String buildProject) throws IOException { @@ -37,6 +38,7 @@ public class FeatureReportGenerator { this.buildNumber = buildNumber; this.buildProject = buildProject; this.pluginUrlPath = getPluginUrlPath(pluginUrlPath); + this.allTags = findTagsInFeatures(); } private Map> parseJsonResults(List jsonResultFiles) throws IOException { @@ -52,6 +54,8 @@ public class FeatureReportGenerator { public void generateReports() throws Exception { generateFeatureReports(); generateFeatureOverview(); + generateTagReports(); + generateTagOverview(); } public void generateFeatureOverview() throws Exception { @@ -75,19 +79,7 @@ public class FeatureReportGenerator { generateReport("feature-overview.html", featureOverview, context); } - private List listAllFeatures() { - List allFeatures = new ArrayList(); - Iterator it = jsonResultFiles.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry pairs = (Map.Entry) it.next(); - List featureList = (List) pairs.getValue(); - allFeatures.addAll(featureList); - } - return allFeatures; - } - public void generateFeatureReports() throws Exception { - Iterator it = jsonResultFiles.entrySet().iterator(); while (it.hasNext()) { Map.Entry pairs = (Map.Entry) it.next(); @@ -110,6 +102,120 @@ public class FeatureReportGenerator { } } + public void generateTagReports() throws Exception { + for(TagObject tagObject : allTags) { + VelocityEngine ve = new VelocityEngine(); + ve.init(getProperties()); + Template featureResult = ve.getTemplate("templates/tagReport.vm"); + VelocityContext context = new VelocityContext(); + context.put("tag", tagObject); + context.put("time_stamp", timeStamp()); + context.put("jenkins_base", pluginUrlPath); + context.put("build_project", buildProject); + context.put("build_number", buildNumber); + context.put("report_status_colour", getTagReportStatusColour(tagObject)); + generateReport(tagObject.getTagName().replace("@", "").trim() + ".html", featureResult, context); + + } + } + + public void generateTagOverview() throws Exception { + VelocityEngine ve = new VelocityEngine(); + ve.init(getProperties()); + Template featureOverview = ve.getTemplate("templates/tagOverview.vm"); + VelocityContext context = new VelocityContext(); + context.put("build_project", buildProject); + context.put("build_number", buildNumber); + context.put("tags", allTags); + context.put("total_tags", getTotalTags()); + context.put("total_scenarios", getTotalTagScenarios()); + context.put("total_steps", getTotalTagSteps()); + context.put("total_passes", getTotalTagPasses()); + context.put("total_fails", getTotalTagFails()); + context.put("total_skipped", getTotalTagSkipped()); + context.put("chart_data", XmlChartBuilder.StackedColumnChart(allTags)); + context.put("total_duration", getTotalTagDuration()); + + context.put("time_stamp", timeStamp()); + context.put("jenkins_base", pluginUrlPath); + generateReport("tag-overview.html", featureOverview, context); + } + + private List findTagsInFeatures() { + List tagMap = new ArrayList(); + for (Feature feature : allFeatures) { + List scenarioList = new ArrayList(); + + if (feature.hasTags()) { + for (Element scenario : feature.getElements()) { + scenarioList.add(new ScenarioTag(scenario, feature.getFileName())); + tagMap = createOrAppendToTagMap(tagMap, feature.getTagList(), scenarioList); + } + } + for (Element scenario : feature.getElements()) { + if (scenario.hasTags()) { + scenarioList = addScenarioUnlessExists(scenarioList, new ScenarioTag(scenario, feature.getFileName())); + } + tagMap = createOrAppendToTagMap(tagMap, scenario.getTagList(), scenarioList); + } + } + return tagMap; + } + + private List addScenarioUnlessExists(List scenarioList, ScenarioTag scenarioTag) { + boolean exists = false; + for(ScenarioTag scenario : scenarioList){ + if(scenario.getParentFeatureUri().equalsIgnoreCase(scenarioTag.getParentFeatureUri()) + && scenario.getScenario().getName().equalsIgnoreCase(scenarioTag.getScenario().getName())){ + exists = true; + break; + } + } + + if (!exists) { + scenarioList.add(scenarioTag); + } + return scenarioList; + } + + private List createOrAppendToTagMap(List tagMap, List tagList, List scenarioList) { + for (String tag : tagList) { + boolean exists = false; + TagObject tagObj = null; + for(TagObject tagObject : tagMap){ + if(tagObject.getTagName().equalsIgnoreCase(tag)){ + exists = true; + tagObj = tagObject; + break; + } + } + if (exists) { + List existingTagList = tagObj.getScenarios(); + for(ScenarioTag scenarioTag : scenarioList){ + existingTagList = addScenarioUnlessExists(existingTagList, scenarioTag); + } + tagMap.remove(tagObj); + tagObj.setScenarios(existingTagList); + tagMap.add(tagObj); + } else { + tagObj = new TagObject(tag, scenarioList); + tagMap.add(tagObj); + } + } + return tagMap; + } + + private List listAllFeatures() { + List allFeatures = new ArrayList(); + Iterator it = jsonResultFiles.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pairs = (Map.Entry) it.next(); + List featureList = (List) pairs.getValue(); + allFeatures.addAll(featureList); + } + return allFeatures; + } + private static final Pattern p = Pattern.compile("\\\\u\\s*([0-9(A-F|a-f)]{4})", Pattern.MULTILINE); public static String U2U(String s) { @@ -130,6 +236,16 @@ public class FeatureReportGenerator { return totalSteps.size(); } + private int getTotalTagSteps() { + int steps = 0; + for(TagObject tag : allTags){ + for(ScenarioTag scenarioTag : tag.getScenarios()){ + steps += scenarioTag.getScenario().getSteps().length; + } + } + return steps; + } + private String getTotalDuration() { Long duration = 0L; for (Feature feature : allFeatures) { @@ -142,6 +258,18 @@ public class FeatureReportGenerator { return Util.formatDuration(duration); } + private String getTotalTagDuration() { + Long duration = 0L; + for (TagObject tagObject : allTags) { + for (ScenarioTag scenario : tagObject.getScenarios()) { + for (Step step : scenario.getScenario().getSteps()) { + duration = duration + step.getDuration(); + } + } + } + return Util.formatDuration(duration); + } + private int getTotalPasses() { return Util.findStatusCount(totalSteps, Util.Status.PASSED); } @@ -154,6 +282,30 @@ public class FeatureReportGenerator { return Util.findStatusCount(totalSteps, Util.Status.SKIPPED); } + private int getTotalTagPasses() { + int passes = 0; + for(TagObject tag : allTags){ + passes += tag.getNumberOfPasses(); + } + return passes; + } + + private int getTotalTagFails() { + int failed = 0; + for(TagObject tag : allTags){ + failed += tag.getNumberOfFailures(); + } + return failed; + } + + private int getTotalTagSkipped() { + int skipped = 0; + for(TagObject tag : allTags){ + skipped += tag.getNumberOfSkipped(); + } + return skipped; + } + private List getAllStepStatuses() { List steps = new ArrayList(); for (Feature feature : allFeatures) { @@ -169,6 +321,10 @@ public class FeatureReportGenerator { private int getTotalFeatures() { return allFeatures.size(); } + + private int getTotalTags(){ + return allTags.size(); + } private int getTotalScenarios() { int scenarios = 0; @@ -177,6 +333,14 @@ public class FeatureReportGenerator { } return scenarios; } + + private int getTotalTagScenarios(){ + int scenarios = 0; + for (TagObject tag : allTags) { + scenarios = scenarios + tag.getScenarios().size(); + } + return scenarios; + } private void generateReport(String fileName, Template featureResult, VelocityContext context) throws Exception { Writer writer = new FileWriter(new File(reportDirectory, fileName)); @@ -196,6 +360,10 @@ public class FeatureReportGenerator { return feature.getStatus() == Util.Status.PASSED ? "#C5D88A" : "#D88A8A"; } + private String getTagReportStatusColour(TagObject tag) { + return tag.getStatus() == Util.Status.PASSED ? "#C5D88A" : "#D88A8A"; + } + private String timeStamp() { return new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date()); } diff --git a/src/main/java/net/masterthought/jenkins/Runner.java b/src/main/java/net/masterthought/jenkins/Runner.java index 182b183..e57e334 100644 --- a/src/main/java/net/masterthought/jenkins/Runner.java +++ b/src/main/java/net/masterthought/jenkins/Runner.java @@ -1,22 +1,22 @@ -//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 list = new ArrayList(); -// 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"); -// -// FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(list,rd,"","15","aaaa"); -// featureReportGenerator.generateReports(); -// -// } -//} +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 list = new ArrayList(); + 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"); + + FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(list,rd,"","15","aaaaa"); + featureReportGenerator.generateReports(); + + } +} diff --git a/src/main/java/net/masterthought/jenkins/ScenarioTag.java b/src/main/java/net/masterthought/jenkins/ScenarioTag.java new file mode 100644 index 0000000..7758486 --- /dev/null +++ b/src/main/java/net/masterthought/jenkins/ScenarioTag.java @@ -0,0 +1,23 @@ +package net.masterthought.jenkins; + +import net.masterthought.jenkins.json.Element; + +public class ScenarioTag { + + private Element scenario; + private String parentFeatureUri; + + public ScenarioTag(Element scenario, String parentFeatureUri){ + this.scenario = scenario; + this.parentFeatureUri = parentFeatureUri; + } + + public Element getScenario(){ + return scenario; + } + + public String getParentFeatureUri(){ + return parentFeatureUri; + } + +} diff --git a/src/main/java/net/masterthought/jenkins/TagObject.java b/src/main/java/net/masterthought/jenkins/TagObject.java new file mode 100644 index 0000000..4833fc1 --- /dev/null +++ b/src/main/java/net/masterthought/jenkins/TagObject.java @@ -0,0 +1,107 @@ +package net.masterthought.jenkins; + +import net.masterthought.jenkins.json.Closure; +import net.masterthought.jenkins.json.Element; +import net.masterthought.jenkins.json.Step; +import net.masterthought.jenkins.json.Util; + +import java.util.ArrayList; +import java.util.List; + + +public class TagObject { + + private String tagName; + private List scenarios = new ArrayList(); + private List elements = new ArrayList(); + + public String getTagName() { + return tagName; + } + + public String getFileName(){ + return tagName.replace("@","").trim() + ".html"; + } + + public List getScenarios() { + return scenarios; + } + + public void setScenarios(List scenarioTagList){ + this.scenarios = scenarioTagList; + } + + public TagObject(String tagName, List scenarios){ + this.tagName = tagName; + this.scenarios = scenarios; + } + + private void getElements() { + for(ScenarioTag scenarioTag : scenarios){ + elements.add(scenarioTag.getScenario()); + } + } + + 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(); + } + } + return Util.formatDuration(duration); + } + + public int getNumberOfSteps(){ + int totalSteps = 0; + for(ScenarioTag scenario : scenarios){ + totalSteps += scenario.getScenario().getSteps().length; + } + return totalSteps; + } + + public int getNumberOfPasses() { + return Util.findStatusCount(getStatuses(), Util.Status.PASSED); + } + + public int getNumberOfFailures() { + return Util.findStatusCount(getStatuses(), Util.Status.FAILED); + } + + public int getNumberOfSkipped() { + return Util.findStatusCount(getStatuses(), Util.Status.SKIPPED); + } + + private List getStatuses(){ + List statuses = new ArrayList(); + for(ScenarioTag scenarioTag : scenarios){ + + for (Step step : scenarioTag.getScenario().getSteps()) { + statuses.add(step.getStatus()); + } + } + return statuses; + } + + public Util.Status getStatus() { + getElements(); + Closure scenarioStatus = new Closure() { + public Util.Status call(Element step) { + return step.getStatus(); + } + }; + + Element[] elementList = new Element[elements.size()]; + List results = Util.collectScenarios(elements.toArray(elementList), scenarioStatus); + return results.contains(Util.Status.FAILED) ? Util.Status.FAILED : Util.Status.PASSED; + } + + public String getRawStatus() { + return getStatus().toString().toLowerCase(); + } + +} diff --git a/src/main/java/net/masterthought/jenkins/XmlChartBuilder.java b/src/main/java/net/masterthought/jenkins/XmlChartBuilder.java index 7089492..f975a11 100644 --- a/src/main/java/net/masterthought/jenkins/XmlChartBuilder.java +++ b/src/main/java/net/masterthought/jenkins/XmlChartBuilder.java @@ -1,12 +1,64 @@ package net.masterthought.jenkins; +import java.util.List; + public class XmlChartBuilder { public static String donutChart(int total_passed, int total_failed, int total_skipped){ // I was going to use XMLBuilder to generate the chart - but it's so long and boring and I already have the xml so ..... return "PassedFailedSkipped" + total_passed + "" + total_failed + "" + total_skipped + "donut88dd11cc113488aaff2500"; } + + public static String StackedColumnChart(List tagObjectList){ + return ""+generateRowsForColumnChart(tagObjectList)+""+generateColumnsForColumnChart(tagObjectList)+"stacked 3d columnC5D88AD88A8A2DEAEC"; + } + + private static String generateRowsForColumnChart(List tagObjectList){ + StringBuffer buffer = new StringBuffer(); + for(TagObject tag : tagObjectList){ + buffer.append(""+tag.getTagName()+""); + } + return buffer.toString(); + } + private static String generateColumnsForColumnChart(List tagObjectList){ + StringBuffer buffer = new StringBuffer(); + buffer.append(""); + buffer.append("Passed"); + for(TagObject tag : tagObjectList){ + buffer.append(""+tag.getNumberOfPasses()+""); + + } + buffer.append(""); + buffer.append(""); + buffer.append("Failed"); + for(TagObject tag : tagObjectList){ + buffer.append(""+tag.getNumberOfFailures()+""); + + } + buffer.append(""); + buffer.append(""); + buffer.append("Skipped"); + for(TagObject tag : tagObjectList){ + buffer.append(""+tag.getNumberOfSkipped()+""); + + } + buffer.append(""); + return buffer.toString(); + } + + /* + + Region 1 + 22 + 15 + 11 + 15 + 20 + 22 + 21 + + */ } diff --git a/src/main/java/net/masterthought/jenkins/json/Element.java b/src/main/java/net/masterthought/jenkins/json/Element.java index 6c93d41..751753b 100644 --- a/src/main/java/net/masterthought/jenkins/json/Element.java +++ b/src/main/java/net/masterthought/jenkins/json/Element.java @@ -47,17 +47,31 @@ public class Element { return Util.itemExists(contentString) ? Util.result(getStatus()) + StringUtils.join(contentString.toArray(), " ") + Util.closeDiv() : ""; } - public String getTags() { - String result = "
"; - + public List getTagList(){ + return processTags(); + } + + public boolean hasTags(){ + return Util.itemExists(tags); + } + + private List processTags(){ + List results = new ArrayList(); if (Util.itemExists(tags)) { StringClosure scenarioTags = new StringClosure() { public String call(Tag tag) { return tag.getName(); } }; - List results = Util.collectTags(tags, scenarioTags); - String tagList = StringUtils.join(results.toArray(), ","); + results = Util.collectTags(tags, scenarioTags); + } + return results; + } + + public String getTags() { + String result = "
"; + if (Util.itemExists(tags)) { + String tagList = StringUtils.join(processTags().toArray(), ","); result = "
" + tagList + "
"; } return result; diff --git a/src/main/java/net/masterthought/jenkins/json/Feature.java b/src/main/java/net/masterthought/jenkins/json/Feature.java index d24e811..7659144 100644 --- a/src/main/java/net/masterthought/jenkins/json/Feature.java +++ b/src/main/java/net/masterthought/jenkins/json/Feature.java @@ -1,5 +1,7 @@ package net.masterthought.jenkins.json; +import org.apache.commons.lang.StringUtils; + import java.util.ArrayList; import java.util.List; @@ -10,6 +12,7 @@ public class Feature { private String description; private String keyword; private Element[] elements; + private Tag[] tags; public Feature(String name, String uri, String description, String keyword) { this.name = name; @@ -22,6 +25,27 @@ public class Feature { return elements; } + public boolean hasTags(){ + return Util.itemExists(tags); + } + + public List getTagList(){ + List tagList = new ArrayList(); + for(Tag tag : tags){ + tagList.add(tag.getName()); + } + return tagList; + } + + public String getTags() { + String result = "
"; + if (Util.itemExists(tags)) { + String tagList = StringUtils.join(getTagList().toArray(), ","); + result = "
" + tagList + "
"; + } + return result; + } + public Util.Status getStatus() { Closure scenarioStatus = new Closure() { public Util.Status call(Element step) { diff --git a/src/main/java/net/masterthought/jenkins/json/Util.java b/src/main/java/net/masterthought/jenkins/json/Util.java index a9d953d..2830f14 100644 --- a/src/main/java/net/masterthought/jenkins/json/Util.java +++ b/src/main/java/net/masterthought/jenkins/json/Util.java @@ -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; diff --git a/src/main/resources/templates/featureOverview.vm b/src/main/resources/templates/featureOverview.vm index 636cb9b..5b67ea9 100644 --- a/src/main/resources/templates/featureOverview.vm +++ b/src/main/resources/templates/featureOverview.vm @@ -73,6 +73,7 @@ table.stats-table td { diff --git a/src/main/resources/templates/featureReport.vm b/src/main/resources/templates/featureReport.vm index 52cfc54..314a712 100644 --- a/src/main/resources/templates/featureReport.vm +++ b/src/main/resources/templates/featureReport.vm @@ -96,7 +96,8 @@ table.data-table td { @@ -105,15 +106,43 @@ table.data-table td {

Feature Result for Build: $build_number

- Below are the results for this feature:
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
FeatureScenariosStepsPassedFailedSkippedDurationStatus
$feature.getRawName()$feature.getNumberOfScenarios()$feature.getNumberOfSteps()$feature.getNumberOfPasses()$feature.getNumberOfFailures()$feature.getNumberOfSkipped()$feature.getDurationOfSteps()$feature.getRawStatus()
+ +
+
+ $feature.getTags() $feature.getName() $feature.getDescription() @@ -138,38 +167,6 @@ table.data-table td { #end #end - - - -
-
-

Feature Statistics

- - - - - - - - - - - - - - - - - - - - - - -
FeatureScenariosStepsPassedFailedSkippedDurationStatus
$feature.getRawName()$feature.getNumberOfScenarios()$feature.getNumberOfSteps()$feature.getNumberOfPasses()$feature.getNumberOfFailures()$feature.getNumberOfSkipped()$feature.getDurationOfSteps()$feature.getRawStatus()
- -
-
diff --git a/src/main/resources/templates/tagOverview.vm b/src/main/resources/templates/tagOverview.vm new file mode 100644 index 0000000..8e998ee --- /dev/null +++ b/src/main/resources/templates/tagOverview.vm @@ -0,0 +1,257 @@ + + + + + + + + + Cucumber-JVM Html Reports - Tag Overview + + + + + + + + + + + +
+
+
+

Tag Overview for Build: $build_number

+ The following graph shows number of steps passing, failing and skipped for this build: +
+
+
+ +
+
+
+ +
+
+ +
+ +
+
+ +

Tag Statistics

+ + + + + + + + + + + + + + + #foreach($tag in $tags) + + #if($tag.getStatus().toString() == "PASSED") + #set($bgcolour = "#C5D88A") + #else + #set($bgcolour = "#D88A8A") + #end + + + + + + + + + + + + #end + + + + + + + + + + + +
TagScenariosStepsPassedFailedSkippedDurationStatus
$tag.getTagName()$tag.getNumberOfScenarios()$tag.getNumberOfSteps()$tag.getNumberOfPasses()$tag.getNumberOfFailures()$tag.getNumberOfSkipped()$tag.getDurationOfSteps()$tag.getRawStatus()
$total_tags$total_scenarios$total_steps$total_passes$total_fails$total_skipped$total_durationTotals
+
+ +
+
+ + +
+
+ +
+
+ + diff --git a/src/main/resources/templates/tagReport.vm b/src/main/resources/templates/tagReport.vm new file mode 100644 index 0000000..067b4b9 --- /dev/null +++ b/src/main/resources/templates/tagReport.vm @@ -0,0 +1,177 @@ + + + + + Cucumber-JVM Html Reports - Tag: $tag.getTagName() + + + + + + + + + + + +
+
+
+

Result for $tag.getTagName() in Build: $build_number

+
+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
TagScenariosStepsPassedFailedSkippedDurationStatus
$tag.getTagName()$tag.getNumberOfScenarios()$tag.getNumberOfSteps()$tag.getNumberOfPasses()$tag.getNumberOfFailures()$tag.getNumberOfSkipped()$tag.getDurationOfSteps()$tag.getRawStatus()
+ +
+ +
+ #foreach($scenario in $tag.getScenarios()) +
+ + $scenario.getScenario().getName() + #foreach($step in $scenario.getScenario().getSteps()) + $step.getName() + #if($step.hasRows()) +
+ + #foreach($row in $step.getRows()) + + #foreach($cell in $row.getCells()) + + #end + + #end +
$cell
+
+ #end + #end +
+ #end +
+
+ + +
+
+ +
+
+ diff --git a/velocity.log b/velocity.log index 56b881c..923300d 100644 --- a/velocity.log +++ b/velocity.log @@ -1,28 +1,28 @@ -Fri Apr 27 15:48:26 BST 2012 [debug] AvalonLogChute initialized using file 'velocity.log' -Fri Apr 27 15:48:26 BST 2012 [trace] ******************************************************************* -Fri Apr 27 15:48:26 BST 2012 [debug] Starting Jakarta Velocity v1.5-SNAPSHOT (compiled: 2006-07-21 06:25:35) -Fri Apr 27 15:48:26 BST 2012 [trace] RuntimeInstance initializing. -Fri Apr 27 15:48:26 BST 2012 [debug] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties -Fri Apr 27 15:48:26 BST 2012 [debug] Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute -Fri Apr 27 15:48:26 BST 2012 [debug] Using logger class org.apache.velocity.runtime.log.AvalonLogChute -Fri Apr 27 15:48:26 BST 2012 [debug] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl) -Fri Apr 27 15:48:26 BST 2012 [debug] ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader -Fri Apr 27 15:48:26 BST 2012 [trace] ClasspathResourceLoader : initialization complete. -Fri Apr 27 15:48:26 BST 2012 [debug] ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl) -Fri Apr 27 15:48:26 BST 2012 [trace] Default ResourceManager initialization complete. -Fri Apr 27 15:48:26 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Literal -Fri Apr 27 15:48:26 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Macro -Fri Apr 27 15:48:26 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Parse -Fri Apr 27 15:48:26 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Include -Fri Apr 27 15:48:26 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach -Fri Apr 27 15:48:26 BST 2012 [debug] Created '20' parsers. -Fri Apr 27 15:48:26 BST 2012 [trace] Velocimacro : initialization starting. -Fri Apr 27 15:48:26 BST 2012 [debug] Velocimacro : "velocimacro.library" is not set. Trying default library: VM_global_library.vm -Fri Apr 27 15:48:26 BST 2012 [debug] Velocimacro : Default library not found. -Fri Apr 27 15:48:26 BST 2012 [debug] Velocimacro : allowInline = true : VMs can be defined inline in templates -Fri Apr 27 15:48:26 BST 2012 [debug] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions -Fri Apr 27 15:48:26 BST 2012 [debug] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed. -Fri Apr 27 15:48:26 BST 2012 [debug] Velocimacro : autoload off : VM system will not automatically reload global library macros -Fri Apr 27 15:48:26 BST 2012 [trace] Velocimacro : initialization complete. -Fri Apr 27 15:48:26 BST 2012 [trace] RuntimeInstance successfully initialized. -Fri Apr 27 15:48:27 BST 2012 [debug] ResourceManager : found templates/featureOverview.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader +Wed May 09 17:01:28 BST 2012 [debug] AvalonLogChute initialized using file 'velocity.log' +Wed May 09 17:01:28 BST 2012 [trace] ******************************************************************* +Wed May 09 17:01:28 BST 2012 [debug] Starting Jakarta Velocity v1.5-SNAPSHOT (compiled: 2006-07-21 06:25:35) +Wed May 09 17:01:28 BST 2012 [trace] RuntimeInstance initializing. +Wed May 09 17:01:28 BST 2012 [debug] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties +Wed May 09 17:01:28 BST 2012 [debug] Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute +Wed May 09 17:01:28 BST 2012 [debug] Using logger class org.apache.velocity.runtime.log.AvalonLogChute +Wed May 09 17:01:28 BST 2012 [debug] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl) +Wed May 09 17:01:28 BST 2012 [debug] ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader +Wed May 09 17:01:28 BST 2012 [trace] ClasspathResourceLoader : initialization complete. +Wed May 09 17:01:28 BST 2012 [debug] ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl) +Wed May 09 17:01:28 BST 2012 [trace] Default ResourceManager initialization complete. +Wed May 09 17:01:28 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Literal +Wed May 09 17:01:28 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Macro +Wed May 09 17:01:28 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Parse +Wed May 09 17:01:28 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Include +Wed May 09 17:01:28 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach +Wed May 09 17:01:28 BST 2012 [debug] Created '20' parsers. +Wed May 09 17:01:28 BST 2012 [trace] Velocimacro : initialization starting. +Wed May 09 17:01:28 BST 2012 [debug] Velocimacro : "velocimacro.library" is not set. Trying default library: VM_global_library.vm +Wed May 09 17:01:28 BST 2012 [debug] Velocimacro : Default library not found. +Wed May 09 17:01:28 BST 2012 [debug] Velocimacro : allowInline = true : VMs can be defined inline in templates +Wed May 09 17:01:28 BST 2012 [debug] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions +Wed May 09 17:01:28 BST 2012 [debug] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed. +Wed May 09 17:01:28 BST 2012 [debug] Velocimacro : autoload off : VM system will not automatically reload global library macros +Wed May 09 17:01:28 BST 2012 [trace] Velocimacro : initialization complete. +Wed May 09 17:01:28 BST 2012 [trace] RuntimeInstance successfully initialized. +Wed May 09 17:01:28 BST 2012 [debug] ResourceManager : found templates/tagOverview.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader