NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2117 most downloaded on PyPI
Generic automation framework for acceptance testing and robotic process automation (RPA)
Last release 4 days ago
14 Sep 2026
Release timing varies
gaps range from 9 days to 4 months
Some releases are documented
notes for 31 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
13 years old
155 releases · first in 2013
Robot Framework 4.1.1 is mostly a bug fix release, but it also adds official Python 3.10 support. For more details see the full release notes.
Robot Framework 4.1.1 is mostly a bug fix release, but it also adds official Python 3.10 support. For more details see the full release notes.
Nothing published for this version
Robot Framework 4.1 is a feature release with several nice enhancements, for example, to the continue-on-failure mode and argument conversion, as well
One column per quarter.
Robot Framework 4.1 is a feature release with several nice enhancements, for example, to the continue-on-failure mode and argument conversion, as well as some bug fixes. For more information see the full release notes.
Nothing published for this version
Robot Framework 4.0.3 fixes few regressions, including a critical regression using TypedDict in type hints introduced by earlier RF 4.0.x releases. Fo
Robot Framework 4.0.3 fixes few regressions, including a critical regression using TypedDict in type hints introduced by earlier RF 4.0.x releases. For more information see the full release notes.
Nothing published for this version
Robot Framework 4.0.2 is the second and the last planned bug fix release in the Robot Framework 4.0.x series. It fixes some problems in the earlier Ro
Robot Framework 4.0.2 is the second and the last planned bug fix release in the Robot Framework 4.0.x series. It fixes some problems in the earlier Robot Framework 4.0 and 4.0.1 releases. For more information see the full release notes.
Nothing published for this version
Robot Framework 4.0.1 is the first bug fix release in the Robot Framework 4.0.x series. It fixes several severe and not so severe issues reported sinc
Robot Framework 4.0.1 is the first bug fix release in the Robot Framework 4.0.x series. It fixes several severe and not so severe issues reported since Robot Framework 4.0 was released. For more information see the full release notes.
Robot Framework 4.0.1 is the first bug fix release in the Robot Framework 4.0.x series. This beta release contains fixes to all issues that have been
Robot Framework 4.0.1 is the first bug fix release in the Robot Framework 4.0.x series. This beta release contains fixes to all issues that have been reported so far, but if more problems are encountered they can still be fixed before the final Robot Framework 4.0.1 release. For more information see the full release notes.
Robot Framework 4.0 is a new major release with lot of big new features. Highlights include the SKIP status and native IF/ELSE support as well as enha
Robot Framework 4.0 is a new major release with lot of big new features. Highlights include the SKIP status and native IF/ELSE support as well as enhancements to, for example, type conversion and Libdoc. For more details see the full release notes.
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to,
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to, for example, type conversion and Libdoc. Robot Framework rc 2 contains all planned changes, and changes compared to the earlier rc 1 a minimal. The final version is planned to be released on Thursday Match 11, 2021.
For more information about Robot Framework 4.0 rc 2 see the full release notes.
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to,
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to, for example, type conversion and Libdoc. Robot Framework rc 1 contains all planned changes and if no problems are found the final version will be released on Thursday Match 11, 2021.
For more information about Robot Framework 4.0 rc 1 see the full release notes.
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to,
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to, for example, type conversion and Libdoc. Robot Framework beta 3 contains all planned new features but small changes are still possible before the first release candidate.
For more information about Robot Framework 4.0 beta 3 see the full release notes.
Nothing published for this version
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to,
Robot Framework 4.0 is a new major release with lot of big new features such as the SKIP status and native IF/ELSE support as well as enhancements to, for example, type conversion and Libdoc. Robot Framework beta 1 already contains most of the planned new features and internal changes.
For more information about Robot Framework 4.0 beta 1 see the full release notes.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Robot Framework 3.2.2 is a new minor release with some bug fixes, Libdoc enhancements and official Python 3.9 support. For more information see the fu
Robot Framework 3.2.2 is a new minor release with some bug fixes, Libdoc enhancements and official Python 3.9 support. For more information see the full release notes.
Robot Framework 3.2.1 fixes two high priority regressions in Robot Framework 3.2. It was released on Monday May 4, 2020. For more details see the full
Robot Framework 3.2.1 fixes two high priority regressions in Robot Framework 3.2. It was released on Monday May 4, 2020. For more details see the full release notes.
Robot Framework 3.2 is a new major release with an enhanced test data parser, handy @library and @not_keyword decorators, enhanced Libdoc spec files f
Robot Framework 3.2 is a new major release with an enhanced test data parser, handy @library and @not_keyword decorators, enhanced Libdoc spec files for external tools, inline Python evaluation support, and many other interesting new features and lot of bug fixes.
For more information see the full release notes.
Robot Framework 3.2 is a new major release with an enhanced test data parser, handy @library and @not_keyword decorators, enhanced Libdoc spec files f
Robot Framework 3.2 is a new major release with an enhanced test data parser, handy @library and @not_keyword decorators, enhanced Libdoc spec files for external tools, inline Python evaluation support, and many other interesting new features and lot of bug fixes. Robot Framework 3.2 rc 2 contains all changes planned to the final release. It has few smallish fixes compared to the first release candidata. Users are highly recommended to test it in their environments and report possible problems.
For more information see the full release notes.
Robot Framework 3.2 is a new major release with an enhanced test data parser, handy @library and @not_keyword decorators, enhanced Libdoc spec files f
Robot Framework 3.2 is a new major release with an enhanced test data parser, handy @library and @not_keyword decorators, enhanced Libdoc spec files for external tools, inline Python evaluation support, and many other interesting new features and lot of bug fixes. Robot Framework 3.2 rc 1 contains all changes planned to the final release. Users are highly recommended to test it in their environments and report possible problems.
For more information see the full release notes.
Robot Framework 3.2 is a new major release with new, enhanced test data parser, handy @library and @not_keyword decorators, inline Python evaluation s
Robot Framework 3.2 is a new major release with new, enhanced test data parser, handy @library and @not_keyword decorators, inline Python evaluation support, and many other interesting new features and bug fixes. RF 3.2 beta 2 is its third preview release and the last planned release before release candidates.
For more information see the full release notes.
Robot Framework 3.2 is a new major release with new, enhanced test data parser, handy @library decorator, inline Python evaluation support, and many o
Robot Framework 3.2 is a new major release with new, enhanced test data parser, handy @library decorator, inline Python evaluation support, and many other interesting new features and bug fixes. RF 3.2 beta 1 is its second preview release and it already contains majority of the planned new features and fixes, including the new parser.
For more information see the full release notes.
Robot Framework 3.2 is a new major release with new, enhanced test data parser, inline Python evaluation support, and many other interesting new featu
Robot Framework 3.2 is a new major release with new, enhanced test data parser, inline Python evaluation support, and many other interesting new features and bug fixes. RF 3.2 alpha 1 is its first preview release and it already contains majority of the planned new features and fixes, including the new parser.
For more information see the full release notes.
RF 3.1.2 contains few important bug fixes and some nice enhancements. It also contains several minor deprecations related to the test data syntax that…
RF 3.1.2 contains few important bug fixes and some nice enhancements. It also contains several minor deprecations related to the test data syntax that pave the way towards Robot Framework 3.2 which will contain a new test data parser. For details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.2.rst
RF 3.1.2 rc 1 contains few important bug fixes and some nice enhancements. It also contains several minor deprecations related to the test data syntax…
RF 3.1.2 rc 1 contains few important bug fixes and some nice enhancements. It also contains several minor deprecations related to the test data syntax that pave the way towards Robot Framework 3.2 which will contain a new test data parser. For details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.2.rst
Robot Framework 3.1.1 fixes few regressions in the recent Robot Framework 3.1 release. For more details see the full release notes at https://github.c
Robot Framework 3.1.1 fixes few regressions in the recent Robot Framework 3.1 release. For more details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.1.rst
RF 3.1.1 rc 1 fixes few regressions in the recent RF 3.1 release. For more details see the full release notes at https://github.com/robotframework/rob
RF 3.1.1 rc 1 fixes few regressions in the recent RF 3.1 release. For more details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.1.rst
…and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing…
Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic argument type conversion, support for named-only arguments, for loop enhancements, fix for intermittent corruption of output.xml files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise.
For more information see the full release notes.
…and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing…
Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic argument type conversion, support for named-only arguments, for loop enhancements, fix for intermittent corruption of output.xml files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise.
Release candidate 2 only has one small bug fix and few documentation enhancements compared to release candidate 1. For more information about the release see the full release notes.
…and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing…
Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic argument type conversion, support for named-only arguments, for loop enhancements, fix for intermittent corruption of output.xml files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise.
For more information see the full release notes.
…and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing…
Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic type conversion for arguments, support for named-only arguments, fix for intermittent corruption of output.xml files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise. Robot Framework 3.1 beta 1 is the third preview release and contains most of the features and fixes the final release is going to have.
For more information see the full release notes.
…as well as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data pars…
Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic type conversion for arguments, support for named-only arguments, and several other interesting new features as well as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise. Robot Framework 3.1 alpha 2 is the second preview and already contains most of the features and fixes the final release is going to have.
For more information see the full release notes.
Robot Framework 3.1 is a new release with terminology configuration to support Robotic Process Automation (RPA) and several other nice planned feature
Robot Framework 3.1 is a new release with terminology configuration to support Robotic Process Automation (RPA) and several other nice planned features. RF 3.1 alpha 1 is the first preview release which only contains initial RPA support as well as enhancements to installation.
For more information see the full release notes.
Robot Framework 3.0.4 is a new minor release fixing regressions in Robot Framework 3.0.3 related to using dictionary variables. For more information s
Robot Framework 3.0.4 is a new minor release fixing regressions in Robot Framework 3.0.3 related to using dictionary variables. For more information see the full release notes.
Robot Framework 3.0.4 is a new minor release fixing regressions in Robot Framework 3.0.3 related to using dictionary variables. This release candidate
Robot Framework 3.0.4 is a new minor release fixing regressions in Robot Framework 3.0.3 related to using dictionary variables. This release candidate contains all the planned changes. For more information see the full release notes.
Robot Framework 3.0.3 is a new release containing mainly bug fixes but also few nice enhancements. See the full release notes for more details.
Robot Framework 3.0.3 is a new release containing mainly bug fixes but also few nice enhancements. See the full release notes for more details.
Robot Framework 3.0.3 is a new release containing mainly bug fixes but also few nice enhancements. This release candidate is its first and also last p
Robot Framework 3.0.3 is a new release containing mainly bug fixes but also few nice enhancements. This release candidate is its first and also last planned preview release. See the full release notes for more details.
Robot Framework 3.0.2 is the second minor release in the Robot Framework 3.0.x series. The main motivation for this releases is fixing a performance r
Robot Framework 3.0.2 is the second minor release in the Robot Framework 3.0.x series. The main motivation for this releases is fixing a performance regression with evaluating expressions using some BuiltIn keywords occurring since RF 2.9 (#2523), but there are also few other fixes and several nice enhancements. For more details about the features and fixes see the full release notes.
Source distribution is available at PyPI and pip users can simply run pip install --upgrade robotframework to install the latest release or pip install robotframework==3.0.2 to install exactly this version.
This release has been sponsored by the Robot Framework Foundation. Additionally Nokia Networks has been sponsoring the work related to performance enhancements.
Robot Framework 3.0.2 was released on Monday February 13, 2017.
Nothing published for this version
Robot Framework 3.0.1 fixes several higher and lower level bugs in the earlier releases, and also adds some really nice enhancements. The most importa
Robot Framework 3.0.1 fixes several higher and lower level bugs in the earlier releases, and also adds some really nice enhancements. The most important new features are the ability to limit parsing of test case files to a certain file type (e.g. --extension robot, #2365) and case-insensitivity support added to most comparison keywords in the BuiltIn library (#2439). Robot Framework also now officially supports PyPy, an alternative and in some contexts faster and more memory efficient implementation of the Python language (#2513). For more details about the features and fixes see the full release notes.
Source distribution is available at PyPI and pip users can simply run pip install --upgrade robotframework to install or upgrade to the latest release or pip install robotframework==3.0.1 to install exactly this version.
This release has been sponsored by the Robot Framework Foundation and would not have been possible with this scope otherwise. Big thanks for all the member companies of the foundation for your support!
Robot Framework 3.0.1 was released on Friday January 6, 2017.
Nothing published for this version
Nothing published for this version
See the full release notes for more information about new features, bug fixes, backwards incompatible changes and deprecated features.
Robot Framework 3.0 is a new major release with Python 3 support and a new powerful listener interface that allows modifying executed tests as well as execution results. Also start-up scripts have been enhanced and it is now possible to run tests with new robot command and like python -m robot. See the full release notes for more information about new features, bug fixes, backwards incompatible changes and deprecated features.
Source distribution is available at PyPI and pip users can simply run pip install --upgrade robotframework to install or upgrade to the latest release.
The standalone JAR distribution with Jython 2.7 is available at Maven central. As discussed in issue #2218, separate Windows installers are not created anymore.
Robot Framework 3.0 was released on Thursday December 31, 2015.
See the full release notes for more information about new features, bug fixes, backwards incompatible changes and deprecated features in Robot Framewo…
Robot Framework 3.0 beta 1 is the last planned preview release before release candidates and the final 3.0 release. The biggest enhancements in Robot Framework 3.0 are Python 3 support and a new listener interface that allows modifying executed tests as well as execution results. Also start-up scripts have been enhanced and it is now possible to run tests with robot command and like python -m robot. See the full release notes for more information about new features, bug fixes, backwards incompatible changes and deprecated features in Robot Framework 3.0.
Source distribution is available at PyPI and pip users can simply run pip install --upgrade --pre robotframework to install or upgrade to the latest release or pip install robotframework==3.0b1 to install exactly this version.
Separate Windows installers are not created and the plan is not to create them even for final releases in the future (#2218). The standalone jar distribution can be created and added here if there are requests, but we only upload final releases to the Maven central.
Robot Framework 3.0 beta 1 was released on Wednesday December 23, 2015.
Robot Framework 3.0 alpha 2 is the second preview of the next Robot Framework major version. The biggest enhancement it contains is Python 3 support,
Robot Framework 3.0 alpha 2 is the second preview of the next Robot Framework major version. The biggest enhancement it contains is Python 3 support, but also new generic robot start-up script have been introduced.
Biggest change in alpha 2 over alpha 1 is improvement in the execution speed when using listeners. The issue list at the end of full release notes mentions for each issue whether it came in alpha 1 or 2.
Source distribution is available at PyPI and pip users can simply run pip install --upgrade --pre robotframework to install or upgrade to the latest release or pip install robotframework==3.0a2 to install exactly this version.
Separate Windows installers are not created and the plan is not to create them even for final releases in the future (#2218). The standalone jar distribution can be created and added here if there are requests, but we only upload final releases to the Maven central.
Robot Framework 3.0 alpha 2 was released on Thursday December 10, 2015.
Robot Framework 3.0 alpha 1 is the first preview of the next Robot Framework major version. The biggest enhancement it contains is Python 3 support, b
Robot Framework 3.0 alpha 1 is the first preview of the next Robot Framework major version. The biggest enhancement it contains is Python 3 support, but also new generic robot start-up script have been introduced. For more details see the full release notes.
Source distribution is available at PyPI and pip users can simply run pip install --upgrade --pre robotframework to install or upgrade to the latest release or pip install robotframework==3.0a1 to install exactly this version.
Separate Windows installers are not created and the plan is not to create them even for final releases in the future (#2218). The standalone jar distribution can be created and added here if there are requests, but we only upload final releases to the Maven central.
Robot Framework 3.0 alpha 1 was released on Thursday November 19, 2015.
Robot Framework 2.9.2 fixes broken AutoItLibrary support, adds IronPython support to the Dialogs library, and contains several other fixes and enhance
Robot Framework 2.9.2 fixes broken AutoItLibrary support, adds IronPython support to the Dialogs library, and contains several other fixes and enhancements. For more details see the full release notes.
Source distribution and Windows installers are available at PyPI and the standalone JAR with Jython 2.7 at Maven central. Pip users can simply run pip install --upgrade robotframework to install or upgrade to the latest release or pip install robotframework==2.9.2 to install exactly this version.
Robot Framework 2.9.2 was released on Friday October 9, 2015.
Robot Framework 2.9.1 is a bug fix release that fixes few high priority bugs in Robot Framework 2.9. For more details see the full release notes.
Robot Framework 2.9.1 is a bug fix release that fixes few high priority bugs in Robot Framework 2.9. For more details see the full release notes.
Source distribution and Windows installers are available at PyPI and the standalone JAR with Jython 2.7 at Maven central. Pip users can simply run pip install --upgrade robotframework to install or upgrade to the latest release or pip install robotframework==2.9.1 to install exactly this version.
Robot Framework 2.9.1 was released on Friday August 28, 2015.
Robot Framework 2.9 is a new major version with nearly 100 fixed issues. It contains, for example, high priority enhancements related to variables, su
Robot Framework 2.9 is a new major version with nearly 100 fixed issues. It contains, for example, high priority enhancements related to variables, support for creating keywords with embedded arguments in test libraries, and possibility to tag keywords. The most visible enhancement is the new fresh look in logs and reports. For more details see the full release notes.
Source distribution and Windows installers are available at PyPI and the standalone JAR with Jython 2.7 at Maven central. Pip users can simply run pip install --upgrade robotframework to install or upgrade to the latest release or pip install robotframework==2.9 to install exactly this version.
Robot Framework 2.9 was released on Friday July 31, 2015.
Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
Robot Framework 2.9 rc 1 is the sixth and hopefully last preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. All issues targeted for RF 2.9 can be found from the issue tracker.
This release ought to be very stable, and we hope that it gets as much real life testing as possible. We especially hope that library and tool developers would test how well this new version works with their projects. If no issues are found from the rc 1 release in a week, RF 2.9 final will be be released based on it. If problems arise, rc 2 will be created as soon as possible.
Questions and comments related to this release can be sent to the robotframework-users and possible bugs submitted to the issue tracker.
We have not generated Windows installers for this preview, but the source distribution is available from PyPI and the standalone jar with Jython 2.7 can be found from downloads below these release notes.
If you have pip just run pip install --upgrade --pre robotframework to install or upgrade to the latest version or use pip install robotframework==2.9rc1 to install exactly this version. For more details and other installation approaches see installation instructions.
Robot Framework 2.9 rc 1 was released on Wednesday July 15, 2015.
Robot Framework 2.9 should, for most parts, be compatible with other projects in the larger Robot Framework ecosystem. It may, however, take some time before tools support new syntax like dictionary variables or keyword tags. Additionally, big internal changes may affect tools that have used internal APIs. Libraries and tools know not to be compatible with Robot Framework 2.9 will be listed here.
The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:
*** Variables ***
&{DICT} key=value second=2 third=${3}
The above example will create a dictionary variable &{DICT} with Python dictionary {'key': 'value', 'second': '2', 'third': 3} as the value. If a dictionary variable is used as a scalar variable like ${DICT}, it will be passed forward as a single argument containing the whole dictionary. If it used like &{DICT}, individual items are passed as named arguments. For example, these two examples are equivalent:
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}
Individual dictionary variable items can be accessed either using special &{DICT}[key] syntax similarly as individual list variable items can be accessed like @{LIST}[0]. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like ${DICT.key}. For more information about dictionary variables, see Variables section in the User Guide.
NOTE: RIDE 1.4 and older do not support dictionary variables.
**kwargs support with user keywords using &{kwargs} syntax (#1561)New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept **kwargs. This can be accomplished simply by having a dictionary variable like &{kwargs} as the last argument in user keyword argument specification:
*** Keywords ***
Run My Process
[Arguments] @{arguments} &{configuration}
Run Process myproc.exe @{arguments} &{configuration}
Also this new functionality is explained with further examples in the User Guide.
User keywords have supported embedded arguments since RF 2.1.1 (#370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting robot_name attribute manually or by using robot.api.deco.keyword' decorator (#1835), and using${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.
from robot.api.deco import keyword
@keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
# ...
The User Guide is, again, the place where to find more information and examples.
Keywords can now have tags (#925). The tags can be added to user keywords either by new [Tags] setting, or by adding them to the last line of documentation.
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation
Library keywords can also use documentation to specify their tags or they can be added to robot_tagsattribute for each method. The keyword decorator provides a handy shortcut for specifying tags for each method.
from robot.api.deco import keyword
@keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
# ...
Libdoc will show keywords by tags (#1840) and tags can also be used to specify keywords for --removekeywords and --flattenkeywords commandline options (#1935).
It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with --prerunmodifier and --prerebotmodifier. See the issue #1976 for an example and more details.
Logs and reports have a new fresh look. Go run some tests and see yourself!
New option --console allows changing the console output type. Possible values are verbose (default), dotted (x-unit like output where each passing test prints only a dot), quiet (no output except warnings and errors) and none (no output whatsoever). Dotted output has a shortcut --dotted or -. as a short option.
Evaluate, Run Keyword If, etc. (#2040)Robot´s variables are now available with a $ prefix as Python variables in evaluation namespace of various BuiltIn library keywords.
The two rows below are now equivalent (assuming value of ${my var} is a string):
*** Keywords ***
My keyword
Run keyword if "${my var}" != "Foo" ... # old syntax
Run keyword if $my_var != "Foo" ... # new syntax in 2.9
FOR ... IN ZIP ... and FOR ... IN ENUMERATE (#1952)New for loop syntax allows use of for-in-zip and for-in-enumarete loops.
*** Keywords ***
For in zip example # take elements from both lists
:FOR ${number} ${name} IN ZIP ${NUMBERS} ${NAMES}
\ Number Should Be Named ${number} ${name}
For in enumerate example # take an item and an increasing index number
:FOR ${index} ${item} IN ENUMERATE @{LIST}
\ My Keyword ${index} ${item}
See the userguide for more details.
We have written guidelines helping to submit issue and contribute code. A link to them appears when submitting and issue or creating a pull request, and they are also directly available. We plan to enhance the guidelines in the future, so all kind of comments and enhancement ideas are highly appreciated.
--ExitOnFailure does not work if test/suite setup/teardown fails (#2004)Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
It has been possible to use a list variable @{list} as a scalar variable ${list} since RF 2.0.3 (#117), and scalar variables containing lists have been usable as list variables since RF 2.8 (#483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:
*** Variables ***
${VAR} Scalar variable
@{VAR} List variable
This caused a lot of confusion, and the addition of &{dictionary} variables (#1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (#1905) and decide how they are used depending on the format (e.g. ${var} for scalar, @{var} for list, and &{var} for dictionary).
As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.
Local variables used to leak from test to keywords and from keywords to lower level keywords. The example below shows variable leaking from test to keyword:
*** Test Case ***
Example
${x}= Set Variable hello
My keyword
*** Keywords ***
My keyword
Should be equal ${x} hello
This behaviour was never intended, but fixing the bug can break tests where this was used either intentionally or by accident.
With the official Jython 2.7 version out, we dropped the support for Python and Jython 2.5 series. The standalone JAR distribution contains Jython 2.7 from now on.
For example, every suite, test and keyword used to have <doc></doc> element even if they did not have any documentation.Nowadays such empty elements are not written to the output.xml at all. This change may affect tools processing output.xml files, but it also reduced output.xml size up to 10% in our tests.
Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.
The directory where execution is started from is not anymore added to the module search path. If it is needed, PYTHONPATH, JYTHONPATH or IRONPYTHONPATH environment variable can be explicitly set to . before execution.
robot.libraries prefix (#1737)It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like import DateTime. This caused problems in with standard libraries having same name as third party Python modules like DateTime.
To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the robot.libraries prefix like from robot.libraries import DateTime. This has also always been the recommended way and the one used in examples in the User Guide.
Earlier it was possible to disable options accepting no values like --dryrun by giving the option again like --dryrun --other options --dryrun. This was rather confusing, and nowadays it is possible to do that by using the same option with no prefix like --nodryrun instead. If option is used with and without the no prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.
BuiltIn.Call Method need to be escaped (#1603)Call Method nowadays supports **kwags and thus possible equal signs in normal arguments need to be escaped with a backslash like hello\=world.
See issue #1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.
These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
Create Dictionary keyword moved from Collections to BuiltIn (#1913)Set Test/Suite/Global Variable keyword removed (#1919)--runmode option removed (#1923)--xunitfile option removed in favor of --xunit (#1925)ROBOT_EXIT_FOR_LOOP attribute has been removed (#1440)FAIL is no longer usable as a normal log level (#2016)FORCE color value (#2031)Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See the issues below for more details:
OperatingSystem.Start Process keyword deprecated in favor of much more flexible Process.Start Process (#1773)--runfailed and --rerunmerge options deprecated in favor of --rerunfailed and --merge, respectively (#1642)Meta: Name syntax for specifying test suite metadata deprecated (#1918)DeprecatedBuiltIn and DeprecatedOperatingSystem officially deprecated (#1774)--monitorxxx options in favor of --consolexxx (#2027)Robot Framework 2.9 got more contributions than any earlier release. Big thanks for the following contributors as wells for anyone who has tested the preview releases, submitted issues, or otherwise helped to make RF 2.9 a great release!
ERROR log level for keywords (#1916).Get Regexp Matches keyword to the String library (#1985).Get Lines Matching Regexp also in the String library (#1836).| ID | Type | Priority | Summary | Added In |
|---|---|---|---|---|
| #532 | bug | critical | Variables should not leak to lower level keywords | alpha 3 |
| #1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| #1561 | enhancement | critical | Support Python style **kwargs with user keywords using &{kwargs} syntax |
alpha 1 |
| #1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| #925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| #1270 | bug | high | Run Keyword If Test (Failed / Passed) does not detect failure in teardown | alpha 3 |
| #1737 | bug | high | Standard libraries should not be importable in Python w/o robot.libraries prefix |
alpha 1 |
| #1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| #2004 | bug | high | --ExitOnFailure does not work if test/suite setup/teardown fails |
alpha 2 |
| #2018 | bug | high | DateTime: DST problems when calculating with dates | alpha 3 |
| #1805 | enhancement | high | Contribution instructions | rc 1 |
| #1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| #1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| #1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| #1943 | enhancement | high | Use lighter and more neutral colors for report and log html page | beta 1 |
| #1952 | enhancement | high | FOR ... IN ZIP ... and FOR ... IN ENUMERATE |
beta 2 |
| #1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| #1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| #1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| #2040 | enhancement | high | Add variables to evaluation namespace of Evaluate, Run Keyword If, ... |
beta 2 |
| #293 | enhancement | high | Support reloading library | alpha 2 |
| #317 | enhancement | high | Less verbose and quiet console outputs | alpha 3 |
| #1611 | bug | medium | Variable assignment should not be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs |
alpha 2 |
| #1900 | bug | medium | Log messages lost if library __init__ imports or initializes other libraries |
alpha 1 |
| #1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| #1992 | bug | medium | Listeners are not unregistered when using TestSuite.run API |
alpha 2 |
| #2062 | bug | medium | Not possible to print to stdout/stderr by listeners or otherwise inside Run Keyword variants |
rc 1 |
| #1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| #1603 | enhancement | medium | Support **kwargs with BuiltIn.Call Method keywords |
alpha 1 |
| #1728 | enhancement | medium | Support setting child suite variables with Set Suite Variable |
beta 1 |
| #1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| #1773 | enhancement | medium | Deprecate OperatingSystem.Start Process keyword |
alpha 1 |
| #1774 | enhancement | medium | Officially deprecate DeprecatedBuiltIn and DeprecatedOperatingSystem |
alpha 1 |
| #1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| #1834 | enhancement | medium | String: Support partial match with Get Lines Matching RegExp |
beta 2 |
| #1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| #1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| #1865 | enhancement | medium | Support disabling command line options accepting no values using no prefix (e.g. --dryrun -> --nodryrun) |
alpha 1 |
| #1869 | enhancement | medium | Variable errors should not exit Wait Until Keyword Succeeds, Run Keyword And Expect Error, etc. |
rc 1 |
| #1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| #1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| #1913 | enhancement | medium | Move Create Dictionary to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. |
alpha 1 |
| #1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| #1916 | enhancement | medium | Expose ERROR log level to custom libraries |
alpha 3 |
| #1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| #1935 | enhancement | medium | Support keyword tags with --flattenkeywords and --removekeywords |
alpha 2 |
| #1958 | enhancement | medium | Log Many: Support logging &{dictionary} variable items |
alpha 1 |
| #1959 | enhancement | medium | Wait Until Keyword Succeeds: Support giving wait time as number of times to retry |
alpha 1 |
| #1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| #1969 | enhancement | medium | Allow giving listener and model modifier instances to robot.run and TestSuite.run |
alpha 3 |
| #1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| #1972 | enhancement | medium | User Guide: Switch examples to use plain text format instead of HTML format | rc 1 |
| #1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| #1985 | enhancement | medium | String: New Get Regexp Matches keyword |
beta 2 |
| #1990 | enhancement | medium | Avoid Python 3 incompatible type checks | beta 2 |
| #1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| #2020 | enhancement | medium | Do not write empty elements or attributes to output.xml | alpha 3 |
| #2027 | enhancement | medium | Deprecate --monitorxxx options in favor of --consolexxx |
alpha 3 |
| #2028 | enhancement | medium | Tag patterns starting with NOT |
alpha 3 |
| #2029 | enhancement | medium | When exiting gracefully, skipped tests should get automatic robot-exit tag |
alpha 3 |
| #2030 | enhancement | medium | Notify listeners about library, resource and variable file imports | beta 2 |
| #2032 | enhancement | medium | Document that test and keyword tags with robot- prefix are reserved |
alpha 3 |
| #2036 | enhancement | medium | BuiltIn.Get Variables: Support getting variables without ${} decoration |
beta 1 |
| #2038 | enhancement | medium | Consistent usage of Boolean arguments in standard libraries | beta 1 |
| #2063 | enhancement | medium | Deprecate using same setting multiple times | rc 1 |
| #1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| #1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| #1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| #1997 | bug | low | User Guide has outdated links to test templates | beta 2 |
| #2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| #2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| #2016 | bug | low | FAIL should not be useable as a normal log level |
alpha 3 |
| #2019 | bug | low | Execution directory should not be added to module search path (PYTHONPATH) |
alpha 2 |
| #2043 | bug | low | BuiltIn: Some Should keyword only consider Python True true and other values false |
beta 1 |
| #1642 | enhancement | low | Deprecate --runfailed and --rerunmerge options |
alpha 1 |
| #1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| #1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| #1898 | enhancement | low | Improve error message for "Else" instead of "ELSE" | alpha 3 |
| #1918 | enhancement | low | Deprecate old Meta: Name syntax for specifying test suite metadata |
alpha 1 |
| #1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using Set Test/Suite/Global Variable keyword |
alpha 1 |
| #1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| #1923 | enhancement | low | Remove deprecated --runmode option |
alpha 1 |
| #1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| #1925 | enhancement | low | Remove deprecated --xunitfile option |
alpha 1 |
| #1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| #1945 | enhancement | low | Enhance documentation of Run Keyword If return values |
alpha 1 |
| #2021 | enhancement | low | Update XSD schemas | alpha 3 |
| #2022 | enhancement | low | Document that preformatted text with spaces in Robot data requires escaping | beta 1 |
| #2031 | enhancement | low | Console colors and markers: Fail if given value is invalid and remove outdated FORCE color value |
alpha 3 |
| #2033 | enhancement | low | Use setuptools for installation when available |
beta 1 |
| #2037 | enhancement | low | BuiltIn.Evaluate: Support any mapping as a custom namespace |
beta 1 |
| #2039 | enhancement | low | OperatingSystem and Dialogs: Remove partial support for running without Robot Framework itself | beta 1 |
| #2041 | enhancement | low | Collections: New keyword Convert To Dictionary |
beta 1 |
| #2045 | enhancement | low | BuiltIn: Log argument types in DEBUG level not INFO | beta 1 |
Altogether 94 issues. See on issue tracker.
Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
RF 2.9 beta 2 is the fifth preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with the first release candidate. All issues targeted for RF 2.9 can be found from the issue tracker.
Most important new features in beta 2 over beta 1 are the new for-in-zip and for-in-enumerate loops (#1952) and change in syntax to adding variables to evaluation namespace of Evaluate, Run Keyword If, and other built-in keywords (#2040). The issue list at the end of this release note mentions for each feature in which preview it came, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also previous preview changes.
Questions and comments related to this release can be sent to the robotframework-users and possible bugs submitted to the issue tracker.
We have not generated windows installers for this preview, but the source distribution is available from PyPI and the standalone jar with Jython 2.7 can be found from downloads below these release notes.
If you have pip just run pip install --upgrade --pre robotframework to install or upgrade to the latest version or use pip install robotframework==2.9b2 to install exactly this version. For more details and other installation approaches see installation instructions.
Robot Framework 2.9 beta 2 was released on Thursday July 2, 2015.
Robot Framework 2.9 should, for most parts, be compatible with other projects in the larger Robot Framework ecosystem. It may, however, take some time before tools support new syntax like dictionary variables or keyword tags. Additionally, big internal changes may affect tools that have used internal APIs. Libraries and tools know not to be compatible with Robot Framework 2.9 will be listed here.
The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:
*** Variables ***
&{DICT} key=value second=2 third=${3}
The above example will create a dictionary variable &{DICT} with Python dictionary {'key': 'value', 'second': '2', 'third': 3} as the value. If a dictionary variable is used as a scalar variable like ${DICT}, it will be passed forward as a single argument containing the whole dictionary. If it used like &{DICT}, individual items are passed as named arguments. For example, these two examples are equivalent:
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}
Individual dictionary variable items can be accessed either using special &{DICT}[key] syntax similarly as individual list variable items can be accessed like @{LIST}[0]. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like ${DICT.key}. For more information about dictionary variables, see Variables section in the User Guide.
NOTE: RIDE editor does not currently support dictionary variables.
**kwargs support with user keywords using &{kwargs} syntax (#1561)New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept **kwargs. This can be accomplished simply by having a dictionary variable like &{kwargs} as the last argument in user keyword argument specification:
*** Keywords ***
Run My Process
[Arguments] @{arguments} &{configuration}
Run Process myproc.exe @{arguments} &{configuration}
Also this new functionality is explained with further examples in the User Guide.
User keywords have supported embedded arguments since RF 2.1.1 (#370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting robot_name attribute manually or by using robot.api.deco.keyword' decorator (#1835), and using${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.
from robot.api.deco import keyword
@keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
# ...
The User Guide is, again, the place where to find more information and examples.
Keywords can now have tags (#925). The tags can be added to user keywords either by new [Tags] setting, or by adding them to the last line of documentation.
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation
Library keywords can also use documentation to specify their tags or they can be added to robot_tagsattribute for each method. The keyword decorator provides a handy shortcut for specifying tags for each method.
from robot.api.deco import keyword
@keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
# ...
Libdoc will show keywords by tags (#1840) and tags can also be used to specify keywords for --removekeywords and --flattenkeywords commandline options (#1935).
It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with --prerunmodifier and --prerebotmodifier. See the issue #1976 for an example and more details.
New option --console allows changing the console output type. Possible values are verbose (default), dotted (x-unit like output where each passing test prints only a dot), quiet (no output except warnings and errors) and none (no output whatsoever). Dotted output has a shortcut --dotted or -. as a short option.
Evaluate, Run Keyword If, ... (#2040)Robot´s variables are now available with $-prefix as Python variables in evaluation namespace of BuiltIn library keywords.
The two rows below are now equivalent (assuming value of ${my var} is a string):
*** Keywords ***
My keyword
Run keyword if "${my var}" != "Foo" ... # old syntax
Run keyword if $my_var != "Foo" ... # new syntax in 2.9
NOTE: The syntax was changed in beta 2 to require the $ prefix.
FOR ... IN ZIP ... and FOR ... IN ENUMERATE (#1952)New for loop syntax allows use of for-in-zip and for-in-enumarete loops.
*** Keywords ***
For in zip example # take elements from both lists
:FOR ${number} ${name} IN ZIP ${NUMBERS} ${NAMES}
\ Number Should Be Named ${number} ${name}
For in enumerate example # take an item and an increasing index number
:FOR ${index} ${item} IN ENUMERATE @{LIST}
\ My Keyword ${index} ${item}
See the userguide for more details.
--ExitOnFailure does not work if test/suite setup/teardown fails (#2004)Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
It has been possible to use a list variable @{list} as a scalar variable ${list} since RF 2.0.3 (#117), and scalar variables containing lists have been usable as list variables since RF 2.8 (#483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:
*** Variables ***
${VAR} Scalar variable
@{VAR} List variable
This caused a lot of confusion, and the addition of &{dictionary} variables (#1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (#1905) and decide how they are used depending on the format (e.g. ${var} for scalar, @{var} for list, and &{var} for dictionary).
As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.
Local variables used to leak from test to keywords and from keywords to lower level keywords. The example below shows variable leaking from test to keyword:
*** Test Case ***
Example
${x}= Set Variable hello
My keyword
*** Keywords ***
My keyword
Should be equal ${x} hello
This behaviour was never intended, but fixing the bug can break tests where this was used either intentionally or by accident.
With the official Jython 2.7 version out, we dropped the support for Python and Jython 2.5 series. The standalone jar contains Jython 2.7 from now on.
Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.
The directory where execution is started from is not anymore added to the module search path. If it is needed, PYTHONPATH, JYTHONPATH or IRONPYTHONPATH environment variable can be explicitly set to . before execution.
robot.libraries prefix (#1737)It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like import DateTime. This caused problems in with standard libraries having same name as third party Python modules like DateTime.
To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the robot.libraries prefix like from robot.libraries import DateTime. This has also always been the recommended way and the one used in examples in the User Guide.
Earlier it was possible to disable options accepting no values like --dryrun by giving the option again like --dryrun --other options --dryrun. This was rather confusing, and nowadays it is possible to do that by using the same option with no prefix like --nodryrun instead (#1865). If option is used with and without the no prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.
BuiltIn.Call Method need to be escapedCall Method nowadays supports **kwags (#1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like hello\=world.
See issue #1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.
These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
Create Dictionary keyword moved from Collections to BuiltIn (#1913)Set Test/Suite/Global Variable keyword removed (#1919)--runmode option removed (#1923)--xunitfile option removed in favor of --xunit (#1925)ROBOT_EXIT_FOR_LOOP attribute has been removed (#1440)FAIL is no longer useable as a normal log level (#2016)FORCE color value (#2031)Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
OperatingSystem.Start Process keyword deprecated in favor of much more flexible Process.Start Process (#1773)--runfailed and --rerunmerge options deprecated in favor of --rerunfailed and --merge, respectively (#1642)Meta: Name syntax for specifying test suite metadata deprecated (#1918)DeprecatedBuiltIn and DeprecatedOperatingSystem officially deprecated (#1774)--monitorxxx options in favor of --consolexxx (#2027)Big thanks for all following contributors. Jared Hellman (@hellmanj) implemented both support for embedded arguments with library keywords (#1818) and custom library keyword names (#1835) required by it. Vinicius K. Ruoso (@vkruoso) implemented support for adding support for multiple listeners per library (#1970). Joseph Lorenzini exposed ERROR log level for keywords (#1916). Guillaume Grossetie contributed new styles for logs and report (#1943). Ed Brannin implemented FOR ... IN ZIP, FOR ... IN ENUMERATE syntax (#1954). Moon SungHoon did new Get Regexp Matches keyword to String library (#1985). Hélio Guilherme did the support for partial match with Get Lines Matching Regexp also in String library (#1836).
| ID | Type | Priority | Summary | Added In |
|---|---|---|---|---|
| #532 | bug | critical | Variables should not leak to lower level keywords | alpha 3 |
| #1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| #1561 | enhancement | critical | Support Python style **kwargs with user keywords using &{kwargs} syntax |
alpha 1 |
| #1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| #925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| #1270 | bug | high | Run Keyword If Test (Failed / Passed) does not detect failure in teardown | alpha 3 |
| #1737 | bug | high | Standard libraries should not be importable in Python w/o robot.libraries prefix |
alpha 1 |
| #1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| #2004 | bug | high | --ExitOnFailure does not work if test/suite setup/teardown fails |
alpha 2 |
| #2018 | bug | high | DateTime: DST problems when calculating with dates | alpha 3 |
| #1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| #1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| #1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| #1943 | enhancement | high | Use lighter and more neutral colors for report and log html page | beta 1 |
| #1952 | enhancement | high | FOR ... IN ZIP ... and FOR ... IN ENUMERATE |
beta 2 |
| #1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| #1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| #1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| #2040 | enhancement | high | Add variables to evaluation namespace of Evaluate, Run Keyword If, ... |
beta 2 |
| #293 | enhancement | high | Support reloading library | alpha 2 |
| #317 | enhancement | high | Less verbose and quiet console outputs | alpha 3 |
| #1611 | bug | medium | Variable assignment should not be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs |
alpha 2 |
| #1900 | bug | medium | Log messages lost if library __init__ imports or initializes other libraries |
alpha 1 |
| #1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| #1992 | bug | medium | Listeners are not unregistered when using TestSuite.run API |
alpha 2 |
| #1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| #1603 | enhancement | medium | Support **kwargs with BuiltIn.Call Method keywords |
alpha 1 |
| #1728 | enhancement | medium | Support setting child suite variables with Set Suite Variable |
beta 1 |
| #1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| #1773 | enhancement | medium | Deprecate OperatingSystem.Start Process keyword |
alpha 1 |
| #1774 | enhancement | medium | Officially deprecate DeprecatedBuiltIn and DeprecatedOperatingSystem |
alpha 1 |
| #1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| #1834 | enhancement | medium | String: Support partial match with Get Lines Matching RegExp |
beta 2 |
| #1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| #1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| #1865 | enhancement | medium | Support disabling command line options accepting no values using no prefix (e.g. --dryrun -> --nodryrun) |
alpha 1 |
| #1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| #1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| #1913 | enhancement | medium | Move Create Dictionary to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. |
alpha 1 |
| #1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| #1916 | enhancement | medium | Expose ERROR log level to custom libraries |
alpha 3 |
| #1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| #1935 | enhancement | medium | Support keyword tags with --flattenkeywords and --removekeywords |
alpha 2 |
| #1958 | enhancement | medium | Log Many: Support logging &{dictionary} variable items |
alpha 1 |
| #1959 | enhancement | medium | Wait Until Keyword Succeeds: Support giving wait time as number of times to retry |
alpha 1 |
| #1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| #1969 | enhancement | medium | Allow giving listener and model modifier instances to robot.run and TestSuite.run |
alpha 3 |
| #1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| #1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| #1985 | enhancement | medium | String: New Get Regexp Matches keyword |
beta 2 |
| #1990 | enhancement | medium | Avoid Python 3 incompatible type checks | beta 2 |
| #1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| #2020 | enhancement | medium | Do not write empty elements or attributes to output.xml | alpha 3 |
| #2027 | enhancement | medium | Deprecate --monitorxxx options in favor of --consolexxx |
alpha 3 |
| #2028 | enhancement | medium | Tag patterns starting with NOT |
alpha 3 |
| #2029 | enhancement | medium | When exiting gracefully, skipped tests should get automatic robot-exit tag |
alpha 3 |
| #2030 | enhancement | medium | Notify listeners about library, resource and variable file imports | beta 2 |
| #2032 | enhancement | medium | Document that test and keyword tags with robot- prefix are reserved |
alpha 3 |
| #2036 | enhancement | medium | BuiltIn.Get Variables: Support getting variables without ${} decoration |
beta 1 |
| #2038 | enhancement | medium | Consistent usage of Boolean arguments in standard libraries | beta 1 |
| #1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| #1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| #1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| #1997 | bug | low | User Guide has outdated links to test templates | beta 2 |
| #2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| #2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| #2016 | bug | low | FAIL should not be useable as a normal log level |
alpha 3 |
| #2019 | bug | low | Execution directory should not be added to module search path (PYTHONPATH) |
alpha 2 |
| #2043 | bug | low | BuiltIn: Some Should keyword only consider Python True true and other values false |
beta 1 |
| #1642 | enhancement | low | Deprecate --runfailed and --rerunmerge options |
alpha 1 |
| #1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| #1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| #1898 | enhancement | low | Improve error message for "Else" instead of "ELSE" | alpha 3 |
| #1918 | enhancement | low | Deprecate old Meta: Name syntax for specifying test suite metadata |
alpha 1 |
| #1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using Set Test/Suite/Global Variable keyword |
alpha 1 |
| #1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| #1923 | enhancement | low | Remove deprecated --runmode option |
alpha 1 |
| #1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| #1925 | enhancement | low | Remove deprecated --xunitfile option |
alpha 1 |
| #1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| #1945 | enhancement | low | Enhance documentation of Run Keyword If return values |
alpha 1 |
| #2021 | enhancement | low | Update XSD schemas | alpha 3 |
| #2022 | enhancement | low | Document that preformatted text with spaces in Robot data requires escaping | beta 1 |
| #2031 | enhancement | low | Console colors and markers: Fail if given value is invalid and remove outdated FORCE color value |
alpha 3 |
| #2033 | enhancement | low | Use setuptools for installation when available |
beta 1 |
| #2037 | enhancement | low | BuiltIn.Evaluate: Support any mapping as a custom namespace |
beta 1 |
| #2039 | enhancement | low | OperatingSystem and Dialogs: Remove partial support for running without Robot Framework itself | beta 1 |
| #2041 | enhancement | low | Collections: New keyword Convert To Dictionary |
beta 1 |
| #2045 | enhancement | low | BuiltIn: Log argument types in DEBUG level not INFO | beta 1 |
Altogether 89 issues. See on issue tracker.
Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
RF 2.9 beta 1 is the fourth preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with the first release candidate. All issues targeted for RF 2.9 can be found from the issue tracker.
Most important new features in beta 1 over alpha 3 are lighter and more neutral colors for report and log html page (#1943) and adding variables to evaluation namespace of Evaluate, Run Keyword If, and other built-in keywords (#2040). The issue list at the end of this release note mentions for each feature in which preview it came, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also previous preview changes.
Questions and comments related to this release can be sent to the robotframework-users and possible bugs submitted to the issue tracker.
We have not generated windows installers for this preview, but the source distribution is available from PyPI and the standalone jar with Jython 2.7 can be found from downloads below these release notes.
If you have pip just run pip install --upgrade --pre robotframework to install or upgrade to the latest version or use pip install robotframework==2.9b1 to install exactly this version. For more details and other installation approaches see installation instructions.
Robot Framework 2.9 beta 1 was released on Friday June 26, 2015.
Robot Framework 2.9 should, for most parts, be compatible with other projects in the larger Robot Framework ecosystem. It may, however, take some time before tools support new syntax like dictionary variables or keyword tags. Additionally, big internal changes may affect tools that have used internal APIs. Libraries and tools know not to be compatible with Robot Framework 2.9 will be listed here.
The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:
*** Variables ***
&{DICT} key=value second=2 third=${3}
The above example will create a dictionary variable &{DICT} with Python dictionary {'key': 'value', 'second': '2', 'third': 3} as the value. If a dictionary variable is used as a scalar variable like ${DICT}, it will be passed forward as a single argument containing the whole dictionary. If it used like &{DICT}, individual items are passed as named arguments. For example, these two examples are equivalent:
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}
Individual dictionary variable items can be accessed either using special &{DICT}[key] syntax similarly as individual list variable items can be accessed like @{LIST}[0]. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like ${DICT.key}. For more information about dictionary variables, see Variables section in the User Guide.
NOTE: RIDE editor does not currently support dictionary variables.
**kwargs support with user keywords using &{kwargs} syntax (#1561)New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept **kwargs. This can be accomplished simply by having a dictionary variable like &{kwargs} as the last argument in user keyword argument specification:
*** Keywords ***
Run My Process
[Arguments] @{arguments} &{configuration}
Run Process myproc.exe @{arguments} &{configuration}
Also this new functionality is explained with further examples in the User Guide.
User keywords have supported embedded arguments since RF 2.1.1 (#370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting robot_name attribute manually or by using robot.api.deco.keyword' decorator (#1835), and using${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.
from robot.api.deco import keyword
@keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
# ...
The User Guide is, again, the place where to find more information and examples.
Keywords can now have tags (#925). The tags can be added to user keywords either by new [Tags] setting, or by adding them to the last line of documentation.
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation
Library keywords can also use documentation to specify their tags or they can be added to robot_tagsattribute for each method. The keyword decorator provides a handy shortcut for specifying tags for each method.
from robot.api.deco import keyword
@keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
# ...
Libdoc will show keywords by tags (#1840) and tags can also be used to specify keywords for --removekeywords and --flattenkeywords commandline options (#1935).
It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with --prerunmodifier and --prerebotmodifier. See the issue #1976 for an example and more details.
New option --console allows changing the console output type. Possible values are verbose (default), dotted (x-unit like output where each passing test prints only a dot), quiet (no output except warnings and errors) and none (no output whatsoever). Dotted output has a shortcut --dotted or -. as a short option.
Evaluate, Run Keyword If, ... (#2040)Robot´s variables are now available as Python variables in evaluation namespace of BuiltIn library keywords.
The two rows below are now equivalent (assuming value of ${my var} is a string):
*** Keywords ***
My keyword
Run keyword if "${my var}" != "Foo" ... # old syntax
Run keyword if my_var != "Foo" ... # new syntax in 2.9
NOTE: The syntax will be changed in beta 2 so that a $ prefix is required like in $my_var.
--ExitOnFailure does not work if test/suite setup/teardown fails (#2004)Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
It has been possible to use a list variable @{list} as a scalar variable ${list} since RF 2.0.3 (#117), and scalar variables containing lists have been usable as list variables since RF 2.8 (#483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:
*** Variables ***
${VAR} Scalar variable
@{VAR} List variable
This caused a lot of confusion, and the addition of &{dictionary} variables (#1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (#1905) and decide how they are used depending on the format (e.g. ${var} for scalar, @{var} for list, and &{var} for dictionary).
As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.
Local variables used to leak from test to keywords and from keywords to lower level keywords. The example below shows variable leaking from test to keyword:
*** Test Case ***
Example
${x}= Set Variable hello
My keyword
*** Keywords ***
My keyword
Should be equal ${x} hello
This behaviour was never intended, but fixing the bug can break tests where this was used either intentionally or by accident.
With the official Jython 2.7 version out, we dropped the support for Python and Jython 2.5 series. The standalone jar contains Jython 2.7 from now on.
Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.
The directory where execution is started from is not anymore added to the module search path. If it is needed, PYTHONPATH, JYTHONPATH or IRONPYTHONPATH environment variable can be explicitly set to . before execution.
robot.libraries prefix (#1737)It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like import DateTime. This caused problems in with standard libraries having same name as third party Python modules like DateTime.
To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the robot.libraries prefix like from robot.libraries import DateTime. This has also always been the recommended way and the one used in examples in the User Guide.
Earlier it was possible to disable options accepting no values like --dryrun by giving the option again like --dryrun --other options --dryrun. This was rather confusing, and nowadays it is possible to do that by using the same option with no prefix like --nodryrun instead (#1865). If option is used with and without the no prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.
BuiltIn.Call Method need to be escapedCall Method nowadays supports **kwags (#1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like hello\=world.
See issue #1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.
These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
Create Dictionary keyword moved from Collections to BuiltIn (#1913)Set Test/Suite/Global Variable keyword removed (#1919)--runmode option removed (#1923)--xunitfile option removed in favor of --xunit (#1925)ROBOT_EXIT_FOR_LOOP attribute has been removed (#1440)FAIL is no longer useable as a normal log level (#2016)FORCE color value (#2031)Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
OperatingSystem.Start Process keyword deprecated in favor of much more flexible Process.Start Process (#1773)--runfailed and --rerunmerge options deprecated in favor of --rerunfailed and --merge, respectively (#1642)Meta: Name syntax for specifying test suite metadata deprecated (#1918)DeprecatedBuiltIn and DeprecatedOperatingSystem officially deprecated (#1774)--monitorxxx options in favor of --consolexxx (#2027)Big thanks for all following contributors. Jared Hellman (@hellmanj) implemented both support for embedded arguments with library keywords (#1818) and custom library keyword names (#1835) required by it. Vinicius K. Ruoso (@vkruoso) implemented support for adding support for multiple listeners per library (#1970). Joseph Lorenzini exposed ERROR log level for keywords (#1916). Guillaume Grossetie contributed new styles for logs and report (#1943).
| ID | Type | Priority | Summary | Added In |
|---|---|---|---|---|
| #532 | bug | critical | Variables should not leak to lower level keywords | alpha 3 |
| #1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| #1561 | enhancement | critical | Support Python style **kwargs with user keywords using &{kwargs} syntax |
alpha 1 |
| #1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| #925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| #1270 | bug | high | Run Keyword If Test (Failed / Passed) does not detect failure in teardown | alpha 3 |
| #1737 | bug | high | Standard libraries should not be importable in Python w/o robot.libraries prefix |
alpha 1 |
| #1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| #2004 | bug | high | --ExitOnFailure does not work if test/suite setup/teardown fails |
alpha 2 |
| #2018 | bug | high | DateTime: DST problems when calculating with dates | alpha 3 |
| #1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| #1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| #1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| #1943 | enhancement | high | Use lighter and more neutral colors for report and log html page | beta 1 |
| #1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| #1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| #1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| #2040 | enhancement | high | Add variables to evaluation namespace of Evaluate, Run Keyword If, ... |
beta 1 |
| #293 | enhancement | high | Support reloading library | alpha 2 |
| #317 | enhancement | high | Less verbose and quiet console outputs | alpha 3 |
| #1611 | bug | medium | Variable assignment should not be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs |
alpha 2 |
| #1900 | bug | medium | Log messages lost if library __init__ imports or initializes other libraries |
alpha 1 |
| #1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| #1992 | bug | medium | Listeners are not unregistered when using TestSuite.run API |
alpha 2 |
| #1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| #1603 | enhancement | medium | Support **kwargs with BuiltIn.Call Method keywords |
alpha 1 |
| #1728 | enhancement | medium | Support setting child suite variables with Set Suite Variable |
beta 1 |
| #1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| #1773 | enhancement | medium | Deprecate OperatingSystem.Start Process keyword |
alpha 1 |
| #1774 | enhancement | medium | Officially deprecate DeprecatedBuiltIn and DeprecatedOperatingSystem |
alpha 1 |
| #1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| #1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| #1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| #1865 | enhancement | medium | Support disabling command line options accepting no values using no prefix (e.g. --dryrun -> --nodryrun) |
alpha 1 |
| #1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| #1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| #1913 | enhancement | medium | Move Create Dictionary to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. |
alpha 1 |
| #1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| #1916 | enhancement | medium | Expose ERROR log level to custom libraries |
alpha 3 |
| #1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| #1935 | enhancement | medium | Support keyword tags with --flattenkeywords and --removekeywords |
alpha 2 |
| #1958 | enhancement | medium | Log Many: Support logging &{dictionary} variable items |
alpha 1 |
| #1959 | enhancement | medium | Wait Until Keyword Succeeds: Support giving wait time as number of times to retry |
alpha 1 |
| #1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| #1969 | enhancement | medium | Allow giving listener and model modifier instances to robot.run and TestSuite.run |
alpha 3 |
| #1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| #1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| #1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| #2020 | enhancement | medium | Do not write empty elements or attributes to output.xml | alpha 3 |
| #2027 | enhancement | medium | Deprecate --monitorxxx options in favor of --consolexxx |
alpha 3 |
| #2028 | enhancement | medium | Tag patterns starting with NOT |
alpha 3 |
| #2029 | enhancement | medium | When exiting gracefully, skipped tests should get automatic robot-exit tag |
alpha 3 |
| #2032 | enhancement | medium | Document that test and keyword tags with robot- prefix are reserved |
alpha 3 |
| #2036 | enhancement | medium | BuiltIn.Get Variables: Support getting variables without ${} decoration |
beta 1 |
| #2038 | enhancement | medium | Consistent usage of Boolean arguments in standard libraries | beta 1 |
| #1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| #1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| #1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| #2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| #2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| #2016 | bug | low | FAIL should not be useable as a normal log level |
alpha 3 |
| #2019 | bug | low | Execution directory should not be added to module search path (PYTHONPATH) |
alpha 2 |
| #2043 | bug | low | BuiltIn: Some Should keyword only consider Python True true and other values false |
beta 1 |
| #1642 | enhancement | low | Deprecate --runfailed and --rerunmerge options |
alpha 1 |
| #1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| #1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| #1898 | enhancement | low | Improve error message for "Else" instead of "ELSE" | alpha 3 |
| #1918 | enhancement | low | Deprecate old Meta: Name syntax for specifying test suite metadata |
alpha 1 |
| #1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using Set Test/Suite/Global Variable keyword |
alpha 1 |
| #1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| #1923 | enhancement | low | Remove deprecated --runmode option |
alpha 1 |
| #1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| #1925 | enhancement | low | Remove deprecated --xunitfile option |
alpha 1 |
| #1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| #1945 | enhancement | low | Enhance documentation of Run Keyword If return values |
alpha 1 |
| #2021 | enhancement | low | Update XSD schemas | alpha 3 |
| #2022 | enhancement | low | Document that preformatted text with spaces in Robot data requires escaping | beta 1 |
| #2031 | enhancement | low | Console colors and markers: Fail if given value is invalid and remove outdated FORCE color value |
alpha 3 |
| #2033 | enhancement | low | Use setuptools for installation when available |
beta 1 |
| #2037 | enhancement | low | BuiltIn.Evaluate: Support any mapping as a custom namespace |
beta 1 |
| #2039 | enhancement | low | OperatingSystem and Dialogs: Remove partial support for running without Robot Framework itself | beta 1 |
| #2041 | enhancement | low | Collections: New keyword Convert To Dictionary |
beta 1 |
| #2045 | enhancement | low | BuiltIn: Log argument types in DEBUG level not INFO | beta 1 |
Altogether 83 issues. See on issue tracker.
Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
RF 2.9 alpha 3 is the third preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with beta 1. All issues targeted for RF 2.9 can be found from the issue tracker.
Most important new features in alpha 3 over alpha 2 are that the variables no longer leak to lower level keywords (#532) and the new less verbose console output (#317). The issue list at the end of this release note mentions for each feature in which preview it came, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also the alpha 1 and 2 changes.
Questions and comments related to this release can be sent to the robotframework-users and possible bugs submitted to the issue tracker.
We have not generated windows installers for this preview, but the source distribution is available from PyPI and the standalone jar with Jython 2.7 can be found from downloads below these release notes.
If you have pip just run pip install --upgrade --pre robotframework to install or upgrade to the latest version or use pip install robotframework==2.9a3 to install exactly this version. For more details and other installation approaches see installation instructions.
Robot Framework 2.9 alpha 3 was released on Thursday June 18, 2015.
Robot Framework 2.9 should, for most parts, be compatible with other projects in the larger Robot Framework ecosystem. It may, however, take some time before tools support new syntax like dictionary variables or keyword tags. Additionally, big internal changes may affect tools that have used internal APIs. Libraries and tools know not to be compatible with Robot Framework 2.9 will be listed here.
The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:
*** Variables ***
&{DICT} key=value second=2 third=${3}
The above example will create a dictionary variable &{DICT} with Python dictionary {'key': 'value', 'second': '2', 'third': 3} as the value. If a dictionary variable is used as a scalar variable like ${DICT}, it will be passed forward as a single argument containing the whole dictionary. If it used like &{DICT}, individual items are passed as named arguments. For example, these two examples are equivalent:
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}
Individual dictionary variable items can be accessed either using special &{DICT}[key] syntax similarly as individual list variable items can be accessed like @{LIST}[0]. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like ${DICT.key}. For more information about dictionary variables, see Variables section in the User Guide.
NOTE: RIDE editor does not currently support dictionary variables.
**kwargs support with user keywords using &{kwargs} syntax (#1561)New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept **kwargs. This can be accomplished simply by having a dictionary variable like &{kwargs} as the last argument in user keyword argument specification:
*** Keywords ***
Run My Process
[Arguments] @{arguments} &{configuration}
Run Process myproc.exe @{arguments} &{configuration}
Also this new functionality is explained with further examples in the User Guide.
User keywords have supported embedded arguments since RF 2.1.1 (#370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting robot_name attribute manually or by using robot.api.deco.keyword' decorator (#1835), and using${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.
from robot.api.deco import keyword
@keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
# ...
The User Guide is, again, the place where to find more information and examples.
Keywords can now have tags (#925). The tags can be added to user keywords either by new [Tags] setting, or by adding them to the last line of documentation.
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation
Library keywords can also use documentation to specify their tags or they can be added to robot_tagsattribute for each method. The keyword decorator provides a handy shortcut for specifying tags for each method.
from robot.api.deco import keyword
@keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
# ...
Libdoc will show keywords by tags (#1840) and tags can also be used to specify keywords for --removekeywords and --flattenkeywords commandline options (#1935).
It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with --prerunmodifier and --prerebotmodifier. See the issue #1976 for an example and more details.
New option --console allows changing the console output type. Possible values are verbose (default), dotted (x-unit like output where each passing test prints only a dot), quiet (no output except warnings and errors) and none (no output whatsoever). Dotted output has a shortcut --dotted or -. as a short option.
--ExitOnFailure does not work if test/suite setup/teardown fails (#2004)Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
It has been possible to use a list variable @{list} as a scalar variable ${list} since RF 2.0.3 (#117), and scalar variables containing lists have been usable as list variables since RF 2.8 (#483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:
*** Variables ***
${VAR} Scalar variable
@{VAR} List variable
This caused a lot of confusion, and the addition of &{dictionary} variables (#1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (#1905) and decide how they are used depending on the format (e.g. ${var} for scalar, @{var} for list, and &{var} for dictionary).
As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.
Local variables used to leak from test to keywords and from keywords to lower level keywords. The example below shows variable leaking from test to keyword:
*** Test Case ***
Example
${x}= Set Variable hello
My keyword
*** Keywords ***
My keyword
Should be equal ${x} hello
This behaviour was never intended, but fixing the bug can break tests where this was used either intentionally or by accident.
With the official Jython 2.7 version out, we dropped the support for Python and Jython 2.5 series. The standalone jar contains Jython 2.7 from now on.
Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.
The directory where execution is started from is not anymore added to the module search path. If it is needed, PYTHONPATH, JYTHONPATH or IRONPYTHONPATH environment variable can be explicitly set to . before execution.
robot.libraries prefix (#1737)It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like import DateTime. This caused problems in with standard libraries having same name as third party Python modules like DateTime.
To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the robot.libraries prefix like from robot.libraries import DateTime. This has also always been the recommended way and the one used in examples in the User Guide.
Earlier it was possible to disable options accepting no values like --dryrun by giving the option again like --dryrun --other options --dryrun. This was rather confusing, and nowadays it is possible to do that by using the same option with no prefix like --nodryrun instead (#1865). If option is used with and without the no prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.
BuiltIn.Call Method need to be escapedCall Method nowadays supports **kwags (#1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like hello\=world.
See issue #1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.
These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
Create Dictionary keyword moved from Collections to BuiltIn (#1913)Set Test/Suite/Global Variable keyword removed (#1919)--runmode option removed (#1923)--xunitfile option removed in favor of --xunit (#1925)ROBOT_EXIT_FOR_LOOP attribute has been removed (#1440)FAIL is no longer useable as a normal log level (#2016)FORCE color value (#2031)Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
OperatingSystem.Start Process keyword deprecated in favor of much more flexible Process.Start Process (#1773)--runfailed and --rerunmerge options deprecated in favor of --rerunfailed and --merge, respectively (#1642)Meta: Name syntax for specifying test suite metadata deprecated (#1918)DeprecatedBuiltIn and DeprecatedOperatingSystem officially deprecated (#1774)--monitorxxx options in favor of --consolexxx (#2027)Big thanks for all following contributors. Jared Hellman (@hellmanj) implemented both support for embedded arguments with library keywords (#1818) and custom library keyword names (#1835) required by it. Vinicius K. Ruoso (@vkruoso) implemented support for adding support for multiple listeners per library (#1970). Joseph Lorenzini exposed ERROR log level for keywords (#1916).
| ID | Type | Priority | Summary | Added In |
|---|---|---|---|---|
| #532 | bug | critical | Variables should not leak to lower level keywords | alpha 3 |
| #1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| #1561 | enhancement | critical | Support Python style **kwargs with user keywords using &{kwargs} syntax |
alpha 1 |
| #1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| #925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| #1270 | bug | high | Run Keyword If Test (Failed / Passed) does not detect failure in teardown | alpha 3 |
| #1737 | bug | high | Standard libraries should not be importable in Python w/o robot.libraries prefix |
alpha 1 |
| #1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| #2004 | bug | high | --ExitOnFailure does not work if test/suite setup/teardown fails |
alpha 2 |
| #2018 | bug | high | DateTime: DST problems when calculating with dates | alpha 3 |
| #1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| #1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| #1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| #1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| #1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| #1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| #293 | enhancement | high | Support reloading library | alpha 2 |
| #317 | enhancement | high | Less verbose and quiet console outputs | alpha 3 |
| #1611 | bug | medium | Variable assignment should not be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs |
alpha 2 |
| #1900 | bug | medium | Log messages lost if library __init__ imports or initializes other libraries |
alpha 1 |
| #1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| #1992 | bug | medium | Listeners are not unregistered when using TestSuite.run API |
alpha 2 |
| #1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| #1603 | enhancement | medium | Support **kwargs with BuiltIn.Call Method keywords |
alpha 1 |
| #1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| #1773 | enhancement | medium | Deprecate OperatingSystem.Start Process keyword |
alpha 1 |
| #1774 | enhancement | medium | Officially deprecate DeprecatedBuiltIn and DeprecatedOperatingSystem |
alpha 1 |
| #1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| #1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| #1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| #1865 | enhancement | medium | Support disabling command line options accepting no values using no prefix (e.g. --dryrun -> --nodryrun) |
alpha 1 |
| #1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| #1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| #1913 | enhancement | medium | Move Create Dictionary to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. |
alpha 1 |
| #1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| #1916 | enhancement | medium | Expose ERROR log level to custom libraries |
alpha 3 |
| #1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| #1935 | enhancement | medium | Support keyword tags with --flattenkeywords and --removekeywords |
alpha 2 |
| #1958 | enhancement | medium | Log Many: Support logging &{dictionary} variable items |
alpha 1 |
| #1959 | enhancement | medium | Wait Until Keyword Succeeds: Support giving wait time as number of times to retry |
alpha 1 |
| #1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| #1969 | enhancement | medium | Allow giving listener and model modifier instances to robot.run and TestSuite.run |
alpha 3 |
| #1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| #1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| #1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| #2020 | enhancement | medium | Do not write empty elements or attributes to output.xml | alpha 3 |
| #2027 | enhancement | medium | Deprecate --monitorxxx options in favor of --consolexxx |
alpha 3 |
| #2029 | enhancement | medium | When exiting gracefully, skipped tests should get automatic robot-exit tag |
alpha 3 |
| #2032 | enhancement | medium | Document that test and keyword tags with robot- prefix are reserved |
alpha 3 |
| #1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| #1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| #1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| #2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| #2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| #2016 | bug | low | FAIL should not be useable as a normal log level |
alpha 3 |
| #2019 | bug | low | Execution directory should not be added to module search path (PYTHONPATH) |
alpha 2 |
| #1642 | enhancement | low | Deprecate --runfailed and --rerunmerge options |
alpha 1 |
| #1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| #1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| #1898 | enhancement | low | Improve error message for "Else" instead of "ELSE" | alpha 3 |
| #1918 | enhancement | low | Deprecate old Meta: Name syntax for specifying test suite metadata |
alpha 1 |
| #1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using Set Test/Suite/Global Variable keyword |
alpha 1 |
| #1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| #1923 | enhancement | low | Remove deprecated --runmode option |
alpha 1 |
| #1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| #1925 | enhancement | low | Remove deprecated --xunitfile option |
alpha 1 |
| #1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| #1945 | enhancement | low | Enhance documentation of Run Keyword If return values |
alpha 1 |
| #2021 | enhancement | low | Update XSD schemas | alpha 3 |
| #2028 | enhancement | low | Tag patterns starting with NOT | alpha 3 |
| #2031 | enhancement | low | Console colors and markers: Fail if given value is invalid and remove outdated FORCE color value |
alpha 3 |
Altogether 71 issues. See on issue tracker.
Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
RF 2.9 alpha 2 is the second preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with alpha 3. All issues targeted for RF 2.9 can be found from the issue tracker.
Most important new feature in alpha 2 over alpha 1 is the keyword tags support (#925). The issue list at the end of this release note mentions for each feature whether it came in alpha 1 or 2, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also the alpha 1 changes.
Questions and comments related to this release can be sent to the robotframework-users and possible bugs submitted to the issue tracker.
We have not generated windows installers for this preview, but the source distribution is available from PyPI and the standalone jar with Jython 2.7 can be found from downloads below these release notes.
If you have pip just run pip install --update --pre robotframework to install or upgrade to the latest version or use pip install robotframework==2.9a2 to install exactly this version. For more details and other installation approaches see installation instructions.
Robot Framework 2.9 alpha 2 was released on Friday June 05, 2015.
The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:
*** Variables ***
&{DICT} key=value second=2 third=${3}
The above example will create a dictionary variable &{DICT} with Python dictionary {'key': 'value', 'second': '2', 'third': 3} as the value. If a dictionary variable is used as a scalar variable like ${DICT}, it will be passed forward as a single argument containing the whole dictionary. If it used like &{DICT}, individual items are passed as named arguments. For example, these two examples are equivalent:
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}
Individual dictionary variable items can be accessed either using special &{DICT}[key] syntax similarly as individual list variable items can be accessed like @{LIST}[0]. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like ${DICT.key}. For more information about dictionary variables, see Variables section the User Guide.
NOTE: RIDE editor does not currently support dictionary variables.
**kwargs support with user keywords using &{kwargs} syntax (#1561)New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept **kwargs. This can be accomplished simply by having a dictionary variable like &{kwargs} as the last argument in user keyword argument specification:
*** Keywords ***
Run My Process
[Arguments] @{arguments} &{configuration}
Run Process myproc.exe @{arguments} &{configuration}
Also this new functionality is explained with further examples in the User Guide.
User keywords have supported embedded arguments since RF 2.1.1 (#370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting robot_name attribute manually or by using robot.api.deco.keyword' decorator (#1835), and using${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.
from robot.api.deco import keyword
@keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
# ...
The User Guide is, again, the place where to find more information and examples.
Keywords can now have tags (#925). The tags can be added to user keywords either by new [Tags] setting, or by adding them to the last line of documentation.
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation
Library keywords can also use documentation to specify their tags or they can be added to robot_tagsattribute for each method. The keyword decorator provides a handy shortcut for specifying tags for each method.
from robot.api.deco import keyword
@keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
# ...
Libdoc will show keywords by tags (#1840) and tags can also be used to specify keywords for --removekeywords and --flattenkeywords commandline options (#1935).
It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with --prerunmodifier and --prerebotmodifier. See the issue #1976 for an example and more details.
--ExitOnFailure does not work if test/suite setup/teardown fails (#2004)Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
It has been possible to use a list variable @{list} as a scalar variable ${list} since RF 2.0.3 (#117), and scalar variables containing lists have been usable as list variables since RF 2.8 (#483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:
*** Variables ***
${VAR} Scalar variable
@{VAR} List variable
This caused a lot of confusion, and the addition of &{dictionary} variables (#1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (#1905) and decide how they are used depending on the format (e.g. ${var} for scalar, @{var} for list, and &{var} for dictionary).
As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.
Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.
The directory where execution is started from is not anymore added to the module search path. If it is needed, PYTHONPATH, JYTHONPATH or IRONPYTHONPATH environment variable can be explicitly set to . before execution.
robot.libraries prefix (#1737)It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like import DateTime. This caused problems in with standard libraries having same name as third party Python modules like DateTime.
To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the robot.libraries prefix like from robot.libraries import DateTime. This has also always been the recommended way and the one used in examples in the User Guide.
Earlier it was possible to disable options accepting no values like --dryrun by giving the option again like --dryrun --other options --dryrun. This was rather confusing, and nowadays it is possible to do that by using the same option with no prefix like --nodryrun instead (#1865). If option is used with and without the no prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.
BuiltIn.Call Method need to be escapedCall Method nowadays supports **kwags (#1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like hello\=world.
See issue #1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.
These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
Create Dictionary keyword moved from Collections to BuiltIn (#1913)Set Test/Suite/Global Variable keyword removed (#1919)--runmode option removed (#1923)--xunitfile option removed in favor of --xunit (#1925)ROBOT_EXIT_FOR_LOOP attribute has been removed (#1440)Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
OperatingSystem.Start Process keyword deprecated in favor of much more flexible Process.Start Process (#1773)--runfailed and --rerunmerge options deprecated in favor of --rerunfailed and --merge, respectively (#1642)Meta: Name syntax for specifying test suite metadata deprecated (#1918)DeprecatedBuiltIn and DeprecatedOperatingSystem officially deprecated (#1774)Big thanks for all following contributors. Jared Hellman (@hellmanj) implemented both support for embedded arguments with library keywords (#1818) and custom library keyword names (#1835) required by it. Vinicius K. Ruoso (@vkruoso) implemented support for adding support for multiple listeners per library (#1970).
| ID | Type | Priority | Summary | Added In |
|---|---|---|---|---|
| #1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| #1561 | enhancement | critical | Support Python style **kwargs with user keywords using &{kwargs} syntax |
alpha 1 |
| #1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| #925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| #1737 | bug | high | Standard libraries should not be importable in Python w/o robot.libraries prefix |
alpha 1 |
| #1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| #2004 | bug | high | --ExitOnFailure does not work if test/suite setup/teardown fails |
alpha 2 |
| #1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| #1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| #1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| #1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| #1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| #1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| #293 | enhancement | high | Support reloading library | alpha 2 |
| #1611 | bug | medium | Variable assignment should not be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs | alpha 2 |
| #1900 | bug | medium | Log messages lost if library __init__ imports or initializes other libraries |
alpha 1 |
| #1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| #1992 | bug | medium | Listeners are not unregistered when using TestSuite.run API |
alpha 2 |
| #1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| #1603 | enhancement | medium | Support **kwargs with BuiltIn.Call Method keywords |
alpha 1 |
| #1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| #1773 | enhancement | medium | Deprecate OperatingSystem.Start Process keyword |
alpha 1 |
| #1774 | enhancement | medium | Officially deprecate DeprecatedBuiltIn and DeprecatedOperatingSystem |
alpha 1 |
| #1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| #1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| #1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| #1865 | enhancement | medium | Support disabling command line options accepting no values using no prefix (e.g. --dryrun -> --nodryrun) |
alpha 1 |
| #1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| #1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| #1913 | enhancement | medium | Move Create Dictionary to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. |
alpha 1 |
| #1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| #1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| #1935 | enhancement | medium | Support keyword tags with --flattenkeywords and --removekeywords |
alpha 2 |
| #1958 | enhancement | medium | Log Many: Support logging &{dictionary} variable items |
alpha 1 |
| #1959 | enhancement | medium | Wait Until Keyword Succeeds: Support giving wait time as number of times to retry |
alpha 1 |
| #1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| #1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| #1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| #1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| #1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| #1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| #1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| #2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| #2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| #2019 | bug | low | Execution directory should not be added to module search path (PYTHONPATH) |
alpha 2 |
| #1642 | enhancement | low | Deprecate --runfailed and --rerunmerge options |
alpha 1 |
| #1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| #1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| #1918 | enhancement | low | Deprecate old Meta: Name syntax for specifying test suite metadata |
alpha 1 |
| #1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using Set Test/Suite/Global Variable keyword |
alpha 1 |
| #1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| #1923 | enhancement | low | Remove deprecated --runmode option |
alpha 1 |
| #1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| #1925 | enhancement | low | Remove deprecated --xunitfile option |
alpha 1 |
| #1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| #1945 | enhancement | low | Enhance documentation of Run Keyword If return values |
alpha 1 |
Altogether 56 issues. See on issue tracker.
Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
RF 2.9 alpha 1 is the first preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with alpha 2 with keyword tagging and other interesting new features. All issues targeted for RF 2.9 can be found from the issue tracker.
Questions and comments related to this release can be sent to the robotframework-users and possible bugs submitted to the issue tracker.
We have not generated windows installers or standalone jar for this preview, but the source distribution is available from PyPI.
If you have pip just run pip install --update --pre robotframework to install or upgrade to the latest version or use pip install robotframework==2.9a1 to install exactly this version. For more details and other installation approaches see installation instructions.
Robot Framework 2.9 alpha 1 was released on Friday April 10, 2015.
The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:
*** Variables ***
&{DICT} key=value second=2 third=${3}
The above example will create a dictionary variable &{DICT} with Python dictionary {'key': 'value', 'second': '2', 'third': 3} as the value. If a dictionary variable is used as a scalar variable like ${DICT}, it will be passed forward as a single argument containing the whole dictionary. If it used like &{DICT}, individual items are passed as named arguments. For example, these two examples are equivalent:
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}
Individual dictionary variable items can be accessed either using special &{DICT}[key] syntax similarly as individual list variable items can be accessed like @{LIST}[0]. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like ${DICT.key}. For more information about dictionary variables, see Variables section the User Guide.
NOTE: RIDE editor does not currently support dictionary variables.
**kwargs support with user keywords using &{kwargs} syntax (#1561)New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept **kwargs. This can be accomplished simply by having a dictionary variable like &{kwargs} as the last argument in user keyword argument specification:
*** Keywords ***
Run My Process
[Arguments] @{arguments} &{configuration}
Run Process myproc.exe @{arguments} &{configuration}
Also this new functionality is explained with further examples in the User Guide.
User keywords have supported embedded arguments since RF 2.1.1 (#370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting robot_name attribute manually or by using robot.api.deco.keyword' decorator (#1835), and using${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.
from robot.api.deco import keyword
@keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
# ...
The User Guide is, again, the place where to find more information and examples.
Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.
It has been possible to use a list variable @{list} as a scalar variable ${list} since RF 2.0.3 (#117), and scalar variables containing lists have been usable as list variables since RF 2.8 (#483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:
*** Variables ***
${VAR} Scalar variable
@{VAR} List variable
This caused a lot of confusion, and the addition of &{dictionary} variables (#1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (#1905) and decide how they are used depending on the format (e.g. ${var} for scalar, @{var} for list, and &{var} for dictionary).
As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.
robot.libraries prefix (#1737)It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like import DateTime. This caused problems in with standard libraries having same name as third party Python modules like DateTime.
To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the robot.libraries prefix like from robot.libraries import DateTime. This has also always been the recommended way and the one used in examples in the User Guide.
Earlier it was possible to disable options accepting no values like --dryrun by giving the option again like --dryrun --other options --dryrun. This was rather confusing, and nowadays it is possible to do that by using the same option with no prefix like --nodryrun instead (#1865). If option is used with and without the no prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.
BuiltIn.Call Method need to be escapedCall Method nowadays supports **kwags (#1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like hello\=world.
See issue #1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.
These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
Create Dictionary keyword moved from Collections to BuiltIn (#1913)Set Test/Suite/Global Variable keyword removed (#1919)--runmode option removed (#1923)--xunitfile option removed in favor of --xunit (#1925)ROBOT_EXIT_FOR_LOOP attribute has been removed (#1440)Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
OperatingSystem.Start Process keyword deprecated in favor of much more flexible Process.Start Process (#1773)--runfailed and --rerunmerge options deprecated in favor of --rerunfailed and --merge, respectively (#1642)Meta: Name syntax for specifying test suite metadata deprecated (#1918)DeprecatedBuiltIn and DeprecatedOperatingSystem officially deprecated (#1774)Big thanks for Jared Hellman (@hellmanj) for implementing both support for embedded arguments with library keywords (#1818) and custom library keyword names (#1835) required by it.
| ID | Type | Priority | Summary |
|---|---|---|---|
| #1450 | enhancement | critical | Dictionary variable type |
| #1561 | enhancement | critical | Support Python style **kwargs with user keywords using &{kwargs} syntax |
| #1905 | enhancement | critical | Store list and scalar variables in same namespace |
| #1737 | bug | high | Standard libraries should not be importable in Python w/o robot.libraries prefix |
| #1931 | bug | high | Timeouts can cause sporadic failures with IronPython |
| #1818 | enhancement | high | Embedded arguments in keywords defined in test libraries |
| #1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 |
| #1900 | bug | medium | Log messages lost if library __init__ imports or initializes other libraries |
| #1908 | bug | medium | Telnet option negotiation loop |
| #1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 |
| #1603 | enhancement | medium | Support **kwargs with BuiltIn.Call Method keywords |
| #1773 | enhancement | medium | Deprecate OperatingSystem.Start Process keyword |
| #1774 | enhancement | medium | Officially deprecate DeprecatedBuiltIn and DeprecatedOperatingSystem |
| #1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) |
| #1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs |
| #1841 | enhancement | medium | Deprecate old listener API |
| #1865 | enhancement | medium | Support disabling command line options accepting no values using no prefix (e.g. --dryrun -> --nodryrun) |
| #1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables |
| #1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables |
| #1913 | enhancement | medium | Move Create Dictionary to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. |
| #1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table |
| #1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access |
| #1958 | enhancement | medium | Log Many: Support logging &{dictionary} variable items |
| #1959 | enhancement | medium | Wait Until Keyword Succeeds: Support giving wait time as number of times to retry |
| #1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords |
| #1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning |
| #1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes |
| #1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x |
| #1642 | enhancement | low | Deprecate --runfailed and --rerunmerge options |
| #1775 | enhancement | low | Remove deprecated syntax for repeating single keyword |
| #1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation |
| #1918 | enhancement | low | Deprecate old Meta: Name syntax for specifying test suite metadata |
| #1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using Set Test/Suite/Global Variable keyword |
| #1921 | enhancement | low | More flexible syntax to deprecate keywords |
| #1923 | enhancement | low | Remove deprecated --runmode option |
| #1924 | enhancement | low | Remove unused internal functions, classes, etc. |
| #1925 | enhancement | low | Remove deprecated --xunitfile option |
| #1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators |
| #1945 | enhancement | low | Enhance documentation of Run Keyword If return values |
Altogether 39 issues. See on issue tracker.
Robot Framework 2.8.7 is a new minor release with lots of enhancements and bug fixes. It was released on Friday January 16, 2015.
Robot Framework 2.8.7 is a new minor release with lots of enhancements and bug fixes. It was released on Friday January 16, 2015.
Installation packages are on PyPI. If you have pip available, just run pip install --upgrade robotframework to install the latest version. Otherwise see installation instructions.
Questions and comments related to the release can be sent to the robotframework-users and possible bugs submitted to the issue tracker.
--rerunfailed and when generating only report with Rebot (#1873)This release has the biggest number of external contributions ever! Many thanks to Michael Walle for contributing Telnet.Read Until Prompt strip_prompt option (#1874), to Tero Kinnnunen for BDD 'But' prefix (#1878), to Heiko Thiery for log level config option for TelnetLibrary (#1879), to Nicolae Chedea for float parameters in FOR IN RANGE (#1850), and Guy Kisel for making tidy split ELSE, ELSE IF, and AND to own rows (#1273).
Also thanks to everyone else who has contributed with bug reports, feature requests, patches, and fixes.
| ID | Type | Priority | Summary |
|---|---|---|---|
| #1842 | bug | critical | Installation broken with Jython/Python 2.5 |
| #1848 | bug | high | Running Robot Framework on thread fails because signal handlers cannot be registered |
| #1862 | bug | high | Testdoc broken in 2.8.6 |
| #1873 | bug | high | Failures in suite teardown ignored with --rerunfailed and when generating only report with Rebot |
| #1872 | enhancement | high | Libdoc: Support searching keywords by name, arguments, and keywords |
| #1821 | bug | medium | TestSuite.run does not remove its log handler from the root logger |
| #1838 | bug | medium | Results get same timestamps if multiple test runs executed programmatically |
| #1866 | bug | medium | Variable file and listener arguments from command line cannot contain colons |
| #1867 | bug | medium | Rebot does not preserve order of keywords and messages in output.xml |
| #1850 | enhancement | medium | Support using floats in FOR IN RANGE loop |
| #1860 | enhancement | medium | Redirect messages logged with robot.api.logger to Python logging when Robot is not running |
| #1878 | enhancement | medium | Ignore also But BDD prefix |
| #1879 | enhancement | medium | Telnet: Support configuring log level of telnetlib debug messages |
| #1273 | enhancement | medium | Tidy should split ELSE, ELSE IF, and AND to own rows |
| #1859 | bug | low | Cannot set __doc__ dynamically for library class |
| #1870 | bug | low | Process w/ Jython 2.7: Terminate Process fails with IOError if standard streams are used |
| #1883 | bug | low | Reloading report settings from hash fails on IE8 |
| #1884 | bug | low | Variables and escape sequences in suite doc not resolved in console output |
| #1845 | enhancement | low | Document that when matching tags, AND, OR and NOT in tags themselves must be given as lower case |
| #1851 | enhancement | low | UG: Improve documentation about using resource files with initialization files |
| #1861 | enhancement | low | Process: Enhance documentation related to process arguments |
| #1864 | enhancement | low | Testdoc: Support for creating link targets and opening them |
| #1874 | enhancement | low | Add option to Telnet.Read Until Prompt to remove prompt from return value |
Altogether 23 issues. See on issue tracker.
Your coding agent can read these notes before it upgrades. Set up the MCP server →