3 new revisions:

Revision: a5accc5b6928
Branch:   default
Author:   Pekka Klärck
Date:     Wed Sep 19 16:25:16 2012
Log:      cleaned up timeout tests a little
http://code.google.com/p/robotframework/source/detail?r=a5accc5b6928

Revision: 53df23d5a539
Branch:   default
Author:   Pekka Klärck
Date:     Thu Sep 20 04:22:40 2012
Log:      XML lib: reorg methods
http://code.google.com/p/robotframework/source/detail?r=53df23d5a539

Revision: 2033e4e3563a
Branch:   default
Author:   Pekka Klärck
Date:     Thu Sep 20 05:18:20 2012
Log:      XML lib: Get Element Count keyword...
http://code.google.com/p/robotframework/source/detail?r=2033e4e3563a

==============================================================================
Revision: a5accc5b6928
Branch:   default
Author:   Pekka Klärck
Date:     Wed Sep 19 16:25:16 2012
Log:      cleaned up timeout tests a little
http://code.google.com/p/robotframework/source/detail?r=a5accc5b6928

Modified:
 /atest/robot/core/timeouts.txt
 /atest/testdata/core/timeouts.txt
 /atest/testresources/testlibs/ExampleLibrary.py

=======================================
--- /atest/robot/core/timeouts.txt      Wed Sep 12 15:17:39 2012
+++ /atest/robot/core/timeouts.txt      Wed Sep 19 16:25:16 2012
@@ -12,115 +12,118 @@
 ${KW STOPPED}    ${TIMEOUT TEMP}${/}kw_stopped.txt

 *** Test Cases ***
-Timed Test Passes
-    Check Test Case  Passing
-    Check Test Case  Sleeping But Passing
+Timeouted Test Passes
+    Check Test Case    Passing
+    Check Test Case    Sleeping But Passing

-Timed Test Fails Before Timeout
-    Check Test Case  Failing Before Timeout
+Timeouted Test Fails Before Timeout
+    Check Test Case    Failing Before Timeout

 Show Correct Trace Back When Failing Before Timeout
-    ${tc} =   Check Test Case
+    ${tc} =   Check Test Case    ${TEST NAME}
Should Contain ${tc.kws[0].msgs[-1].message} raise AssertionError(msg) if msg else AssertionError()

 Show Correct Trace Back When Failing In Java Before Timeout
     [tags]  jybot
-    ${tc} =   Check Test Case
+    ${tc} =   Check Test Case    ${TEST NAME}
Should Contain ${tc.kws[0].msgs[-1].message} at ExampleJavaLibrary.exception(

-Timed Test Timeouts
-    Check Test Case  Sleeping And Timeouting
-    Check Test Case  Total Time Too Long
-    Check Test Case  Looping Forever And Timeouting
+Timeouted Test Timeouts
+    Check Test Case    Sleeping And Timeouting
+    Check Test Case    Total Time Too Long
+    Check Test Case    Looping Forever And Timeouting

 Timout Defined For One Test
-    Check Test Case  Timout Defined For One Test
+    Check Test Case    ${TEST NAME}

 Stopped After Test Timeout
-    Check Test Case  Stopped After Test Timeout
-    Fail Unless File Empty  ${test_stopped}
+    Check Test Case    ${TEST NAME}
+    File Should Be Empty  ${TEST STOPPED}

 Timeouted Keyword Passes
-    Check Test Case  Timeouted Keyword Passes
+    Check Test Case    ${TEST NAME}

 Timeouted Keyword Fails Before Timeout
-    Check Test Case  Timeouted Keyword Fails
+    Check Test Case    ${TEST NAME}

 Timeouted Keyword Timeouts
-    Check Test Case  Timeouted Keyword Timeouts
-    Check Test Case  Timeouted Keyword Timeouts Due To Total Time
+    Check Test Case    ${TEST NAME}
+
+Timeouted Keyword Timeouts Due To Total Time
+    Check Test Case    ${TEST NAME}

 Stopped After Keyword Timeout
-    Check Test Case  Stopped After Keyword timeout
-    Fail Unless File Empty  ${kw_stopped}
+    Check Test Case    ${TEST NAME}
+    File Should Be Empty  ${KW STOPPED}

 Test Timeouts When Also Keywords Are Timeouted
-    Check Test Case  Test Timeouts When Also Keywords Are Timeouted
+    Check Test Case    ${TEST NAME}

 Timeout Format
-    ${test} =  Check Test Case  Timeout Format
-    Equals  ${test.timeout}  2 days 4 hours 56 minutes 18 seconds
+    ${tc} =   Check Test Case    ${TEST NAME}
+ Should Be Equal ${tc.timeout} 2 days 4 hours 56 minutes 18 seconds

 Test Timeout During Setup
-    Check Test Case  Test Timeout During Setup
+    Check Test Case    ${TEST NAME}

-Teardown After Timeout
+Teardown After Test Timeout
[Documentation] Test that teardown is executed after a test has timed out
-    ${test} =  Check Test Case  Teardown After Test Timeout
-    Equals  ${test.teardown.messages[0] .message}  Teardown executed
-    ${test} =  Check Test Case  Failing Teardown After Test Timeout
-    ${test} =  Check Test Case  Teardown With Sleep After Test Timeout
- Equals ${test.teardown.keywords[1] .messages[0].message} Teardown executed
+    ${tc} =   Check Test Case    ${TEST NAME}
+    Check Log Message    ${tc.teardown.msgs[0]}    Teardown executed
+    ${tc} =  Check Test Case    Teardown With Sleep After Test Timeout
+    Check Log Message    ${tc.teardown.kws[1].msgs[0]}    Teardown executed
+
+Failing Teardown After Test Timeout
+    Check Test Case    ${TEST NAME}

 Test Timeout During Teardown
[Documentation] Test timeout should not interrupt teardown but test should be failed afterwards
-    ${test} =  Check Test Case  Test Timeout During Teardown
- Equals ${test.teardown.keywords[1] .messages[0].message} Teardown executed
+    ${tc} =   Check Test Case    ${TEST NAME}
+    Check Log Message    ${tc.teardown.kws[1].msgs[0]}    Teardown executed

 Timeouted Setup Passes
-    Check Test Case  Timeouted Setup Passes
+    Check Test Case    ${TEST NAME}

 Timeouted Setup Timeouts
-    Check Test Case  Timeouted Setup Timeouts
+    Check Test Case    ${TEST NAME}

 Timeouted Teardown Passes
-    Check Test Case  Timeouted Teardown Passes
+    Check Test Case    ${TEST NAME}

 Timeouted Teardown Timeouts
-    Check Test Case  Timeouted Teardown Timeouts
+    Check Test Case    ${TEST NAME}

 Timeouted UK Using Non Timeouted UK
-    Check Test Case  Timeouted UK Using Non Timeouted UK
+    Check Test Case    ${TEST NAME}

 Shortest UK Timeout Should Be Applied
-    Check Test Case  Shortest UK Timeout should be applied
+    Check Test Case    ${TEST NAME}

 Shortest Test Or UK Timeout Should Be Applied
-    Check Test Case  Shortest Test or UK Timeout should be applied
+    Check Test Case    ${TEST NAME}

 Timeouted Set Keyword
-    Check Test Case  Timeouted Set Keyword
+    Check Test Case    ${TEST NAME}

Test Timeout Should Not Be Active For Run Keyword Variants But To Keywords They Execute - Check Test Case Test Timeout Should not be Active For Run keyword variants But To Keywords They Execute
+    Check Test Case    ${TEST NAME}

Keyword Timeout Should Not Be Active For Run Keyword Variants But To Keywords They Execute - Check Test Case Keyword Timeout Should not be Active For Run keyword variants But To Keywords They Execute
+    Check Test Case    ${TEST NAME}

 Output Capture With Timeouts
     [Documentation]  Testing that capturing output works with timeouts
-    ${test} =  Check Test Case  Timeouted Keyword Passes
- Check Log Message ${test.kws[0].msgs[0]} Testing outputcapture in timeouted test - Check Log Message ${test.kws[1].kws[0].msgs[0]} Testing outputcapture in timeouted keyword
+    ${tc} =    Check Test Case    Timeouted Keyword Passes
+ Check Log Message ${tc.kws[0].msgs[0]} Testing outputcapture in timeouted test + Check Log Message ${tc.kws[1].kws[0].msgs[0]} Testing outputcapture in timeouted keyword

It Should Be Possible To Print From Java Libraries When Test Timeout Has Been Set
     [Tags]  jybot
- ${tc} = Check Test Case It Should Be Possible To Print From Java Libraries When Test Timeout Has Been Set
-    Check Log message  ${tc.kws[0].msgs[0]}  My message from java lib
+    ${tc} =   Check Test Case    ${TEST NAME}
+    Check Log message    ${tc.kws[0].msgs[0]}    My message from java lib

 Timeouted Keyword Called With Wrong Number of Arguments
     Check Test Case  ${TEST NAME}

 Timeouted Keyword Called With Wrong Number of Arguments with Run Keyword
     Check Test Case  ${TEST NAME}
-
=======================================
--- /atest/testdata/core/timeouts.txt   Wed Sep 12 15:17:39 2012
+++ /atest/testdata/core/timeouts.txt   Wed Sep 19 16:25:16 2012
@@ -74,7 +74,7 @@
     Log  Testing outputcapture in timeouted test
     Timeouted Keyword Passes

-Timeouted Keyword Fails
+Timeouted Keyword Fails Before Timeout
     [Documentation]  FAIL Failure before keyword timeout
     [Timeout]  2 seconds
     Timeouted Keyword Fails Before Timeout
=======================================
--- /atest/testresources/testlibs/ExampleLibrary.py     Wed Dec 14 03:19:10 2011
+++ /atest/testresources/testlibs/ExampleLibrary.py     Wed Sep 19 16:25:16 2012
@@ -115,11 +115,11 @@

     def write_to_file_after_sleeping(self, path, sec, msg=None):
         f = open(path, 'w')
-        self._sleep(sec)
-        if msg is None:
-            msg = 'Slept %s seconds' % sec
-        f.write(msg)
-        f.close()
+        try:
+            self._sleep(sec)
+            f.write(msg or 'Slept %s seconds' % sec)
+        finally:  # may be killed by timeouts
+            f.close()

     def sleep_without_logging(self, timestr):
         seconds = utils.timestr_to_secs(timestr)

==============================================================================
Revision: 53df23d5a539
Branch:   default
Author:   Pekka Klärck
Date:     Thu Sep 20 04:22:40 2012
Log:      XML lib: reorg methods
http://code.google.com/p/robotframework/source/detail?r=53df23d5a539

Modified:
 /src/robot/libraries/XML.py

=======================================
--- /src/robot/libraries/XML.py Tue Sep 18 13:59:04 2012
+++ /src/robot/libraries/XML.py Thu Sep 20 04:22:40 2012
@@ -285,28 +285,6 @@
         with ETSource(source) as source:
             return ET.parse(source).getroot()

-    def element_should_exist(self, source, xpath='.', message=None):
-        count = len(self.get_elements(source, xpath))
-        if not count:
-            self._raise_wrong_number_of_matches(count, xpath, message)
-
-    def element_should_not_exist(self, source, xpath='.', message=None):
-        count = len(self.get_elements(source, xpath))
-        if count:
-            self._raise_wrong_number_of_matches(count, xpath, message)
-
-    def _raise_wrong_number_of_matches(self, count, xpath, message=None):
-        if not message:
-            message = self._wrong_number_of_matches(count, xpath)
-        raise AssertionError(message)
-
-    def _wrong_number_of_matches(self, count, xpath):
-        if not count:
-            return "No element matching '%s' found." % xpath
-        if count == 1:
-            return "One element matching '%s' found." % xpath
- return "Multiple elements (%d) matching '%s' found." % (count, xpath)
-
     def get_element(self, source, xpath='.'):
         """Returns an element in the `source` matching the `xpath`.

@@ -330,6 +308,18 @@
             self._raise_wrong_number_of_matches(len(elements), xpath)
         return elements[0]

+    def _raise_wrong_number_of_matches(self, count, xpath, message=None):
+        if not message:
+            message = self._wrong_number_of_matches(count, xpath)
+        raise AssertionError(message)
+
+    def _wrong_number_of_matches(self, count, xpath):
+        if not count:
+            return "No element matching '%s' found." % xpath
+        if count == 1:
+            return "One element matching '%s' found." % xpath
+ return "Multiple elements (%d) matching '%s' found." % (count, xpath)
+
     def get_elements(self, source, xpath):
         """Returns a list of elements in the `source` matching the `xpath`.

@@ -388,6 +378,17 @@
         """
         return list(self.get_element(source, xpath))

+
+    def element_should_exist(self, source, xpath='.', message=None):
+        count = len(self.get_elements(source, xpath))
+        if not count:
+            self._raise_wrong_number_of_matches(count, xpath, message)
+
+    def element_should_not_exist(self, source, xpath='.', message=None):
+        count = len(self.get_elements(source, xpath))
+        if count:
+            self._raise_wrong_number_of_matches(count, xpath, message)
+
def get_element_text(self, source, xpath='.', normalize_whitespace=False):
         """Returns all text of the element, possibly whitespace normalized.


==============================================================================
Revision: 2033e4e3563a
Branch:   default
Author:   Pekka Klärck
Date:     Thu Sep 20 05:18:20 2012
Log:      XML lib: Get Element Count keyword

Update issue 1236
Summary: `ML` library: `Element Should (Not) Exist` and `Get Element Count` keywords Decided to add also `Get Element Count` to make it possible to have more complex checks based on how many elements match. This keyword both logs and returns the count. Previously added `Element Should (Not) Exist` keywords could use this as a helper and got logging for free.

All new keywords are still undocumented...
http://code.google.com/p/robotframework/source/detail?r=2033e4e3563a

Modified:
 /atest/robot/standard_libraries/xml/element_should_exist.txt
 /atest/testdata/standard_libraries/xml/element_should_exist.txt
 /src/robot/libraries/XML.py

=======================================
--- /atest/robot/standard_libraries/xml/element_should_exist.txt Tue Sep 18 08:16:36 2012 +++ /atest/robot/standard_libraries/xml/element_should_exist.txt Thu Sep 20 05:18:20 2012
@@ -5,23 +5,36 @@

 *** Test Cases ***

+Get Element Count
+    ${tc} =    Check Test Case    ${TESTNAME}
+ Check Log Message ${tc.kws[0].kws[0].msgs[0]} 0 elements matched 'nonex'. + Check Log Message ${tc.kws[1].kws[0].msgs[0]} 1 element matched 'another'. + Check Log Message ${tc.kws[2].kws[0].msgs[0]} 1 element matched '.'. + Check Log Message ${tc.kws[3].kws[0].msgs[0]} 4 elements matched './/child'.
+
 Element Should Exist Passes When There Are One Or More Matches
-    Check Test Case    ${TESTNAME}
+    ${tc} =    Check Test Case    ${TESTNAME}
+ Check Log Message ${tc.kws[0].msgs[0]} 1 element matched 'another/child'.
+    Check Log Message    ${tc.kws[1].msgs[0]}   3 elements matched 'child'.

 Element Should Exist Fails When There Are No Matches
-    Check Test Case    ${TESTNAME}
+    ${tc} =    Check Test Case    ${TESTNAME}
+    Check Log Message    ${tc.kws[0].msgs[0]}   0 elements matched 'nönëx'.

 Element Should Exist With Custom Error Message
     Check Test Case    ${TESTNAME}

 Element Should Not Exist Passes When There Are No Matches
-    Check Test Case    ${TESTNAME}
+    ${tc} =    Check Test Case    ${TESTNAME}
+    Check Log Message    ${tc.kws[0].msgs[0]}   0 elements matched 'nonex'.

 Element Should Not Exist Fails When There Is One Match
-    Check Test Case    ${TESTNAME}
+    ${tc} =    Check Test Case    ${TESTNAME}
+ Check Log Message ${tc.kws[0].msgs[0]} 1 element matched 'another/child'.

 Element Should Not Exist Fails When There Are Multiple Matches
-    Check Test Case    ${TESTNAME}
+    ${tc} =    Check Test Case    ${TESTNAME}
+ Check Log Message ${tc.kws[0].msgs[0]} 4 elements matched './/child'.

 Element Should Not Exist With Custom Error Message
     Check Test Case    ${TESTNAME}
=======================================
--- /atest/testdata/standard_libraries/xml/element_should_exist.txt Tue Sep 18 13:07:11 2012 +++ /atest/testdata/standard_libraries/xml/element_should_exist.txt Thu Sep 20 05:18:20 2012
@@ -2,6 +2,13 @@
 Resource        resource.txt

 *** Test Cases ***
+Get Element Count
+    [Template]    Count Should Be
+    nonex       0
+    another     1
+    .           1
+    .//child    4
+
 Element Should Exist Passes When There Are One Or More Matches
     Element Should Exist    ${TEST}    another/child
     Element Should Exist    ${TEST}    xpath=child
@@ -31,3 +38,9 @@
     [Documentation]    FAIL    My error
     Element Should Not Exist    <root/>    nonex    Not used
Element Should Not Exist ${TEST} xpath=another/child message=My error
+
+*** Keywords ***
+Count Should Be
+    [Arguments]    ${xpath}    ${expected}
+    ${count} =    Get Element Count    ${TEST}    xpath=${xpath}
+    Should Be Equal As Integers    ${count}    ${expected}
=======================================
--- /src/robot/libraries/XML.py Thu Sep 20 04:22:40 2012
+++ /src/robot/libraries/XML.py Thu Sep 20 05:18:20 2012
@@ -19,7 +19,7 @@

 from robot.api import logger
 from robot.libraries.BuiltIn import BuiltIn
-from robot.utils import asserts, ET, ETSource
+from robot.utils import asserts, ET, ETSource, plural_or_not as s
 from robot.version import get_version


@@ -378,14 +378,18 @@
         """
         return list(self.get_element(source, xpath))

+    def get_element_count(self, source, xpath='.'):
+        count = len(self.get_elements(source, xpath))
+ logger.info("%d element%s matched '%s'." % (count, s(count), xpath))
+        return count

     def element_should_exist(self, source, xpath='.', message=None):
-        count = len(self.get_elements(source, xpath))
+        count = self.get_element_count(source, xpath)
         if not count:
             self._raise_wrong_number_of_matches(count, xpath, message)

     def element_should_not_exist(self, source, xpath='.', message=None):
-        count = len(self.get_elements(source, xpath))
+        count = self.get_element_count(source, xpath)
         if count:
             self._raise_wrong_number_of_matches(count, xpath, message)

Reply via email to