Skip to content

Tools to ease creating larger test libraries for Robot Framework using Python

License

Notifications You must be signed in to change notification settings

rasjani/PythonLibCore

Repository files navigation

Python Library Core

Tools to ease creating larger test libraries for Robot Framework using Python. The Robot Framework hybrid and dynamic library API gives more flexibility for library than the static library API, but they also sets requirements for libraries which needs to be implemented in the library side. PythonLibCore eases the problem by providing simpler interface and handling all the requirements towards the Robot Framework library APIs.

Code is stable and is already used by SeleniumLibrary and Browser library. Project supports two latest version of Robot Framework.

VersionActions StatusLicense

Usage

There are two ways to use PythonLibCore, either by HybridCore or by using DynamicCore. HybridCore provides support for the hybrid library API and DynamicCore provides support for dynamic library API. Consult the Robot Framework User Guide, for choosing the correct API for library.

Regardless which library API is chosen, both have similar requirements.

  1. Library must inherit either the HybridCore or DynamicCore.
  2. Library keywords must be decorated with Robot Framework @keyword decorator.
  3. Provide a list of class instances implementing keywords to library_components argument in the HybridCore or DynamicCore__init__.

It is also possible implement keywords in the library main class, by marking method with @keyword as keywords. It is not required pass main library instance in the library_components argument.

All keyword, also keywords implemented in the classes outside of the main library are available in the library instance as methods. This automatically publish library keywords in as methods in the Python public API.

The example in below demonstrates how the PythonLibCore can be used with a library.

Example

"""Main library."""fromrobotlibcoreimportDynamicCorefrommystuffimportLibrary1, Library2classMyLibrary(DynamicCore): """General library documentation."""def__init__(self): libraries= [Library1(), Library2()] DynamicCore.__init__(self, libraries) @keyworddefkeyword_in_main(self): pass
"""Library components."""fromrobotlibcoreimportkeywordclassLibrary1(object): @keyworddefexample(self): """Keyword documentation."""pass@keyworddefanother_example(self, arg1, arg2='default'): passdefnot_keyword(self): passclassLibrary2(object): @keyword('Custom name')defthis_name_is_not_used(self): pass@keyword(tags=['tag', 'another'])deftags(self): pass

Plugin API

It is possible to create plugin API to a library by using PythonLibCore. This allows extending library with external Python classes. Plugins can be imported during library import time, example by defining argumet in library [__init__]{.title-ref} which allows defining the plugins. It is possible to define multiple plugins, by seperating plugins with with comma. Also it is possible to provide arguments to plugin by seperating arguments with semicolon.

fromrobot.api.decoimportkeyword# noqa F401fromrobotlibcoreimportDynamicCore, PluginParserfrommystuffimportLibrary1, Library2classPluginLib(DynamicCore): def__init__(self, plugins): plugin_parser=PluginParser() libraries= [Library1(), Library2()] parsed_plugins=plugin_parser.parse_plugins(plugins) libraries.extend(parsed_plugins) DynamicCore.__init__(self, libraries)

When plugin class can look like this:

classMyPlugi: @keyworddefplugin_keyword(self): return123

Then Library can be imported in Robot Framework side like this:

Library${CURDIR}/PluginLib.py plugins=${CURDIR}/MyPlugin.py

Translation

PLC supports translation of keywords names and documentation, but arguments names, tags and types can not be currently translated. Translation is provided as a file containing Json and as a Path object. Translation is provided in translation argument in the HybridCore or DynamicCore__init__. Providing translation file is optional, also it is not mandatory to provide translation to all keyword.

The keys of json are the methods names, not the keyword names, which implements keyword. Value of key is json object which contains two keys: name and doc. name key contains the keyword translated name and doc contains keyword translated documentation. Providing doc and name is optional, example translation json file can only provide translations only to keyword names or only to documentatin. But it is always recomended to provide translation to both name and doc.

Library class documentation and instance documetation has special keys, __init__ key will replace instance documentation and __intro__ will replace libary class documentation.

Example

If there is library like this:

frompathlibimportPathfromrobotlibcoreimportDynamicCore, keywordclassSmallLibrary(DynamicCore): """Library documentation."""def__init__(self, translation: Path): """__init__ documentation."""DynamicCore.__init__(self, [], translation.absolute()) @keyword(tags=["tag1", "tag2"])defnormal_keyword(self, arg: int, other: str) ->str: """I have doc Multiple lines. Other line. """data=f"{arg}{other}"print(data) returndatadefnot_keyword(self, data: str) ->str: print(data) returndata@keyword(name="This Is New Name", tags=["tag1", "tag2"])defname_changed(self, some: int, other: int) ->int: """This one too"""print(f"{some}{type(some)}, {other}{type(other)}") returnsome+other

And when there is translation file like:

{"normal_keyword":{"name": "other_name", "doc": "This is new doc" }, "name_changed":{"name": "name_changed_again", "doc": "This is also replaced.\n\nnew line." }, "__init__":{"name": "__init__", "doc": "Replaces init docs with this one." }, "__intro__":{"name": "__intro__", "doc": "New __intro__ documentation is here." }, }

Then normal_keyword is translated to other_name. Also this keyword documentions is translted to This is new doc. The keyword is name_changed is translted to name_changed_again keyword and keyword documentation is translted to This is also replaced.\n\nnew line.. The library class documentation is translated to Replaces init docs with this one. and class documentation is translted to New __intro__ documentation is here.

About

Tools to ease creating larger test libraries for Robot Framework using Python

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python89.6%
  • RobotFramework10.4%