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)