Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagexml
titleRobot-Framework example output XML
linenumberstrue
collapsetrue
<?xml version="1.0" encoding="UTF-8"?>
<robot generated="20170220 14:18:54.562" generator="Robot 3.0.2 (Python 2.7.13 on win32)">
  <suite source="C:\Users\lmfv\Documents\Saco de Features\xray-1238\robot-example\robotframework-webdemo\login_tests" id="s1" name="Login Tests">
    <suite source="C:\Users\lmfv\Documents\Saco de Features\xray-1238\robot-example\robotframework-webdemo\login_tests\gherkin_login.robot" id="s1-s1" name="Gherkin Login">
      <test id="s1-s1-t1" name="Gherkin Valid Login">
        <kw name="Given browser is opened to login page">
          <kw name="Login Page Should Be Open" library="resource">
            <kw name="Title Should Be" library="Selenium2Library">
              <doc>Verifies that current page title equals `title`.</doc>
              <arguments>
                <arg>Log in - Your Company JIRA</arg>
              </arguments>
              <msg timestamp="20170220 14:19:07.693" level="INFO">Page title is 'Log in - Your Company JIRA'.</msg>
              <status status="PASS" endtime="20170220 14:19:07.693" starttime="20170220 14:19:07.158">
              </status>
            </kw>
            <status status="PASS" endtime="20170220 14:19:07.693" starttime="20170220 14:19:07.158">
            </status>
          </kw>
          <status status="PASS" endtime="20170220 14:19:07.693" starttime="20170220 14:18:55.937">
          </status>
        </kw>
        <kw name="When user &quot;admin&quot; logs in with password &quot;password123&quot;">
          <kw name="Input Username" library="resource">
            <arguments>
              <arg>${username}</arg>
            </arguments>
            <kw name="Input Text" library="Selenium2Library">
              <doc>Types the given `text` into text field identified by `locator`.</doc>
              <arguments>
                <arg>login-form-username</arg>
                <arg>${username}</arg>
              </arguments>
              <msg timestamp="20170220 14:19:07.696" level="INFO">Typing text 'admin' into text field 'login-form-username'</msg>
              <status status="PASS" endtime="20170220 14:19:09.314" starttime="20170220 14:19:07.696">
              </status>
            </kw>
            <status status="PASS" endtime="20170220 14:19:09.314" starttime="20170220 14:19:07.695">
            </status>
          </kw>
          <kw name="Input Password" library="resource">
            <arguments>
              <arg>${password}</arg>
            </arguments>
            <kw name="Input Text" library="Selenium2Library">
              <doc>Types the given `text` into text field identified by `locator`.</doc>
              <arguments>
                <arg>login-form-password</arg>
                <arg>${password}</arg>
              </arguments>
              <msg timestamp="20170220 14:19:09.316" level="INFO">Typing text 'password123' into text field 'login-form-password'</msg>
              <status status="PASS" endtime="20170220 14:19:10.956" starttime="20170220 14:19:09.316">
              </status>
            </kw>
            <status status="PASS" endtime="20170220 14:19:10.956" starttime="20170220 14:19:09.315">
            </status>
          </kw>
          <kw name="Submit Credentials" library="resource">
            <kw name="Click Button" library="Selenium2Library">
              <doc>Clicks a button identified by `locator`.</doc>
              <arguments>
                <arg>login-form-submit</arg>
              </arguments>
              <msg timestamp="20170220 14:19:10.958" level="INFO">Clicking button 'login-form-submit'.</msg>
              <status status="PASS" endtime="20170220 14:19:17.476" starttime="20170220 14:19:10.958">
              </status>
            </kw>
            <status status="PASS" endtime="20170220 14:19:17.477" starttime="20170220 14:19:10.957">
            </status>
          </kw>
          <status status="PASS" endtime="20170220 14:19:17.478" starttime="20170220 14:19:07.695">
          </status>
        </kw>
        <kw name="Then welcome page should be open" library="resource">
          <kw name="Location Should Be" library="Selenium2Library">
            <doc>Verifies that current URL is exactly `url`.</doc>
            <arguments>
              <arg>${WELCOME URL}</arg>
            </arguments>
            <kw name="Capture Page Screenshot" library="Selenium2Library">
              <doc>Takes a screenshot of the current page and embeds it into the log.</doc>
              <msg timestamp="20170220 14:19:18.702" html="yes" level="INFO">&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3"&gt;&lt;a href="selenium-screenshot-1.png"&gt;&lt;img src="selenium-screenshot-1.png" width="800px"&gt;&lt;/a&gt;</msg>
              <status status="PASS" endtime="20170220 14:19:18.702" starttime="20170220 14:19:18.004">
              </status>
            </kw>
            <msg timestamp="20170220 14:19:18.705" level="FAIL">Location should have been 'http://localhost:8080/secure/Dashboard.jspa' but was 'http://localhost:8080/login.jsp'</msg>
            <status status="FAIL" endtime="20170220 14:19:18.705" starttime="20170220 14:19:17.483">
            </status>
          </kw>
          <status status="FAIL" endtime="20170220 14:19:18.706" starttime="20170220 14:19:17.481">
          </status>
        </kw>
        <kw type="teardown" name="Close Browser" library="Selenium2Library">
          <doc>Closes the current browser.</doc>
          <status status="PASS" endtime="20170220 14:19:22.382" starttime="20170220 14:19:18.707">
          </status>
        </kw>
        <tags>
          <tag>WEB-1</tag>
          <tag>WEB-3</tag>
        </tags>
        <status status="FAIL" endtime="20170220 14:19:22.383" critical="yes" starttime="20170220 14:18:55.936">Location should have been 'http://localhost:8080/secure/Dashboard.jspa' but was 'http://localhost:8080/login.jsp'</status>
      </test>
      <doc>A test suite with a single Gherkin style test.This test is functionally identical to the example invalid_login.robot file.</doc>
      <status status="FAIL" endtime="20170220 14:19:22.397" starttime="20170220 14:18:54.670">
      </status>
    </suite>
    <status status="FAIL" endtime="20170220 14:22:12.549" starttime="20170220 14:18:54.567">
    </status>
  </suite>
</robot>

Robot Framework v4.0 XML reports

As from 5.0.0, Xray supports output format from Robot Framework 4.0, including new features such as the SKIP status, native IF/ELSE and nested control structures.

Code Block
<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 4.0.1 (Python 3.9.5 on darwin)" generated="20210511 14:11:38.099" rpa="false" schemaversion="2">
    <suite id="s1" name="Demo" source="/Users/dpca/Downloads/robot40_outputxml_changes/demo.robot">
        <test id="s1-t1" name="Example using conditional statements">
            <if>
                <branch type="IF" condition="${var1} > 0">
                    <kw name="Sleep" library="BuiltIn">
                        <arg>1</arg>
                        <doc>Pauses the test executed for the given time.</doc>
                        <status status="NOT RUN" starttime="20210511 14:11:38.144" endtime="20210511 14:11:38.144"/>
                    </kw>
                    <status status="NOT RUN" starttime="20210511 14:11:38.144" endtime="20210511 14:11:38.144"/>
                </branch>
                <branch type="ELSE">
                    <kw name="Sleep" library="BuiltIn">
                        <arg>2</arg>
                        <doc>Pauses the test executed for the given time.</doc>
                        <msg timestamp="20210511 14:11:40.146" level="INFO">Slept 2 seconds</msg>
                        <status status="PASS" starttime="20210511 14:11:38.144" endtime="20210511 14:11:40.146"/>
                    </kw>
                    <status status="PASS" starttime="20210511 14:11:38.144" endtime="20210511 14:11:40.146"/>
                </branch>
                <status status="PASS" starttime="20210511 14:11:38.144" endtime="20210511 14:11:40.146"/>
            </if>
            <status status="PASS" starttime="20210511 14:11:38.143" endtime="20210511 14:11:40.146"/>
        </test>
        <test id="s1-t2" name="Example using nested for loops">
            <for flavor="IN">
                <var>${robot}</var>
                <value>@{ROBOTS}</value>
                <iter>
                    <var name="${robot}">Cortana</var>
                    <for flavor="IN">
                        <var>${dog}</var>
                        <value>@{DOGS}</value>
                        <iter>
                            <var name="${dog}">James</var>
                            <kw name="Log" library="BuiltIn">
                                <arg>${robot} ${dog}</arg>
                                <doc>Logs the given message with the given level.</doc>
                                <msg timestamp="20210511 14:11:40.148" level="INFO">Cortana James</msg>
                                <status status="PASS" starttime="20210511 14:11:40.148" endtime="20210511 14:11:40.148"/>
                            </kw>
                            <status status="PASS" starttime="20210511 14:11:40.148" endtime="20210511 14:11:40.148"/>
                        </iter>
                        <iter>
                            <var name="${dog}">Paul</var>
                            <kw name="Log" library="BuiltIn">
                                <arg>${robot} ${dog}</arg>
                                <doc>Logs the given message with the given level.</doc>
                                <msg timestamp="20210511 14:11:40.149" level="INFO">Cortana Paul</msg>
                                <status status="PASS" starttime="20210511 14:11:40.148" endtime="20210511 14:11:40.149"/>
                            </kw>
                            <status status="PASS" starttime="20210511 14:11:40.148" endtime="20210511 14:11:40.149"/>
                        </iter>
                        <status status="PASS" starttime="20210511 14:11:40.147" endtime="20210511 14:11:40.149"/>
                    </for>
                    <status status="PASS" starttime="20210511 14:11:40.147" endtime="20210511 14:11:40.149"/>
                </iter>
                <iter>
                    <var name="${robot}">Terminator</var>
                    <for flavor="IN">
                        <var>${dog}</var>
                        <value>@{DOGS}</value>
                        <iter>
                            <var name="${dog}">James</var>
                            <kw name="Log" library="BuiltIn">
                                <arg>${robot} ${dog}</arg>
                                <doc>Logs the given message with the given level.</doc>
                                <msg timestamp="20210511 14:11:40.150" level="INFO">Terminator James</msg>
                                <status status="PASS" starttime="20210511 14:11:40.149" endtime="20210511 14:11:40.150"/>
                            </kw>
                            <status status="PASS" starttime="20210511 14:11:40.149" endtime="20210511 14:11:40.150"/>
                        </iter>
                        <iter>
                            <var name="${dog}">Paul</var>
                            <kw name="Log" library="BuiltIn">
                                <arg>${robot} ${dog}</arg>
                                <doc>Logs the given message with the given level.</doc>
                                <msg timestamp="20210511 14:11:40.150" level="INFO">Terminator Paul</msg>
                                <status status="PASS" starttime="20210511 14:11:40.150" endtime="20210511 14:11:40.150"/>
                            </kw>
                            <status status="PASS" starttime="20210511 14:11:40.150" endtime="20210511 14:11:40.150"/>
                        </iter>
                        <status status="PASS" starttime="20210511 14:11:40.149" endtime="20210511 14:11:40.150"/>
                    </for>
                    <status status="PASS" starttime="20210511 14:11:40.149" endtime="20210511 14:11:40.150"/>
                </iter>
                <iter>
                    <var name="${robot}">AI</var>
                    <for flavor="IN">
                        <var>${dog}</var>
                        <value>@{DOGS}</value>
                        <iter>
                            <var name="${dog}">James</var>
                            <kw name="Log" library="BuiltIn">
                                <arg>${robot} ${dog}</arg>
                                <doc>Logs the given message with the given level.</doc>
                                <msg timestamp="20210511 14:11:40.151" level="INFO">AI James</msg>
                                <status status="PASS" starttime="20210511 14:11:40.151" endtime="20210511 14:11:40.151"/>
                            </kw>
                            <status status="PASS" starttime="20210511 14:11:40.150" endtime="20210511 14:11:40.151"/>
                        </iter>
                        <iter>
                            <var name="${dog}">Paul</var>
                            <kw name="Log" library="BuiltIn">
                                <arg>${robot} ${dog}</arg>
                                <doc>Logs the given message with the given level.</doc>
                                <msg timestamp="20210511 14:11:40.151" level="INFO">AI Paul</msg>
                                <status status="PASS" starttime="20210511 14:11:40.151" endtime="20210511 14:11:40.151"/>
                            </kw>
                            <status status="PASS" starttime="20210511 14:11:40.151" endtime="20210511 14:11:40.151"/>
                        </iter>
                        <status status="PASS" starttime="20210511 14:11:40.150" endtime="20210511 14:11:40.151"/>
                    </for>
                    <status status="PASS" starttime="20210511 14:11:40.150" endtime="20210511 14:11:40.151"/>
                </iter>
                <status status="PASS" starttime="20210511 14:11:40.147" endtime="20210511 14:11:40.151"/>
            </for>
            <status status="PASS" starttime="20210511 14:11:40.147" endtime="20210511 14:11:40.152"/>
        </test>
        <test id="s1-t3" name="This test will be skipped explictly">
            <kw name="Skip" library="BuiltIn">
                <doc>Skips the rest of the current test.</doc>
                <msg timestamp="20210511 14:11:40.152" level="SKIP">Skipped with Skip keyword.</msg>
                <status status="SKIP" starttime="20210511 14:11:40.152" endtime="20210511 14:11:40.153"/>
            </kw>
            <status status="SKIP" starttime="20210511 14:11:40.152" endtime="20210511 14:11:40.153">Skipped with Skip keyword.</status>
        </test>
        <test id="s1-t4" name="This test will always pass">
            <kw name="Pass Execution" library="BuiltIn">
                <arg>all good here</arg>
                <doc>Skips rest of the current test, setup, or teardown with PASS status.</doc>
                <msg timestamp="20210511 14:11:40.153" level="INFO">Execution passed with message:
all good here</msg>
                <status status="PASS" starttime="20210511 14:11:40.153" endtime="20210511 14:11:40.154"/>
            </kw>
            <status status="PASS" starttime="20210511 14:11:40.153" endtime="20210511 14:11:40.154">all good here</status>
        </test>
        <test id="s1-t5" name="This test will always fail">
            <kw name="Fail" library="BuiltIn">
                <arg>failed on purpose</arg>
                <doc>Fails the test with the given message and optionally alters its tags.</doc>
                <msg timestamp="20210511 14:11:40.154" level="FAIL">failed on purpose</msg>
                <status status="FAIL" starttime="20210511 14:11:40.154" endtime="20210511 14:11:40.154"/>
            </kw>
            <status status="FAIL" starttime="20210511 14:11:40.154" endtime="20210511 14:11:40.155">failed on purpose</status>
        </test>
        <test id="s1-t6" name="This test will also fail but will report as skip">
            <kw name="Fail" library="BuiltIn">
                <arg>failed also on purpose</arg>
                <doc>Fails the test with the given message and optionally alters its tags.</doc>
                <msg timestamp="20210511 14:11:40.156" level="FAIL">failed also on purpose</msg>
                <status status="FAIL" starttime="20210511 14:11:40.155" endtime="20210511 14:11:40.156"/>
            </kw>
            <tag>skipme</tag>
            <status status="SKIP" starttime="20210511 14:11:40.155" endtime="20210511 14:11:40.156">Test failed but its tags matched '--SkipOnFailure' and it was marked skipped.

Original failure:
failed also on purpose</status>
        </test>
        <test id="s1-t7" name="This test will fail due to the first kw, while 2nd one is marked as not run">
            <kw name="Fail" library="BuiltIn">
                <arg>failed on purpose</arg>
                <doc>Fails the test with the given message and optionally alters its tags.</doc>
                <msg timestamp="20210511 14:11:40.157" level="FAIL">failed on purpose</msg>
                <status status="FAIL" starttime="20210511 14:11:40.157" endtime="20210511 14:11:40.157"/>
            </kw>
            <kw name="Sleep" library="BuiltIn">
                <arg>1</arg>
                <doc>Pauses the test executed for the given time.</doc>
                <status status="NOT RUN" starttime="20210511 14:11:40.157" endtime="20210511 14:11:40.157"/>
            </kw>
            <status status="FAIL" starttime="20210511 14:11:40.156" endtime="20210511 14:11:40.157">failed on purpose</status>
        </test>
        <status status="FAIL" starttime="20210511 14:11:38.103" endtime="20210511 14:11:40.158"/>
    </suite>
    <statistics>
        <total>
            <stat pass="3" fail="2" skip="2">All Tests</stat>
        </total>
        <tag>
            <stat pass="0" fail="0" skip="1">skipme</stat>
        </tag>
        <suite>
            <stat pass="3" fail="2" skip="2" id="s1" name="Demo">Demo</stat>
        </suite>
    </statistics>
    <errors>
    </errors>
</robot>


Results in Xray Test Execution Page

Image Added

Image Added
Entities

Each Robot test case is mapped to a Generic Test in Jira, having the summary with the name of the test case, and the Generic Test Definition field contains the concatenated names of the test suites, along with the name of the test case. Note that the Robot Framework considers the base folder of the project as the first test suite.

...

The example below shows the execution details page of a Test containing both test keywords as well as the final test teardown keyword.

Image RemovedImage Added


Status

Robot Framework's test case status maps directly to Xray test run status FAIL and PASS.

...