Python unittest test suite for Robot Framework
This is an experimental package for wrapping Robot Framework test suites into Python unittest suites to make it possible to run Robot Framework tests as plone.testing's layered test suites:
import unittest2 as unittest from plone.testing import layered from robotsuite import RobotTestSuite from my_package.testing import ACCEPTANCE_TESTING def test_suite(): suite = unittest.TestSuite() suite.addTests([ layered(RobotTestSuite('mysuite.txt'), layer=ACCEPTANCE_TESTING), ]) return suite
RobotTestSuite splits Robot Framework test suites into separate unittest test cases so that Robot will be run once for every test case in every test suite parsed from the given Robot Framework test suite. Because of that, each Robot will generate a separate test report for each test. Each report will have it's own folder, which are created recursively reflecting the structure of the given test suite.
RobotTestSuite's way of wrapping tests into unittest's test suite is similar to how doctest-module's DocTestSuite does its wrappings. See the documentation of DocTestSuite for possible common parameters (e.g. for how to pass a test suite from a different package).
The main motivation behind this package is to make Robot Framework support existing test fixtures and test isolation when testing Plone. Yet, this should help anyone wanting to use Robot Framework with zope.testrunner or other Python unittest compatible test runner.
If this works for you, please contribute at: http://github.com/collective/robotsuite/
Setting robot variables from environment variables
Robot Framework supports overriding test variables from command-line, which
is not-available when running tests as robotsuite-wrapped with other test
runners. That's why robotsuite supports settings variables as environment
variables so that every
ROBOT_-prefixed environment variable will be
mapped into corresponding test variable without the
Declaring tests non-critical by given set of tags
Robot Framework supports declaring tests with given tags as non-critical to prevent their failing to fail the complete build on CI. This is supported as keyword argument for RobotTestSuite as follows:
def test_suite(): suite = unittest.TestSuite() suite.addTests([ layered(RobotTestSuite('mysuite.txt', noncritical=['non-critical-tag']), layer=ACCEPTANCE_TESTING), ]) return suite
zope.testrunner supports annotating test suites with levels to avoid slow test being run unless wanted:
def test_suite(): suite = unittest.TestSuite() suite.addTests([ layered(RobotTestSuite('mysuite.txt'), layer=ACCEPTANCE_TESTING), ]) suite.level = 10 return suite
Appending test results to existing test report
When running Robot Framework through robotsuite, its test reports are created
into the current working directory with filenames
robot_report.html. The default behavior is to
override the existing
robot_output.xml (and also the other report files
generated from that).
To merge test results from separate test runs into the same test report, set
ROBOTSUITE_APPEND_OUTPUT_XML=1 to prevent robotsuite
from overriding the existing test results, but to always append to the existing
Filtering test execution errors
Set environment variable
ROBOTSUITE_LOGLEVEL=ERROR to filter all top level
Test Execution Errors below the given log level (e.g. ERROR) from the merged
test report. This is useful when unnecessary warnings are leaking from the
tested code into Robot Framework logs.
Including or skipping all RobotTestSuite-wrapped tests
Robot Framework is often used with Selenium2Library to write acceptance test using the Selenium-framework. Yet, because those test may be slow to run, one might want sometimes (e.g. on CI) to run everything except the robotsuite wrapped tests, and later only the robotsuite wrapped tests.
This can be achieved for sure, with injecting a custom string into the names
of robotsuite-wrapped tests with
and then filter the test with that string.
E.g. run everything except the robotsuite wrapped tests with:
$ ROBOTSUITE_PREFIX=ROBOTSUITE bin/test --all -t \!ROBOTSUITE
and the other way around with:
$ ROBOTSUITE_PREFIX=ROBOTSUITE bin/test --all -t ROBOTSUITE
Re-using test suites from other packages
Sometime it could be useful to re-use acceptance test from some upstream
package to test your slightly tailored package (e.g. with a custom theme).
This can be done with by defining the test lookup location with
package-keyword argment for
def test_suite(): suite = unittest.TestSuite() suite.addTests([ layered(leveled( robotsuite.RobotTestSuite('robot', package='Products.CMFPlone.tests'), ), layer=PLONE_APP_MOSAIC_NO_PAC_ROBOT), ]) return suite