From f4c36a962af0d95279889fee4e41ab89c021b9db Mon Sep 17 00:00:00 2001 From: Aleksi Simell Date: Fri, 12 Mar 2021 14:21:50 +0200 Subject: [PATCH] [JENKINS-64516] Add support for Robot Framework 4.0 (#40) * Add methods to get "skip" status * Remove redundant list type references * Add skip to RobotCaseResult * Remove unnecessary variable * Remove redundant toString() call * Apply better Java syntax * Apply better Java syntax * Parse RF4.0 styled tags * Add unit tests for skip status * Parse "SKIP" status correctly * Ignore skipped tests when counting pass percentage * Add "Skipped" trend to graph and add a column to list view * Add "skip" support for graphs, blue ocean, and list view * Add skip info to results overview * Replace output.xml with more complex * Change colour to orange * Add test to parse tags from RF 4.x output properly * Add documentation to some test output.xml files * Proper syntax for skipped cases in table * Parse tags properly * Add more skip status indications * Small refactor for parsing arguments and add "tag" to list of caught elements * Ignore skipped test cases when getting all failed cases * Replace StringBuffers with StringBuilders * Add unit test to test stacktrace parsing * Properly parse arguments and args * Add instructions for RF 4 configuration * Update documentation * Fix getFailedSince() * Move keyword parsing to a separate method * Refactor kw parsing and add for-loop parsing * Add unit test for RF4.0 nested for loop parsing * Refactor BlueOcean tests * Fix stacktrace parsing * Delete commented lines * Add test to parse if branch * Add if-branch parsing * Fix for loops and ifs with no contents and prettify indentations * Add test to check empty for loop * Add tests to parse stacktrace * Fix test expected values * Fix stacktrace newlines * Fix keyword and arg parsing * Add default to switch case * Add comment for clarity * Update doc/README.md Co-authored-by: Tatu Kairi <280218+Tattoo@users.noreply.github.com> * Update doc/README.md Co-authored-by: Tatu Kairi <280218+Tattoo@users.noreply.github.com> * Update src/main/java/hudson/plugins/robot/RobotParser.java Make kw the default Co-authored-by: Tatu Kairi <280218+Tattoo@users.noreply.github.com> * Unify structures * Add explicit typing for clarity * Add braces for clarity * Add braces to if Co-authored-by: Tatu Kairi <280218+Tattoo@users.noreply.github.com> --- doc/README.md | 35 ++- doc/images/build_page.png | Bin 7297 -> 35200 bytes doc/images/detailed.png | Bin 6894 -> 41298 bytes doc/images/loghtml_sidepanel.png | Bin 11891 -> 0 bytes doc/images/robo_loglink_projectpage.png | Bin 25733 -> 0 bytes doc/images/robot_4_table.png | Bin 0 -> 28905 bytes doc/images/robot_view_column.png | Bin 6270 -> 28031 bytes doc/images/sidepanel.png | Bin 0 -> 28331 bytes .../plugins/robot/AggregatedRobotAction.java | 15 +- .../hudson/plugins/robot/RobotParser.java | 241 +++++++++++---- .../hudson/plugins/robot/RobotPublisher.java | 2 +- .../robot/blueocean/BlueRobotTestResult.java | 4 +- .../plugins/robot/graph/RobotGraphHelper.java | 22 +- .../plugins/robot/model/RobotCaseResult.java | 27 +- .../plugins/robot/model/RobotResult.java | 45 ++- .../robot/model/RobotResultStatistics.java | 11 +- .../plugins/robot/model/RobotSuiteResult.java | 31 +- .../plugins/robot/model/RobotTestObject.java | 2 + .../robot/view/RobotListViewColumn.java | 25 +- .../hudson/plugins/robot/Messages.properties | 1 + .../robot/model/RobotCaseResult/index.jelly | 3 + .../robot/model/RobotResult/index.jelly | 4 +- .../robot/model/RobotSuiteResult/index.jelly | 9 +- .../model/RobotTestObject/robotcss.jelly | 3 + .../plugins/robot/util/robotsummary.jelly | 3 + .../view/RobotListViewColumn/column.jelly | 23 +- .../hudson/plugins/robot/RobotParserTest.java | 22 ++ .../robot/RobotPublisherSystemTest.java | 38 +-- .../BlueRobotTestResultForRobot4Test.java | 104 +++++++ .../blueocean/BlueRobotTestResultTest.java | 71 +++-- .../plugins/robot/model/RobotResultTest.java | 48 ++- .../RobotFailedCasesTokenMacroTest.java | 2 +- .../plugins/robot/blueocean/blue_skip.xml | 285 ++++++++++++++++++ .../plugins/robot/model/robot4_skip.xml | 136 +++++++++ .../hudson/plugins/robot/robot4_if_output.xml | 198 ++++++++++++ .../plugins/robot/robot4_nested_output.xml | 248 +++++++++++++++ .../hudson/plugins/robot/robot4_output.xml | 133 ++++++++ 37 files changed, 1604 insertions(+), 187 deletions(-) delete mode 100644 doc/images/loghtml_sidepanel.png delete mode 100644 doc/images/robo_loglink_projectpage.png create mode 100644 doc/images/robot_4_table.png create mode 100644 doc/images/sidepanel.png create mode 100644 src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultForRobot4Test.java create mode 100644 src/test/resources/hudson/plugins/robot/blueocean/blue_skip.xml create mode 100644 src/test/resources/hudson/plugins/robot/model/robot4_skip.xml create mode 100644 src/test/resources/hudson/plugins/robot/robot4_if_output.xml create mode 100644 src/test/resources/hudson/plugins/robot/robot4_nested_output.xml create mode 100644 src/test/resources/hudson/plugins/robot/robot4_output.xml diff --git a/doc/README.md b/doc/README.md index f467094c..f5508bce 100644 --- a/doc/README.md +++ b/doc/README.md @@ -107,10 +107,10 @@ build. Conversely, the project view side panel link won't go away until after configuration change/resave in project. We're working on a solution to this. -![](images/loghtml_sidepanel.png) +![sidepanel link](images/sidepanel.png) *side panel link* -![](images/robo_loglink_projectpage.png) +![summary link](images/robot_4_table.png) *Summary link* #### Configuring Robot overall pass/fail to show in the project list @@ -128,7 +128,7 @@ solution to this. [http://YOURJENKINSHOST/configure](http://yourjenkinshost/configure) )and select your newly created view to be the default one. -![](images/robot_view_column.png) +![List view](images/robot_view_column.png) *List view column in action* #### Using token macros in e-mail report @@ -178,25 +178,36 @@ and [here](https://content-security-policy.com/) how to change you CSP settings but be aware that **Changing CSP settings will potentially expose you Jenkins instance for security vulnerabilities**. -### Overall Screenshots +### Robot Framework 4.x compatibility -##### Config +The plugin supports both Robot Framework 3.x and 4.x output files. However, in order to support both, the plugin +shows some extra information for both. [In Robot Framework 4.0 test criticality was removed and "SKIP" status was added](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-4.0.rst). So for 3.x the +results overview will show a `Skipped` column, which will always be 0 and for Robot Frameowork 4.x output files +the `Critical tests` row will always be 0. -![](images/config1.png) +Skipped tests aren't taken into account when calculating pass percentage, but they are calculated to the total +amount of tests. -##### Project view +Because criticality was removed in Robot Framework 4.0, having the `Use thresholds for critical tests only` checkbox +checked will always result in a passing step (because pass percentage is always considered to be 100% when there are +0 tests). In order to have set build status correctly, you **must** uncheck the checkbox or use `onlyCritical: false` +in your pipeline when you call `robot`. -![](images/project_page.png) +We are planning of dropping support for Robot Framework 3.x and earlier some time in distant future. + +### Overall Screenshots + + +##### Project view -##### Build view +![Build page overview](images/build_page.png) -![](images/build_page.png) ##### Detailed build view -![](images/detailed.png) +![Detailed results view](images/detailed.png) ## Bugs [List of open bugs on -robot-plugin](https://issues.jenkins-ci.org/issues/?jql=component%20%3D%20robot-plugin%20AND%20resolution%20is%20EMPTY%20ORDER%20BY%20updated%20DESC) \ No newline at end of file +robot-plugin](https://issues.jenkins-ci.org/issues/?jql=component%20%3D%20robot-plugin%20AND%20resolution%20is%20EMPTY%20ORDER%20BY%20updated%20DESC) diff --git a/doc/images/build_page.png b/doc/images/build_page.png index a36c49c260aba4f0da5899aeadee3918a46a9ce1..6c047d60377d85badf66bfde04a49215d89e79a1 100644 GIT binary patch literal 35200 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

;Rk)- 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 bHPHV97wfb~;wS-900000NkvXXu0mjf;<*o# diff --git a/doc/images/detailed.png b/doc/images/detailed.png index fbfbdd56b14de7a18fde92a860179fc9eb4d4a08..d81abd2bbd9c3a4995214c80d1062b3e6ab1dc09 100644 GIT binary patch literal 41298 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%0A5WjMuXn3Rx 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 C#z!;& literal 6894 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 oibAI`C!9tU3Wb=VQ0qef50McrZeZ;BivR!s diff --git a/doc/images/loghtml_sidepanel.png b/doc/images/loghtml_sidepanel.png deleted file mode 100644 index 33757362a0bbbdd6cab18d54b9596cf3e42184b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11891 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 Eg3GgJ`2YX_ diff --git a/doc/images/robot_4_table.png b/doc/images/robot_4_table.png new file mode 100644 index 0000000000000000000000000000000000000000..15dd2738847b27a45cf23a599cc32e5a1b90a9d7 GIT binary patch literal 28905 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 literal 0 HcmV?d00001 diff --git a/doc/images/robot_view_column.png b/doc/images/robot_view_column.png index d3e987a3171825c600b2b42ddfe7026c801dc409..5de3bc10f009d594666ea10e6ae178cc1737a3e6 100644 GIT binary patch literal 28031 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 diff --git a/doc/images/sidepanel.png b/doc/images/sidepanel.png new file mode 100644 index 0000000000000000000000000000000000000000..b9eabfe7769bf85864ad5309f8742be53d1b657c GIT binary patch literal 28331 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 WW%qFd_)Q1`0;Hm*LbaS_$o~UzTh>JY literal 0 HcmV?d00001 diff --git a/src/main/java/hudson/plugins/robot/AggregatedRobotAction.java b/src/main/java/hudson/plugins/robot/AggregatedRobotAction.java index 87863f26..5302ba91 100644 --- a/src/main/java/hudson/plugins/robot/AggregatedRobotAction.java +++ b/src/main/java/hudson/plugins/robot/AggregatedRobotAction.java @@ -109,7 +109,7 @@ public static class AggregatedRobotResult extends RobotResult { private static final long serialVersionUID = 1L; private final transient AggregatedRobotAction parent; - private int passed, failed, criticalPassed, criticalFailed; + private int passed, failed, skipped, criticalPassed, criticalFailed; public AggregatedRobotResult(AggregatedRobotAction parent) { this.parent = parent; @@ -120,6 +120,7 @@ public void addResult(RobotResult result) { criticalPassed += result.getCriticalPassed(); failed += result.getOverallFailed(); passed += result.getOverallPassed(); + skipped += result.getOverallSkipped(); } @Override @@ -147,9 +148,14 @@ public long getOverallFailed() { return failed; } + @Override + public long getOverallSkipped() { + return skipped; + } + @Override public long getOverallTotal() { - return failed + passed; + return failed + passed + skipped; } @Override @@ -162,6 +168,11 @@ public int getPassed() { return (int) getOverallPassed(); } + @Override + public int getSkipped() { + return (int) getOverallSkipped(); + } + @Override public AbstractBuild getOwner() { return parent.getOwner(); diff --git a/src/main/java/hudson/plugins/robot/RobotParser.java b/src/main/java/hudson/plugins/robot/RobotParser.java index b7526e10..cb1809e5 100644 --- a/src/main/java/hudson/plugins/robot/RobotParser.java +++ b/src/main/java/hudson/plugins/robot/RobotParser.java @@ -18,7 +18,6 @@ import hudson.AbortException; import hudson.FilePath; import hudson.Util; -import hudson.model.AbstractBuild; import hudson.model.Run; import hudson.plugins.robot.model.RobotTestObject; import hudson.plugins.robot.model.RobotCaseResult; @@ -46,9 +45,8 @@ public class RobotParser { public RobotResult parse(String outputFileLocations, String outputPath, Run build, FilePath workSpace, String logFileName, String reportFileName) throws InterruptedException, IOException { - RobotResult result = new FilePath(workSpace, outputPath).act( + return new FilePath(workSpace, outputPath).act( new RobotParserCallable(outputFileLocations, logFileName, reportFileName)); - return result; } public static final class RobotParserCallable implements @@ -91,7 +89,7 @@ public RobotResult invoke(File ws, VirtualChannel channel) //get the potential directories emerging from the use of GLOB filemask accounted in the splitted file parsing String dirFromFileGLOB = new File(file).getParent(); if(dirFromFileGLOB != null) - baseDirectory = new File(baseDirectory, dirFromFileGLOB.toString()); + baseDirectory = new File(baseDirectory, dirFromFileGLOB); FileInputStream inputStream = new FileInputStream(reportFile); try { XMLStreamReader reader = factory.createXMLStreamReader(inputStream, "UTF-8"); @@ -202,7 +200,7 @@ private RobotSuiteResult getSplitXMLSuite(RobotTestObject parent, File baseDirec } private String ignoreUntilStarts(XMLStreamReader reader, String... elements) throws XMLStreamException { - List elementStack = new ArrayList(); + List elementStack = new ArrayList<>(); while(reader.hasNext()) { reader.next(); if (reader.isStartElement()) { @@ -237,7 +235,7 @@ private boolean isNameInElements(String name, String[] elements) { } private void ignoreUntilEnds(XMLStreamReader reader, String element) throws XMLStreamException { - List elementStack = new ArrayList(); + List elementStack = new ArrayList<>(); while(reader.hasNext()) { reader.next(); if (reader.isStartElement()) { @@ -263,7 +261,10 @@ private void ignoreUntilEnds(XMLStreamReader reader, String element) throws XMLS } private String getSpacesPerNestedLevel(int level) { - StringBuffer spaces = new StringBuffer(); + StringBuilder spaces = new StringBuilder(); + if (level > 0) { + spaces.append("\n"); + } for (int i = 0; i < level; i++) { spaces.append(" "); } @@ -280,71 +281,47 @@ private RobotCaseResult processTest(XMLStreamReader reader, RobotSuiteResult res caseResult.setId(reader.getAttributeValue(null, "id")); //parse test tags caseResult.setDescription(""); - caseResult.addTags(new ArrayList()); - StringBuffer stackTrace = new StringBuffer(); + caseResult.addTags(new ArrayList<>()); + StringBuilder stackTrace = new StringBuilder(); //parse stacktrace - String xmlTag = ignoreUntilStarts(reader, "kw", "doc", "tags", "status"); - if (xmlTag == "kw") { - //get all sequential keywords - int nestedCount = 0; - do { - //get all nested keywords - do { - String kw = reader.getAttributeValue(null, "name"); - stackTrace.append(getSpacesPerNestedLevel(nestedCount) + kw); - xmlTag = ignoreUntilStarts(reader, "kw", "arguments", "status"); - //get arguments of current keyword if any - if (xmlTag == "arguments") { - while (reader.hasNext() && !(reader.isEndElement() && reader.getLocalName() == "arguments")) { - reader.next(); - if (reader.isStartElement() && reader.getLocalName() == "arg") { - reader.next(); //skip arg start - stackTrace.append(" " + reader.getText()); - reader.next(); //skip text - reader.next(); //skip arg end - } - } - xmlTag = ignoreUntilStarts(reader, "kw", "status"); - } - stackTrace.append("\n"); - nestedCount++; - } while (xmlTag == "kw"); - //unroll: after reading a status, the kw must end too - do { - ignoreUntilEnds(reader, "status"); - ignoreUntilEnds(reader, "kw"); - nestedCount--; - //it depends on the next tag: - //- kw: a sequential kw follows - //- status: a. status of previous kw -> unroll further; b. status of test - //- doc||tags: follows last kw (nestedCount must be 0) - xmlTag = ignoreUntilStarts(reader, "kw", "doc", "tags", "status"); - } while (xmlTag == "status" && nestedCount > 0); - } while (xmlTag == "kw"); + String xmlTag = ignoreUntilStarts(reader, "kw", "for", "if", "doc", "tags", "tag", "status"); + while (xmlTag.equals("kw") || xmlTag.equals("for") || xmlTag.equals("if")) { + if (xmlTag.equals("if")) { + stackTrace.append(processIf(reader, 0)); + } else if (xmlTag.equals("for")) { + stackTrace.append(processForLoop(reader, 0)); + } else { + stackTrace.append(processKeyword(reader, 0)); + } + xmlTag = ignoreUntilStarts(reader, "kw", "for", "if", "doc", "tags", "tag", "status"); } - caseResult.setStackTrace(stackTrace.toString()); - if (xmlTag == "doc") { + caseResult.setStackTrace(stackTrace.toString().trim().replaceAll("\n+", "\n")); + + if (xmlTag.equals("doc")) { reader.next(); if (reader.hasText()) { caseResult.setDescription(reader.getText()); } reader.next(); - xmlTag = ignoreUntilStarts(reader, "tags", "status"); + xmlTag = ignoreUntilStarts(reader, "tags", "tag", "status"); } - if (xmlTag == "tags") { + if (xmlTag.equals("tags") || xmlTag.equals("tag")) { caseResult.addTags(processTags(reader)); - ignoreUntilStarts(reader, "status"); + if (!reader.getLocalName().equals("status")) { + ignoreUntilStarts(reader, "status"); + } } //parse test details from nested status caseResult.setPassed("PASS".equals(reader.getAttributeValue(null, "status"))); + caseResult.setSkipped("SKIP".equals(reader.getAttributeValue(null, "status"))); caseResult.setStarttime(reader.getAttributeValue(null, "starttime")); caseResult.setEndtime(reader.getAttributeValue(null, "endtime")); setCriticalityIfAvailable(reader, caseResult); while(reader.hasNext()){ reader.next(); - if(reader.getEventType() == XMLStreamReader.CHARACTERS){ + if(reader.isCharacters()){ String error = reader.getText(); caseResult.setErrorMsg(error); } else if (reader.isEndElement()) { @@ -357,40 +334,176 @@ private RobotCaseResult processTest(XMLStreamReader reader, RobotSuiteResult res } } // reset stack trace if the test is passed - if (caseResult.isPassed()) { + if (caseResult.isPassed() || caseResult.isSkipped()) { caseResult.setStackTrace(""); } ignoreUntilEnds(reader, "test"); return caseResult; } + private String processForLoop(XMLStreamReader reader, int nestedCount) throws XMLStreamException { + StringBuilder stackTrace = new StringBuilder(); + String indentation = getSpacesPerNestedLevel(nestedCount); + stackTrace.append(indentation + "FOR " + reader.getAttributeValue(null, "flavor")); + while (reader.hasNext()) { + if (reader.isEndElement() && reader.getLocalName().equals("for")) { + break; + } + if (reader.isStartElement() && reader.getLocalName().equals("iter")) { + stackTrace.append(processIteration(reader, nestedCount+1)); + } + reader.next(); + } + stackTrace.append(indentation + "END\n"); + return stackTrace.toString(); + } + + private String processIteration(XMLStreamReader reader, int nestedCount) throws XMLStreamException { + StringBuilder stackTrace = new StringBuilder(); + while(reader.hasNext()) { + if (reader.isEndElement() && reader.getLocalName().equals("iter")) { + break; + } + if (reader.isStartElement()) { + String xmlTag = reader.getLocalName(); + if (xmlTag.equals("for")) { + stackTrace.append(processForLoop(reader, nestedCount)); + } + if (xmlTag.equals("kw")) { + stackTrace.append(processKeyword(reader, nestedCount)); + } + if (xmlTag.equals("if")) { + stackTrace.append(processIf(reader, nestedCount)); + } + } + reader.next(); + } + + return stackTrace.toString(); + } + + private String processIf(XMLStreamReader reader, int nestedCount) throws XMLStreamException { + StringBuilder stackTrace = new StringBuilder(); + String indentation = getSpacesPerNestedLevel(nestedCount); + while (reader.hasNext()) { + if (reader.isEndElement() && reader.getLocalName().equals("if")) { + break; + } + if (reader.isStartElement() && reader.getLocalName().equals("branch")) { + stackTrace.append(indentation + reader.getAttributeValue(null, "type")); + stackTrace.append(processBranch(reader, nestedCount+1)); + } + reader.next(); + } + stackTrace.append(indentation + "END\n"); + return stackTrace.toString(); + } + + private String processBranch(XMLStreamReader reader, int nestedCount) throws XMLStreamException { + StringBuilder stackTrace = new StringBuilder(); + while(reader.hasNext()) { + if (reader.isEndElement() && reader.getLocalName().equals("branch")) { + break; + } + if (reader.isStartElement()) { + String xmlTag = reader.getLocalName(); + if (xmlTag.equals("for")) { + stackTrace.append(processForLoop(reader, nestedCount)); + } + if (xmlTag.equals("kw")) { + stackTrace.append(processKeyword(reader, nestedCount)); + } + if (xmlTag.equals("if")) { + stackTrace.append(processIf(reader, nestedCount)); + } + } + reader.next(); + } + return stackTrace.toString(); + } + + private String processKeyword(XMLStreamReader reader, int nestedCount) throws XMLStreamException { + StringBuilder stackTrace = new StringBuilder(); + String kw = reader.getAttributeValue(null, "name"); + String indentation = getSpacesPerNestedLevel(nestedCount); + stackTrace.append(indentation).append(kw); + reader.next(); + while(reader.hasNext()) { + if (reader.isEndElement() && reader.getLocalName().equals("kw")) { + break; + } + if (reader.isStartElement()) { + String xmlTag = reader.getLocalName(); + switch (xmlTag) { + case "arguments": + case "arg": + stackTrace.append(processArgs(reader)); + continue; // processArgs returns with us already in . We don't want to use reader.next() + case "for": + stackTrace.append(processForLoop(reader, nestedCount+1)); + break; + case "kw": + stackTrace.append(processKeyword(reader, nestedCount+1)); + break; + case "if": + stackTrace.append(processIf(reader, nestedCount+1)); + break; + default: + break; + } + } + reader.next(); + } + stackTrace.append("\n"); + return stackTrace.toString(); + } + + private String processArgs(XMLStreamReader reader) throws XMLStreamException { + StringBuilder stringBuilder = new StringBuilder(); + + while(reader.hasNext()) { + if (reader.isEndElement() || reader.isStartElement()) { + String xmlTag = reader.getLocalName(); + if (reader.isEndElement() && xmlTag.equals("arguments") || + reader.isStartElement() && xmlTag.equals("status") || + reader.isStartElement() && xmlTag.equals("kw")) { + break; + } + if (reader.isStartElement() && xmlTag.equals("arg")) { + reader.next(); + stringBuilder.append(" ").append(reader.getText()); + } + } + reader.next(); + } + return stringBuilder.toString(); + } + private List processTags(XMLStreamReader reader) throws XMLStreamException { - List taglist = new ArrayList(); + List tagList = new ArrayList<>(); + while(reader.hasNext()){ - reader.next(); if(reader.isStartElement() && "tag".equals(reader.getLocalName())){ while(reader.hasNext()){ reader.next(); - if(reader.getEventType() == XMLStreamReader.CHARACTERS){ - taglist.add(reader.getText()); + if(reader.isCharacters()){ + tagList.add(reader.getText()); } else if(reader.isEndElement() && "tag".equals(reader.getLocalName())){ break; } } - } else if(reader.isEndElement() && "tags".equals(reader.getLocalName())){ + } else if((reader.isEndElement() && "tags".equals(reader.getLocalName())) || (reader.isStartElement() && "status".equals(reader.getLocalName()))){ break; } + reader.next(); } - return taglist; + return tagList; } private static void setCriticalityIfAvailable(XMLStreamReader reader, RobotCaseResult caseResult) { String criticality = reader.getAttributeValue(null, "critical"); if (criticality != null) { - if(criticality.equals("yes")) - caseResult.setCritical(true); - else - caseResult.setCritical(false); + caseResult.setCritical(criticality.equals("yes")); } } diff --git a/src/main/java/hudson/plugins/robot/RobotPublisher.java b/src/main/java/hudson/plugins/robot/RobotPublisher.java index 51b38015..52995d6e 100755 --- a/src/main/java/hudson/plugins/robot/RobotPublisher.java +++ b/src/main/java/hudson/plugins/robot/RobotPublisher.java @@ -233,7 +233,7 @@ public String getOverwriteXAxisLabel() { */ @Override public Collection getProjectActions(AbstractProject project) { - Collection actions = new ArrayList(); + Collection actions = new ArrayList<>(); RobotProjectAction roboAction = new RobotProjectAction(project); actions.add(roboAction); return actions; diff --git a/src/main/java/hudson/plugins/robot/blueocean/BlueRobotTestResult.java b/src/main/java/hudson/plugins/robot/blueocean/BlueRobotTestResult.java index 8cf4211c..e090b6c0 100644 --- a/src/main/java/hudson/plugins/robot/blueocean/BlueRobotTestResult.java +++ b/src/main/java/hudson/plugins/robot/blueocean/BlueRobotTestResult.java @@ -27,7 +27,9 @@ public String getName() { @Override public Status getStatus() { - return result.isPassed() ? Status.PASSED : Status.FAILED; + if (result.isPassed()) return Status.PASSED; + if (result.isSkipped()) return Status.SKIPPED; + return Status.FAILED; } @Override diff --git a/src/main/java/hudson/plugins/robot/graph/RobotGraphHelper.java b/src/main/java/hudson/plugins/robot/graph/RobotGraphHelper.java index 3f9a5cb3..f502bfac 100644 --- a/src/main/java/hudson/plugins/robot/graph/RobotGraphHelper.java +++ b/src/main/java/hudson/plugins/robot/graph/RobotGraphHelper.java @@ -54,9 +54,9 @@ public static RobotGraph createTestResultsGraphForTestObject(RobotTestObject roo boolean criticalOnly, String labelFormat, int maxBuildsToShow) { - List values = new ArrayList(); - List rows = new ArrayList(); - List columns = new ArrayList(); + List values = new ArrayList<>(); + List rows = new ArrayList<>(); + List columns = new ArrayList<>(); double lowerbound = 0; double upperbound = 0; @@ -67,11 +67,13 @@ public static RobotGraph createTestResultsGraphForTestObject(RobotTestObject roo { Number failed = !criticalOnly ? testObject.getFailed() : testObject.getCriticalFailed(); Number passed = 0; + Number skipped = 0; int compareLowerBoundTo; if ( failedOnly) { compareLowerBoundTo = failed.intValue(); } else { passed = !criticalOnly ? testObject.getPassed() : testObject.getCriticalPassed(); + skipped = testObject.getSkipped(); compareLowerBoundTo = passed.intValue(); } @@ -92,6 +94,10 @@ public static RobotGraph createTestResultsGraphForTestObject(RobotTestObject roo values.add(failed); rows.add(Messages.robot_trendgraph_failed()); columns.add(label); + + values.add(skipped); + rows.add(Messages.robot_trendgraph_skipped()); + columns.add(label); } if(significantData){ @@ -100,7 +106,7 @@ public static RobotGraph createTestResultsGraphForTestObject(RobotTestObject roo } int graphScale = hd ? 3 : 1; return RobotGraph.getRobotGraph(rootObject.getOwner(), createSortedDataset(values, rows, columns), Messages.robot_trendgraph_testcases(), - Messages.robot_trendgraph_builds(), graphScale, false, binarydata, lowerbound, upperbound, Color.green, Color.red); + Messages.robot_trendgraph_builds(), graphScale, false, binarydata, lowerbound, upperbound, Color.orange, Color.green, Color.red); } /** @@ -118,8 +124,8 @@ public static RobotGraph createDurationGraphForTestObject(RobotTestObject rootOb int scale = 1; int buildsLeftToShow = maxBuildsToShow > 0? maxBuildsToShow: -1; - List labels = new ArrayList(); - List durations = new ArrayList(); + List labels = new ArrayList<>(); + List durations = new ArrayList<>(); for (RobotTestObject testObject = rootObject; testObject != null && buildsLeftToShow != 0; @@ -144,8 +150,8 @@ private static CategoryDataset createSortedDataset(List values, List rowSet = new TreeSet(rows); - TreeSet colSet = new TreeSet(columns); + TreeSet rowSet = new TreeSet<>(rows); + TreeSet colSet = new TreeSet<>(columns); Comparable[] _rows = rowSet.toArray(new Comparable[rowSet.size()]); Comparable[] _cols = colSet.toArray(new Comparable[colSet.size()]); diff --git a/src/main/java/hudson/plugins/robot/model/RobotCaseResult.java b/src/main/java/hudson/plugins/robot/model/RobotCaseResult.java index eb70b5f1..493d5d91 100644 --- a/src/main/java/hudson/plugins/robot/model/RobotCaseResult.java +++ b/src/main/java/hudson/plugins/robot/model/RobotCaseResult.java @@ -40,6 +40,7 @@ public class RobotCaseResult extends RobotTestObject{ private static final Logger LOGGER = Logger.getLogger(RobotCaseResult.class.getName()); private boolean passed; + private boolean skipped; private boolean critical; private String errorMsg; private String name; @@ -156,6 +157,10 @@ public void setPassed(boolean passed) { this.passed = passed; } + public void setSkipped(boolean skipped) { + this.skipped = skipped; + } + public void setCritical(boolean critical) { this.critical = critical; } @@ -172,13 +177,17 @@ public boolean isPassed() { return passed; } + public boolean isSkipped() { + return skipped; + } + public boolean isCritical() { return critical; } public List getTags(){ if(tags == null) - return new ArrayList(); + return new ArrayList<>(); return tags; } @@ -187,7 +196,7 @@ public String getCommaSeparatedTags(){ if (tags.size()==0) return ""; else { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (String tag: tags) buf.append(tag+", "); String result = buf.toString(); @@ -197,7 +206,7 @@ public String getCommaSeparatedTags(){ public void addTags(List taglist){ if(tags == null) - tags = new ArrayList(); + tags = new ArrayList<>(); tags.addAll(taglist); } @@ -206,7 +215,7 @@ public void addTags(List taglist){ * @return number of build */ public int getFailedSince(){ - if (failedSince == 0 && !isPassed()) { + if (failedSince == 0 && (!isPassed() && !isSkipped())) { RobotCaseResult previous = getPreviousResult(); if(previous != null && !previous.isPassed()) this.failedSince = previous.getFailedSince(); @@ -276,7 +285,7 @@ public void doGraph(StaplerRequest req, StaplerResponse rsp) @Override public int getFailed() { - if(isPassed()) return 0; + if(isPassed() || isSkipped()) return 0; return 1; } @@ -286,9 +295,15 @@ public int getPassed() { return 0; } + @Override + public int getSkipped() { + if (isSkipped()) return 1; + return 0; + } + @Override public long getCriticalFailed() { - if(!isPassed() && isCritical()) return 1; + if((!isPassed() && !isSkipped()) && isCritical()) return 1; return 0; } diff --git a/src/main/java/hudson/plugins/robot/model/RobotResult.java b/src/main/java/hudson/plugins/robot/model/RobotResult.java index a5ea690a..b013faf4 100755 --- a/src/main/java/hudson/plugins/robot/model/RobotResult.java +++ b/src/main/java/hudson/plugins/robot/model/RobotResult.java @@ -50,7 +50,7 @@ public class RobotResult extends RobotTestObject { private String timeStamp; - private transient int passed, failed, criticalPassed, criticalFailed; + private transient int passed, failed, skipped, criticalPassed, criticalFailed; //backwards compatibility with old builds private transient List overallStats; @@ -136,13 +136,24 @@ public long getOverallFailed(){ return overallStats.get(1).getFail(); } + /** + * Get number of all skipped tests. + * @return number of all skipped tests + */ + @Exported + public long getOverallSkipped(){ + if(overallStats == null) return skipped; + if(overallStats.isEmpty()) return 0; + return overallStats.get(1).getSkip(); + } + /** * Get number of all tests. * @return number of all tests */ @Exported public long getOverallTotal(){ - if(overallStats == null) return failed + passed; + if(overallStats == null) return failed + passed + skipped; if(overallStats.isEmpty()) return 0; return overallStats.get(1).getTotal(); } @@ -188,7 +199,8 @@ public double getPassPercentage(boolean onlyCritical) { total = getCriticalTotal(); } else { passed = getOverallPassed(); - total = getOverallTotal(); + // Skipped tests don't count towards pass percentage + total = getOverallTotal() - getOverallSkipped(); } if(total == 0) return 100; @@ -202,6 +214,12 @@ public double getPassPercentage(){ return getPassPercentage(false); } + @Exported + public double getSkipPercentage() { + double percentage = (double) getSkipped() / getOverallTotal() * 100; + return roundToDecimals(percentage, 1); + } + private static double roundToDecimals(double value, int decimals){ BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(decimals, BigDecimal.ROUND_DOWN); @@ -238,7 +256,7 @@ public RobotSuiteResult getSuite(String name) { */ public void addSuite(RobotSuiteResult suite){ if(suites == null) - this.suites = new HashMap(); + this.suites = new HashMap<>(); int i = 1; String originalName = suite.getName(); String checkedSuiteName = originalName; @@ -262,10 +280,10 @@ public Collection getSuites(){ @Exported public List getExecutedSuites() { - List executedSuites = new ArrayList(); + List executedSuites = new ArrayList<>(); for (RobotSuiteResult robotSuiteResult : this.getAllSuites()) { RobotTestObject rto = robotSuiteResult.getParent(); - String name = robotSuiteResult.getName(); + String name = robotSuiteResult.getName(); while (rto != null && !rto.getName().isEmpty()) { name = rto.getName()+"."+name; rto = rto.getParent(); @@ -281,7 +299,7 @@ public List getExecutedSuites() { * @return List of suiteresults */ public List getAllSuites(){ - List allSuites = new ArrayList(); + List allSuites = new ArrayList<>(); for(RobotSuiteResult suite : getSuites()){ allSuites.add(suite); List childSuites = suite.getAllChildSuites(); @@ -295,7 +313,7 @@ public List getAllSuites(){ * @return list of test case results */ public List getAllFailedCases(){ - List allFailedCases = new ArrayList(); + List allFailedCases = new ArrayList<>(); for(RobotSuiteResult suite : getSuites()){ List failedCases = suite.getAllFailedCases(); allFailedCases.addAll(failedCases); @@ -306,7 +324,7 @@ public List getAllFailedCases(){ @Exported public List getFailedCases() { - List failedCases = new ArrayList(); + List failedCases = new ArrayList<>(); for (RobotCaseResult robotCaseResult : this.getAllFailedCases()) { RobotTestObject rto = robotCaseResult.getParent(); String name = robotCaseResult.getName(); @@ -327,17 +345,19 @@ public void tally(RobotBuildAction robotBuildAction){ setParentAction(robotBuildAction); failed = 0; passed = 0; + skipped = 0; criticalPassed = 0; criticalFailed = 0; duration = 0; Collection newSuites = getSuites(); - HashMap newMap = new HashMap(newSuites.size()); + HashMap newMap = new HashMap<>(newSuites.size()); for (RobotSuiteResult suite : newSuites) { suite.tally(robotBuildAction); failed += suite.getFailed(); passed += suite.getPassed(); + skipped += suite.getSkipped(); criticalFailed += suite.getCriticalFailed(); criticalPassed += suite.getCriticalPassed(); duration += suite.getDuration(); @@ -425,6 +445,11 @@ public int getPassed() { return (int) getOverallPassed(); } + @Override + public int getSkipped() { + return (int)getOverallSkipped(); + } + public Api getApi() { return new Api(this); } public List getAllCases() { diff --git a/src/main/java/hudson/plugins/robot/model/RobotResultStatistics.java b/src/main/java/hudson/plugins/robot/model/RobotResultStatistics.java index 08b3b044..43778158 100755 --- a/src/main/java/hudson/plugins/robot/model/RobotResultStatistics.java +++ b/src/main/java/hudson/plugins/robot/model/RobotResultStatistics.java @@ -27,6 +27,7 @@ public class RobotResultStatistics implements Serializable { private long pass; private long fail; + private long skip; //backwards compatibility with old builds private transient String name; @@ -47,7 +48,15 @@ public void setFail(long fail) { this.fail = fail; } + public long getSkip() { + return skip; + } + + public void setSkip(long skip) { + this.skip = skip; + } + public long getTotal(){ - return fail + pass; + return fail + pass + skip; } } diff --git a/src/main/java/hudson/plugins/robot/model/RobotSuiteResult.java b/src/main/java/hudson/plugins/robot/model/RobotSuiteResult.java index 9664ae12..7cd17a8f 100644 --- a/src/main/java/hudson/plugins/robot/model/RobotSuiteResult.java +++ b/src/main/java/hudson/plugins/robot/model/RobotSuiteResult.java @@ -45,6 +45,7 @@ public class RobotSuiteResult extends RobotTestObject { private String endTime; private transient int failed; private transient int passed; + private transient int skipped; private transient int criticalPassed; private transient int criticalFailed; @@ -56,7 +57,7 @@ public class RobotSuiteResult extends RobotTestObject { */ public void addChild(RobotSuiteResult child) { if(children == null) - this.children = new HashMap(); + this.children = new HashMap<>(); int i = 1; String originalName = child.getName(); String checkedSuiteName = originalName; @@ -143,12 +144,16 @@ public int getPassed() { return passed; } + public int getSkipped() { + return skipped; + } + /** * Get number of all tests * @return number of all tests */ public int getTotal() { - return passed + failed; + return passed + failed + skipped; } /** @@ -182,7 +187,7 @@ public int getCriticalTotal() { */ public void addCaseResult(RobotCaseResult caseResult) { if(caseResults == null) - this.caseResults = new HashMap(); + this.caseResults = new HashMap<>(); int i = 1; String originalName = caseResult.getName(); String checkedTestName = originalName; @@ -294,7 +299,7 @@ public Object getDynamic(String token, StaplerRequest req, * @return all children of this suite */ public List getAllChildSuites() { - List allChildSuites = new ArrayList(); + List allChildSuites = new ArrayList<>(); for (RobotSuiteResult suite : getChildSuites()) { allChildSuites.add(suite); List childSuites = suite.getAllChildSuites(); @@ -309,9 +314,9 @@ public List getAllChildSuites() { * @return all failed cases in this suite and its child suites */ public List getAllFailedCases() { - List failedCases = new ArrayList(); + List failedCases = new ArrayList<>(); for(RobotCaseResult caseResult : getCaseResults()){ - if(!caseResult.isPassed()) failedCases.add(caseResult); + if(!caseResult.isPassed() && !caseResult.isSkipped()) failedCases.add(caseResult); } for(RobotSuiteResult suite : getChildSuites()){ failedCases.addAll(suite.getAllFailedCases()); @@ -325,7 +330,7 @@ public List getAllFailedCases() { * @return all cases in this suite and its child suites */ public List getAllCases() { - List cases = new ArrayList(); + List cases = new ArrayList<>(); cases.addAll(getCaseResults()); for(RobotSuiteResult suite : getChildSuites()){ cases.addAll(suite.getAllCases()); @@ -349,15 +354,18 @@ public void tally(RobotBuildAction parentAction) { setParentAction(parentAction); failed = 0; passed = 0; + skipped = 0; criticalPassed = 0; criticalFailed = 0; duration = 0; - HashMap newCases = new HashMap(); + HashMap newCases = new HashMap<>(); for(RobotCaseResult caseResult : getCaseResults()) { if(caseResult.isPassed()) { if(caseResult.isCritical()) criticalPassed++; passed++; + } else if(caseResult.isSkipped()) { + skipped++; } else { if(caseResult.isCritical()) criticalFailed++; failed++; @@ -368,11 +376,12 @@ public void tally(RobotBuildAction parentAction) { } caseResults = newCases; - HashMap newSuites = new HashMap(); + HashMap newSuites = new HashMap<>(); for (RobotSuiteResult suite : getChildSuites()) { suite.tally(parentAction); failed += suite.getFailed(); passed += suite.getPassed(); + skipped += suite.getSkipped(); criticalFailed += suite.getCriticalFailed(); criticalPassed += suite.getCriticalPassed(); duration += suite.getDuration(); @@ -413,9 +422,7 @@ public void addChildren(Collection childSuites) { */ public void addCaseResults(Collection newCaseResults) { for(RobotCaseResult caseResult : newCaseResults){ - if(caseResults.get(caseResult.getDuplicateSafeName()) == null){ - caseResults.put(caseResult.getDuplicateSafeName(), caseResult); - } + caseResults.putIfAbsent(caseResult.getDuplicateSafeName(), caseResult); } } } diff --git a/src/main/java/hudson/plugins/robot/model/RobotTestObject.java b/src/main/java/hudson/plugins/robot/model/RobotTestObject.java index 28270ca9..f0754ffc 100644 --- a/src/main/java/hudson/plugins/robot/model/RobotTestObject.java +++ b/src/main/java/hudson/plugins/robot/model/RobotTestObject.java @@ -240,6 +240,8 @@ public String getDurationDiff(RobotTestObject comparable){ public abstract int getPassed(); + public abstract int getSkipped(); + public abstract long getCriticalPassed(); public abstract long getCriticalFailed(); diff --git a/src/main/java/hudson/plugins/robot/view/RobotListViewColumn.java b/src/main/java/hudson/plugins/robot/view/RobotListViewColumn.java index e255754a..1e494676 100644 --- a/src/main/java/hudson/plugins/robot/view/RobotListViewColumn.java +++ b/src/main/java/hudson/plugins/robot/view/RobotListViewColumn.java @@ -27,30 +27,33 @@ public String getColumnCaption() { public long getPass(Item job){ RobotResult lastRobotResult = getLastRobotResult(job); - if(lastRobotResult != null){ - return lastRobotResult.getOverallPassed(); - } - return 0; + return lastRobotResult != null ? lastRobotResult.getOverallPassed() : 0; } public long getTotal(Item job){ RobotResult lastRobotResult = getLastRobotResult(job); - if(lastRobotResult != null){ - return lastRobotResult.getOverallTotal(); - } - return 0; + return lastRobotResult != null ? lastRobotResult.getOverallTotal() : 0; + } + + public long getSkipped(Item job) { + RobotResult lastRobotResult = getLastRobotResult(job); + return lastRobotResult != null ? lastRobotResult.getOverallSkipped() : 0; } public double getPassPercent(Item job) { RobotResult lastRobotResult = getLastRobotResult(job); - if (lastRobotResult==null) return 100; - return lastRobotResult.getPassPercentage(); + return lastRobotResult != null ? lastRobotResult.getPassPercentage() : 100; + } + + public double getSkipPercent(Item job) { + RobotResult lastRobotResult = getLastRobotResult(job); + return lastRobotResult != null ? lastRobotResult.getSkipPercentage() : 0; } public String getRobotPath(Item job) { if (job instanceof Job) { Run build = ((Job)job).getLastCompletedBuild(); - int lastBuildNr = build==null? 1 : build.number; + int lastBuildNr = build == null ? 1 : build.number; return job.getShortUrl() + lastBuildNr+ "/robot/"; } return null; diff --git a/src/main/resources/hudson/plugins/robot/Messages.properties b/src/main/resources/hudson/plugins/robot/Messages.properties index f36f9579..78564906 100644 --- a/src/main/resources/hudson/plugins/robot/Messages.properties +++ b/src/main/resources/hudson/plugins/robot/Messages.properties @@ -27,5 +27,6 @@ robot.config.percentvalidation=Entry must be percentage value between 0-100 robot.trendgraph.passed=Passed robot.trendgraph.failed=Failed +robot.trendgraph.skipped=Skipped robot.trendgraph.testcases=Number of test cases robot.trendgraph.builds=Build diff --git a/src/main/resources/hudson/plugins/robot/model/RobotCaseResult/index.jelly b/src/main/resources/hudson/plugins/robot/model/RobotCaseResult/index.jelly index 8bb14ff7..aa7ec510 100644 --- a/src/main/resources/hudson/plugins/robot/model/RobotCaseResult/index.jelly +++ b/src/main/resources/hudson/plugins/robot/model/RobotCaseResult/index.jelly @@ -25,6 +25,9 @@ limitations under the License. + + + diff --git a/src/main/resources/hudson/plugins/robot/model/RobotResult/index.jelly b/src/main/resources/hudson/plugins/robot/model/RobotResult/index.jelly index b8c30978..f501a9b2 100644 --- a/src/main/resources/hudson/plugins/robot/model/RobotResult/index.jelly +++ b/src/main/resources/hudson/plugins/robot/model/RobotResult/index.jelly @@ -43,8 +43,8 @@ limitations under the License. Executed:${it.timeStamp} Duration:${it.humanReadableDuration} (${it.getDurationDiff(prevresult)}) - Status:${it.criticalTotal} critical test, ${it.criticalPassed} passed, ${it.criticalFailed} failed
- ${it.overallTotal} test total (${h.getDiffString(it.total - prevresult.total)}), ${it.passed} passed, ${it.failed} failed + Status:${it.criticalTotal} critical test, ${it.criticalPassed} passed, ${it.criticalFailed} failed, 0 skipped
+ ${it.overallTotal} test total (${h.getDiffString(it.total - prevresult.total)}), ${it.passed} passed, ${it.failed} failed, ${it.skipped} skipped Results:
${it.reportFile}
${it.logFile}
diff --git a/src/main/resources/hudson/plugins/robot/model/RobotSuiteResult/index.jelly b/src/main/resources/hudson/plugins/robot/model/RobotSuiteResult/index.jelly index 25981668..785422c9 100644 --- a/src/main/resources/hudson/plugins/robot/model/RobotSuiteResult/index.jelly +++ b/src/main/resources/hudson/plugins/robot/model/RobotSuiteResult/index.jelly @@ -43,8 +43,8 @@ limitations under the License. TEST SUITE:${it.name} Description:${it.description} Duration:${it.humanReadableDuration} (${it.getDurationDiff(prevresult)}) - Status:${it.criticalTotal} critical test, ${it.criticalPassed} passed, ${it.criticalFailed} failed
- ${it.total} test total (${h.getDiffString(it.total - prevresult.total)}), ${it.passed} passed, ${it.failed} failed + Status:${it.criticalTotal} critical test, ${it.criticalPassed} passed, ${it.criticalFailed} failed, 0 skipped
+ ${it.total} test total (${h.getDiffString(it.total - prevresult.total)}), ${it.passed} passed, ${it.failed} failed, ${it.skipped} skipped Report File:${it.reportFile} @@ -92,6 +92,9 @@ limitations under the License. + + + @@ -100,7 +103,7 @@ limitations under the License. ${case.name} yesno - PASSFAIL + ${status} ${case.humanReadableDuration}(${case.getDurationDiff(prevcase)}) diff --git a/src/main/resources/hudson/plugins/robot/model/RobotTestObject/robotcss.jelly b/src/main/resources/hudson/plugins/robot/model/RobotTestObject/robotcss.jelly index 2fd1bbe2..8be77ea3 100644 --- a/src/main/resources/hudson/plugins/robot/model/RobotTestObject/robotcss.jelly +++ b/src/main/resources/hudson/plugins/robot/model/RobotTestObject/robotcss.jelly @@ -31,6 +31,9 @@ div.passfail p { .FAIL { color: #c00; } +.SKIP { + color: #fc0; +} span.FAIL { font-weight: bold; } diff --git a/src/main/resources/hudson/plugins/robot/util/robotsummary.jelly b/src/main/resources/hudson/plugins/robot/util/robotsummary.jelly index 02bcaed3..c0439ca2 100644 --- a/src/main/resources/hudson/plugins/robot/util/robotsummary.jelly +++ b/src/main/resources/hudson/plugins/robot/util/robotsummary.jelly @@ -48,6 +48,7 @@ limitations under the License. Total Failed Passed + Skipped Pass % @@ -61,6 +62,7 @@ limitations under the License. ${attrs.action.result.criticalFailed} ${attrs.action.result.criticalPassed} + 0 ${attrs.action.criticalPassPercentage} @@ -74,6 +76,7 @@ limitations under the License. ${attrs.action.result.overallFailed} ${attrs.action.result.overallPassed} + ${attrs.action.result.overallSkipped} ${attrs.action.overallPassPercentage} diff --git a/src/main/resources/hudson/plugins/robot/view/RobotListViewColumn/column.jelly b/src/main/resources/hudson/plugins/robot/view/RobotListViewColumn/column.jelly index af4d0300..8463c3bf 100644 --- a/src/main/resources/hudson/plugins/robot/view/RobotListViewColumn/column.jelly +++ b/src/main/resources/hudson/plugins/robot/view/RobotListViewColumn/column.jelly @@ -24,13 +24,32 @@ THE SOFTWARE. --> +

diff --git a/src/test/java/hudson/plugins/robot/RobotParserTest.java b/src/test/java/hudson/plugins/robot/RobotParserTest.java index 36f5c743..5c358caa 100644 --- a/src/test/java/hudson/plugins/robot/RobotParserTest.java +++ b/src/test/java/hudson/plugins/robot/RobotParserTest.java @@ -163,4 +163,26 @@ public void testNested2() { final String mask = "nested_output2.xml"; parse(dir, mask); } + + @Test + public void testRobot4() { + final String dir = "."; + final String mask = "robot4_output.xml"; + parse(dir, mask); + } + + @Test + public void testRobot4Nested() { + final String dir = "."; + final String mask = "robot4_nested_output.xml"; + parse(dir, mask); + } + + @Test + public void testRobot4If() { + final String dir = "."; + final String mask = "robot4_if_output.xml"; + parse(dir, mask); + + } } diff --git a/src/test/java/hudson/plugins/robot/RobotPublisherSystemTest.java b/src/test/java/hudson/plugins/robot/RobotPublisherSystemTest.java index af983b6b..3e8fd168 100644 --- a/src/test/java/hudson/plugins/robot/RobotPublisherSystemTest.java +++ b/src/test/java/hudson/plugins/robot/RobotPublisherSystemTest.java @@ -193,7 +193,7 @@ public void testOldActionViewsWithData() throws Exception { WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//img[@id='passfailgraph']"); WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//a[@href='/jenkins/job/oldrobotbuild/1/robot' and contains(text(),'Browse results')]"); - this.verifyTotalsTable(page, 8, 4, "50.0", 8, 4, "50.0"); + this.verifyTotalsTable(page, 8, 4, 0, "50.0", 8, 4, "50.0"); page = wc.goTo("job/oldrobotbuild/robot/"); WebAssert.assertTitleEquals(page, "Testcases & Othercases Test Report"); @@ -204,7 +204,7 @@ public void testOldActionViewsWithData() throws Exception { WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//h4[contains(.,'Robot Test Summary:')]"); WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//a[@href='/jenkins/job/oldrobotbuild/1/robot' and contains(text(),'Browse results')]"); - this.verifyTotalsTable(page, 8, 4, "50.0", 8, 4, "50.0"); + this.verifyTotalsTable(page, 8, 4, 0,"50.0", 8, 4, "50.0"); page = wc.goTo("job/oldrobotbuild/1/robot/"); WebAssert.assertTitleEquals(page, "Testcases & Othercases Test Report"); @@ -225,7 +225,7 @@ public void testSummariesWithData() throws Exception { "//div[@id='main-panel']//a[@href='/jenkins/job/robot/1/robot/report/report.html' and contains(text(), 'Open report.html')]"); WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//a[@href='/jenkins/job/robot/1/robot/report/log.html' and contains(text(), 'Open log.html')]"); - verifyTotalsTable(page, 8, 4, "50.0", 8, 4, "50.0"); + verifyTotalsTable(page, 8, 4, 0,"50.0", 8, 4, "50.0"); page = wc.goTo("job/robot/1/"); WebAssert.assertElementPresentByXPath(page, "//div[@id='tasks']//a[@href='/jenkins/job/robot/1/robot']"); @@ -236,7 +236,7 @@ public void testSummariesWithData() throws Exception { "//div[@id='main-panel']//a[@href='/jenkins/job/robot/1/robot/report/report.html' and contains(text(), 'Open report.html')]"); WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//a[@href='/jenkins/job/robot/1/robot/report/log.html' and contains(text(), 'Open log.html')]"); - verifyTotalsTable(page, 8, 4, "50.0", 8, 4, "50.0"); + verifyTotalsTable(page, 8, 4, 0,"50.0", 8, 4, "50.0"); } @LocalData @@ -254,7 +254,7 @@ public void testSummariesWithVariablesInFileNames() throws Exception { "//div[@id='main-panel']//a[@href='/jenkins/job/files-with-env-vars/1/robot/report/report_1.html' and contains(text(), 'Open report_1.html')]"); WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//a[@href='/jenkins/job/files-with-env-vars/1/robot/report/log_1.html' and contains(text(), 'Open log_1.html')]"); - verifyTotalsTable(page, 6, 1, "83.3", 6, 1, "83.3"); + verifyTotalsTable(page, 6, 1, 0,"83.3", 6, 1, "83.3"); page = wc.goTo("job/files-with-env-vars/1/"); WebAssert.assertElementPresentByXPath(page, "//div[@id='tasks']//a[@href='/jenkins/job/files-with-env-vars/1/robot']"); @@ -265,7 +265,7 @@ public void testSummariesWithVariablesInFileNames() throws Exception { "//div[@id='main-panel']//a[@href='/jenkins/job/files-with-env-vars/1/robot/report/report_1.html' and contains(text(), 'Open report_1.html')]"); WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//a[@href='/jenkins/job/files-with-env-vars/1/robot/report/log_1.html' and contains(text(), 'Open log_1.html')]"); - verifyTotalsTable(page, 6, 1, "83.3", 6, 1, "83.3"); + verifyTotalsTable(page, 6, 1, 0,"83.3", 6, 1, "83.3"); } @LocalData @@ -273,7 +273,7 @@ public void testSummariesWithVariablesInFileNames() throws Exception { public void testRobot29Outputs() throws Exception { WebClient wc = this.executeJobAndGetWebClient("robot29output"); HtmlPage page = wc.goTo("job/robot29output/"); - verifyTotalsTable(page, 1, 0, "100.0", 1, 0, "100.0"); + verifyTotalsTable(page, 1, 0, 0,"100.0", 1, 0, "100.0"); } @LocalData @@ -292,7 +292,7 @@ public void testCombinedOutputs() throws Exception { "//div[@id='main-panel']//a[@href='/jenkins/job/several-outputs/1/robot/report/**/report.html' and contains(text(), 'Open **/report.html')]"); WebAssert.assertElementPresentByXPath(page, "//div[@id='main-panel']//a[@href='/jenkins/job/several-outputs/1/robot/report/**/log.html' and contains(text(), 'Open **/log.html')]"); - verifyTotalsTable(page, 2, 0, "100.0", 2, 0, "100.0"); + verifyTotalsTable(page, 2, 0, 0,"100.0", 2, 0, "100.0"); } @LocalData @@ -472,18 +472,20 @@ private Project getProject(String projectName) { return testProject; } - private void verifyTotalsTable(HtmlPage page, int totalTests, int totalFailed, String totalPercents, + private void verifyTotalsTable(HtmlPage page, int totalTests, int totalFailed, int totalSkipped, String totalPercents, int totalCritical, int criticalFailed, String criticalPercents) { HtmlTable table = page.getHtmlElementById("robot-summary-table"); - String expectedTable = "TotalFailedPassedPass%Criticaltests" - + totalCritical + "" + criticalFailed - + "" + (totalCritical - totalFailed) - + "" + criticalPercents - + "Alltests" + totalTests - + "" + totalFailed - + "" + (totalTests - totalFailed) + "" + totalPercents - + ""; + String expectedTable = "TotalFailedPassedSkippedPass%Criticaltests" + + "" + totalCritical + "" + + "" + criticalFailed + "" + + "" + (totalCritical - totalFailed) + "" + + "0" + + "" + criticalPercents + "" + + "Alltests" + totalTests + "" + + "" + totalFailed + "" + + "" + (totalTests - totalFailed) + "" + + "" + totalSkipped + "" + + "" + totalPercents + ""; assertTrue(table.asXml().replaceAll("\\s", "").contains(expectedTable)); } diff --git a/src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultForRobot4Test.java b/src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultForRobot4Test.java new file mode 100644 index 00000000..3d678f99 --- /dev/null +++ b/src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultForRobot4Test.java @@ -0,0 +1,104 @@ +package hudson.plugins.robot.blueocean; + +import static org.junit.Assert.assertEquals; +import hudson.model.FreeStyleBuild; +import hudson.plugins.robot.RobotBuildAction; +import hudson.plugins.robot.RobotParser; +import hudson.plugins.robot.model.RobotResult; +import io.jenkins.blueocean.rest.Reachable; +import io.jenkins.blueocean.rest.factory.BlueTestResultFactory.Result; +import io.jenkins.blueocean.rest.hal.Link; +import io.jenkins.blueocean.rest.model.BlueTestResult; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +public class BlueRobotTestResultForRobot4Test { + private RobotResult result; + private FreeStyleBuild mockBuild; + private RobotBuildAction mockAction; + private Reachable mockReachable; + + @Before + public void setUp() throws Exception { + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("blue_skip.xml", null, null); + result = remoteOperation.invoke(new File(BlueRobotTestResultTest.class.getResource("blue_skip.xml").toURI()).getParentFile(), null); + result.tally(null); + + mockBuild = mock(FreeStyleBuild.class); + mockAction = mock(RobotBuildAction.class); + mockReachable = mock(Reachable.class); + doReturn(mockAction).when(mockBuild).getAction(RobotBuildAction.class); + doReturn(result.getAllCases()).when(mockAction).getAllTests(); + doReturn(new Link("/")).when(mockReachable).getLink(); + } + + @Test + public void testSimpleStacktrace(){ + BlueTestResult result = getResult("Test 8 Will Always Fail"); + assertEquals("Fail", result.getErrorStackTrace()); + } + + @Test + public void testStacktraceWithArguments(){ + BlueTestResult result = getResult("Test 9 Will Always Fail"); + assertEquals("Fail Optional failure message", result.getErrorStackTrace()); + } + + @Test + public void testStacktraceIsEmpty(){ + BlueTestResult result; + for(String testCase : Arrays.asList("Test 1 Will Always Pass", + "Test 2 Will Always Pass", + "Test 3 Will Always Pass", + "Test 4 Will Always Pass But Is Skipped", + "Test 5 Will Always Fail But Is Skipped", + "Test 6 Will Always Fail But Is Skipped", + "Test 7 Will Always Fail But Is Skipped", + "Test 10 Will Always Fail But Is Skipped On Failure", + "Test 11 Will Always Fail But Is Skipped On Failure", + "Test 12 Will Always Pass But Is Skipped On Failure")){ + result = getResult(testCase); + assertEquals("", result.getErrorStackTrace()); + } + } + + @Test + public void testForLoopStackTrace() throws Exception { + BlueTestResult result = getResult("For Loop Failure"); + String helper = "FOR IN RANGE\n Log ${x}\n Nested Keyword ${x}\n Log ${arg}\n Run Keyword If ${x}==1 Fail\n" + + " Log ${x}\n Nested Keyword ${x}\n Log ${arg}\n Run Keyword If ${x}==1 Fail\n Fail\nEND"; + assertEquals(helper, result.getErrorStackTrace()); + } + + @Test + public void testIfElseStackTrace() throws Exception { + BlueTestResult result = getResult("If Else Failure"); + String helper = "Set Variable mikki hiiri\nIF\n Fail\nELSE\n Nested Keyword ${var}\n Log ${arg}\n Fail ${var}\nEND"; + assertEquals(helper, result.getErrorStackTrace()); + } + + @Test + public void testIfFailure() throws Exception { + BlueTestResult result = getResult("If Failure"); + String helper = "Set Variable mikki hiiri\nIF\n Nested Keyword ${var}\n Log ${arg}\n Fail\nEND"; + assertEquals(helper, result.getErrorStackTrace()); + } + + private BlueTestResult getResult(String filterCondition){ + BlueRobotTestResult.FactoryImpl factory = new BlueRobotTestResult.FactoryImpl(); + Result blueResult = factory.getBlueTestResults(mockBuild, mockReachable); + return StreamSupport.stream(blueResult.results.spliterator(), false) + .filter(element -> element.getName().equals(filterCondition)) + .collect(Collectors.toList()).get(0); + } + + +} diff --git a/src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultTest.java b/src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultTest.java index 49860464..8fb9af88 100644 --- a/src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultTest.java +++ b/src/test/java/hudson/plugins/robot/blueocean/BlueRobotTestResultTest.java @@ -5,6 +5,8 @@ import static org.mockito.Mockito.mock; import java.io.File; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.junit.Before; import org.junit.Test; @@ -38,39 +40,46 @@ public void setUp() throws Exception { doReturn(result.getAllCases()).when(mockAction).getAllTests(); doReturn(new Link("/")).when(mockReachable).getLink(); } - + + @Test + public void testSimpleTrace() { + BlueTestResult result = getResult("Failed Test"); + assertEquals("Fail This fails!", result.getErrorStackTrace()); + assertEquals("This fails!", result.getErrorDetails()); + } + + @Test + public void testNestedTrace(){ + BlueTestResult result = getResult("Nested failed test"); + assertEquals("My failed Keyword\n The real failed keyword\n Fail Really fails!", result.getErrorStackTrace()); + assertEquals("Really fails!", result.getErrorDetails()); + } + @Test - public void testBasic() { + public void testNestedNotFirst() { + BlueTestResult result = getResult("Nested with not first"); + String helper = "Should Be Equal ${MESSAGE} Hello, world!\nShould Be Equal ${MESSAGE} Hello, world!\n" + + "My failed Keyword\n The real failed keyword\n Fail Really fails!"; + assertEquals(helper, result.getErrorStackTrace()); + assertEquals("Really fails!", result.getErrorDetails()); + } + + @Test + public void testEmptyMessage(){ + BlueTestResult result1 = getResult("Another Test"); + BlueTestResult result2 = getResult("My Test"); + + assertEquals("", result1.getErrorStackTrace()); + assertEquals("", result1.getErrorDetails()); + assertEquals("", result2.getErrorStackTrace()); + assertEquals("", result2.getErrorDetails()); + } + + private BlueTestResult getResult(String filterCondition){ BlueRobotTestResult.FactoryImpl factory = new BlueRobotTestResult.FactoryImpl(); Result blueResult = factory.getBlueTestResults(mockBuild, mockReachable); - for (BlueTestResult tempResult : blueResult.results) { - String name = tempResult.getName(); - String trace = tempResult.getErrorStackTrace(); - String msg = tempResult.getErrorDetails(); - switch (name) { - case "Failed Test": - assertEquals("Fail This fails!\n", trace); - assertEquals("This fails!", msg); - break; - case "Nested failed test": - assertEquals("My failed Keyword\n The real failed keyword\n Fail Really fails!\n", trace); - assertEquals("Really fails!", msg); - break; - case "Nested with not first": - String helper = "Should Be Equal ${MESSAGE} Hello, world!\nShould Be Equal ${MESSAGE} Hello, world!\n" + - "My failed Keyword\n The real failed keyword\n Fail Really fails!\n"; - assertEquals(helper, trace); - assertEquals("Really fails!", msg); - break; - case "Another Test": - assertEquals("", trace); - assertEquals("", msg); - break; - case "My Test": - assertEquals("", trace); - assertEquals("", msg); - break; - } - } + return StreamSupport.stream(blueResult.results.spliterator(), false) + .filter(element -> element.getName().equals(filterCondition)) + .collect(Collectors.toList()).get(0); } } diff --git a/src/test/java/hudson/plugins/robot/model/RobotResultTest.java b/src/test/java/hudson/plugins/robot/model/RobotResultTest.java index a98792f1..da5a1e82 100644 --- a/src/test/java/hudson/plugins/robot/model/RobotResultTest.java +++ b/src/test/java/hudson/plugins/robot/model/RobotResultTest.java @@ -136,7 +136,7 @@ public void testShouldParseFailedCriticalCases(){ @Test public void testShouldParseFailedNewCriticalCases() throws Exception{ - RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("new_critical_output.xml", null, null); + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("new_critical_output.xml", null, null); result = remoteOperation.invoke(new File(RobotSuiteResultTest.class.getResource("new_critical_output.xml").toURI()).getParentFile(), null); result.tally(null); @@ -251,7 +251,7 @@ public void testShouldReturnCaseTags(){ @Test public void testShouldParseSplittedOutput() throws Exception { - RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("testfile.xml", null, null); + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("testfile.xml", null, null); result = remoteOperation.invoke(new File(RobotSuiteResultTest.class.getResource("testfile.xml").toURI()).getParentFile(), null); RobotSuiteResult suite = result.getSuite("nestedSuites"); @@ -283,4 +283,48 @@ public void testShouldParseWholeSuiteDuration() throws Exception { res.tally(null); assertEquals(10141, res.getDuration()); } + + @Test + public void testShouldParseSkippedTests() throws Exception { + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("robot4_skip.xml", null, null); + result = remoteOperation.invoke(new File(RobotSuiteResultTest.class.getResource("robot4_skip.xml").toURI()).getParentFile(), null); + result.tally(null); + assertEquals(6, result.getSkipped()); + } + + @Test + public void testShouldParsePassedFromRobot4() throws Exception { + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("robot4_skip.xml", null, null); + result = remoteOperation.invoke(new File(RobotSuiteResultTest.class.getResource("robot4_skip.xml").toURI()).getParentFile(), null); + result.tally(null); + assertEquals(4, result.getPassed()); + assertEquals(66.6, result.getPassPercentage(), 0.1); + } + + @Test + public void testShouldParseFailedFromRobot4() throws Exception { + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("robot4_skip.xml", null, null); + result = remoteOperation.invoke(new File(RobotSuiteResultTest.class.getResource("robot4_skip.xml").toURI()).getParentFile(), null); + result.tally(null); + assertEquals(2, result.getFailed()); + } + + @Test + public void testShouldParseTotalFromRobot4() throws Exception { + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("robot4_skip.xml", null, null); + result = remoteOperation.invoke(new File(RobotSuiteResultTest.class.getResource("robot4_skip.xml").toURI()).getParentFile(), null); + result.tally(null); + assertEquals(12, result.getOverallTotal()); + } + + @Test + public void testShouldParseTagsFromRobot4() throws Exception { + RobotParser.RobotParserCallable remoteOperation = new RobotParser.RobotParserCallable("robot4_skip.xml", null, null); + result = remoteOperation.invoke(new File(RobotSuiteResultTest.class.getResource("robot4_skip.xml").toURI()).getParentFile(), null); + result.tally(null); + + RobotCaseResult caseResult = (RobotCaseResult)result.findObjectById("Skip/Test 8 Will Always Fail"); + String tags = StringUtils.join(caseResult.getTags(), ","); + assertEquals("fail,tag2,tag3", tags); + } } diff --git a/src/test/java/hudson/plugins/robot/tokens/RobotFailedCasesTokenMacroTest.java b/src/test/java/hudson/plugins/robot/tokens/RobotFailedCasesTokenMacroTest.java index 76d80f8c..e95d6d3c 100644 --- a/src/test/java/hudson/plugins/robot/tokens/RobotFailedCasesTokenMacroTest.java +++ b/src/test/java/hudson/plugins/robot/tokens/RobotFailedCasesTokenMacroTest.java @@ -32,7 +32,7 @@ public void setUp(){ RobotResult result = Mockito.mock(RobotResult.class); - List failedList = new ArrayList(); + List failedList = new ArrayList<>(); RobotCaseResult case1 = Mockito.mock(RobotCaseResult.class); Mockito.when(case1.getRelativePackageName(result)).thenReturn("Failcases.subcases.Failure1"); diff --git a/src/test/resources/hudson/plugins/robot/blueocean/blue_skip.xml b/src/test/resources/hudson/plugins/robot/blueocean/blue_skip.xml new file mode 100644 index 00000000..edd1cad9 --- /dev/null +++ b/src/test/resources/hudson/plugins/robot/blueocean/blue_skip.xml @@ -0,0 +1,285 @@ + + + + + + Will pass + Logs the given message with the given level. + Will pass + + + pass + tag2 + + + + + Will pass + Logs the given message with the given level. + Will pass + + + pass + tag2 + tag3 + + + + + Will pass + Logs the given message with the given level. + Will pass + + + + + + skippable + Test skipped with '--skip' command line option. + + + This test has documentation + skippable + Test skipped with '--skip' command line option. + + + skippable + tag2 + Test skipped with '--skip' command line option. + + + skippable + Test skipped with '--skip' command line option. + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + This test has documentation + fail + tag2 + tag3 + AssertionError + + + + Optional failure message + Fails the test with the given message and optionally alters its tags. + Optional failure message + + + fail + Optional failure message + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + skipfail + Test failed but its tags matched '--SkipOnFailure' and it was marked skipped. + + Original failure: + AssertionError + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + skipfail + tag2 + Test failed but its tags matched '--SkipOnFailure' and it was marked skipped. + + Original failure: + AssertionError + + + + Will Pass + Logs the given message with the given level. + Will Pass + + + This test has documentation + skipfail + + + When run with `--skip skippable --skiponfailure skipfail` + will produce the following results: + PASSED 4 + FAIL 2 + SKIP 6 + + + + + + ${x} + 2 + + 0 + + ${x} + Logs the given message with the given level. + 0 + + + + ${x} + + ${arg} + Logs the given message with the given level. + 0 + + + + + + ${x}==1 + Fail + Runs the given keyword with the given arguments, if ``condition`` is true. + + + + + + 1 + + ${x} + Logs the given message with the given level. + 1 + + + + ${x} + + ${arg} + Logs the given message with the given level. + 1 + + + + + + ${x}==1 + Fail + Runs the given keyword with the given arguments, if ``condition`` is true. + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + + + + + + + failure + for + AssertionError + + + + ${var} + mikki hiiri + Returns the given values which can then be assigned to a variables. + ${var} = mikki hiiri + + + + + + ${var} + + ${arg} + Logs the given message with the given level. + mikki hiiri + + + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + + + + + failure + if + AssertionError + + + + ${var} + mikki hiiri + Returns the given values which can then be assigned to a variables. + ${var} = mikki hiiri + + + + + + Fails the test with the given message and optionally alters its tags. + + + + + + + ${var} + + ${arg} + Logs the given message with the given level. + mikki hiiri + + + + + + ${var} + Fails the test with the given message and optionally alters its tags. + mikki hiiri + + + + + + + failure + if + mikki hiiri + + + + + + All Tests + + + fail + failure + for + if + pass + skipfail + skippable + tag2 + tag3 + + + Skip + Loops + + + + + diff --git a/src/test/resources/hudson/plugins/robot/model/robot4_skip.xml b/src/test/resources/hudson/plugins/robot/model/robot4_skip.xml new file mode 100644 index 00000000..8e8d7d78 --- /dev/null +++ b/src/test/resources/hudson/plugins/robot/model/robot4_skip.xml @@ -0,0 +1,136 @@ + + + + + + Will pass + Logs the given message with the given level. + Will pass + + + pass + tag2 + + + + + Will pass + Logs the given message with the given level. + Will pass + + + pass + tag2 + tag3 + + + + + Will pass + Logs the given message with the given level. + Will pass + + + + + + skippable + Test skipped with '--skip' command line option. + + + This test has documentation + skippable + Test skipped with '--skip' command line option. + + + skippable + tag2 + Test skipped with '--skip' command line option. + + + skippable + Test skipped with '--skip' command line option. + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + This test has documentation + fail + tag2 + tag3 + AssertionError + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + fail + AssertionError + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + skipfail + Test failed but its tags matched '--SkipOnFailure' and it was marked skipped. + + Original failure: + AssertionError + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + skipfail + tag2 + Test failed but its tags matched '--SkipOnFailure' and it was marked skipped. + + Original failure: + AssertionError + + + + Will Pass + Logs the given message with the given level. + Will Pass + + + This test has documentation + skipfail + + + When run with `--skip skippable --skiponfailure skipfail` + will produce the following results: + PASSED 4 + FAIL 2 + SKIP 6 + + + + + All Tests + + + fail + pass + skipfail + skippable + tag2 + tag3 + + + Skip + + + + + diff --git a/src/test/resources/hudson/plugins/robot/robot4_if_output.xml b/src/test/resources/hudson/plugins/robot/robot4_if_output.xml new file mode 100644 index 00000000..1e4c16b1 --- /dev/null +++ b/src/test/resources/hudson/plugins/robot/robot4_if_output.xml @@ -0,0 +1,198 @@ + + + + + + ${var} + mikki hiiri + Returns the given values which can then be assigned to a variables. + ${var} = mikki hiiri + + + + + + ${var} + Logs the given message with the given level. + mikki hiiri + + + + + + + if + success + + + + + ${var} + mikki hiiri + Returns the given values which can then be assigned to a variables. + ${var} = mikki hiiri + + + + + + Fails the test with the given message and optionally alters its tags. + + + + + + + ${var} + + ${arg} + Logs the given message with the given level. + mikki hiiri + + + + + + ${var} + Logs the given message with the given level. + mikki hiiri + + + + + + + if + success + + + + + ${var} + mikki hiiri + Returns the given values which can then be assigned to a variables. + ${var} = mikki hiiri + + + + + + Fails the test with the given message and optionally alters its tags. + + + + + + + ${var} + Logs the given message with the given level. + mikki hiiri + + + + + + + Fails the test with the given message and optionally alters its tags. + + + + + + + if + success + + + + + ${var} + mikki hiiri + Returns the given values which can then be assigned to a variables. + ${var} = mikki hiiri + + + + + + ${var} + + ${arg} + Logs the given message with the given level. + mikki hiiri + + + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + + + + + failure + if + AssertionError + + + + ${var} + mikki hiiri + Returns the given values which can then be assigned to a variables. + ${var} = mikki hiiri + + + + + + Fails the test with the given message and optionally alters its tags. + + + + + + + ${var} + + ${arg} + Logs the given message with the given level. + mikki hiiri + + + + + + ${var} + Fails the test with the given message and optionally alters its tags. + mikki hiiri + + + + + + + failure + if + mikki hiiri + + + + + + All Tests + + + failure + if + success + + + Loops + + + + + diff --git a/src/test/resources/hudson/plugins/robot/robot4_nested_output.xml b/src/test/resources/hudson/plugins/robot/robot4_nested_output.xml new file mode 100644 index 00000000..9f8e6b7e --- /dev/null +++ b/src/test/resources/hudson/plugins/robot/robot4_nested_output.xml @@ -0,0 +1,248 @@ + + + + + + ${x} + 2 + + 0 + + ${y} + 2 + + 0 + + ${x}-${y} + Logs the given message with the given level. + 0-0 + + + + + + 1 + + ${x}-${y} + Logs the given message with the given level. + 0-1 + + + + + + + + + ${x} + 2 + + 0 + + ${y} + 2 + + 0 + + ${x}-${y} + Logs the given message with the given level. + 0-0 + + + + + + 1 + + ${x}-${y} + Logs the given message with the given level. + 0-1 + + + + + + + + + + 1 + + ${y} + 2 + + 0 + + ${x}-${y} + Logs the given message with the given level. + 1-0 + + + + + + 1 + + ${x}-${y} + Logs the given message with the given level. + 1-1 + + + + + + + + + + + + + + ${x}==1 + Fail + Runs the given keyword with the given arguments, if ``condition`` is true. + + + + + + 1 + + ${y} + 2 + + 0 + + ${x}-${y} + Logs the given message with the given level. + 1-0 + + + + + + 1 + + ${x}-${y} + Logs the given message with the given level. + 1-1 + + + + + + + + + ${x} + 2 + + 0 + + ${y} + 2 + + 0 + + ${x}-${y} + Logs the given message with the given level. + 0-0 + + + + + + 1 + + ${x}-${y} + Logs the given message with the given level. + 0-1 + + + + + + + + + + 1 + + ${y} + 2 + + 0 + + ${x}-${y} + Logs the given message with the given level. + 1-0 + + + + + + 1 + + ${x}-${y} + Logs the given message with the given level. + 1-1 + + + + + + + + + + + + + + ${x}==1 + Fail + Runs the given keyword with the given arguments, if ``condition`` is true. + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + + + + + + + failure + for + AssertionError + + + + ${x} + 0 + + + for + success + + + + + + + All Tests + + + failure + for + success + + + Loops + + + + + diff --git a/src/test/resources/hudson/plugins/robot/robot4_output.xml b/src/test/resources/hudson/plugins/robot/robot4_output.xml new file mode 100644 index 00000000..ea85f406 --- /dev/null +++ b/src/test/resources/hudson/plugins/robot/robot4_output.xml @@ -0,0 +1,133 @@ + + + + + + Will pass + Logs the given message with the given level. + Will pass + + + pass + tag2 + + + + + Will pass + Logs the given message with the given level. + Will pass + + + pass + tag2 + tag3 + + + + + Will pass + Logs the given message with the given level. + Will pass + + + + + + skippable + Test skipped with '--skip' command line option. + + + skippable + Test skipped with '--skip' command line option. + + + skippable + tag2 + Test skipped with '--skip' command line option. + + + skippable + Test skipped with '--skip' command line option. + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + fail + tag2 + tag3 + AssertionError + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + fail + AssertionError + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + skipfail + Test failed but its tags matched '--SkipOnFailure' and it was marked skipped. + + Original failure: + AssertionError + + + + Fails the test with the given message and optionally alters its tags. + AssertionError + + + skipfail + tag2 + Test failed but its tags matched '--SkipOnFailure' and it was marked skipped. + + Original failure: + AssertionError + + + + Will Pass + Logs the given message with the given level. + Will Pass + + + skipfail + + + When run with `--skip skippable --skiponfailure skipfail` + will produce the following results: + PASSED 4 + FAIL 2 + SKIP 6 + + + + + All Tests + + + fail + pass + skipfail + skippable + tag2 + tag3 + + + Skip + + + + +