4 new revisions:
Revision: 80fbfb9076e4
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 05:13:03 2011
Log: Separate reporting tests for robot and rebot result generation as
we c...
http://code.google.com/p/robotframework/source/detail?r=80fbfb9076e4
Revision: 8010ff0d7eb4
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 05:13:11 2011
Log: Automated merge with https://code.google.com/p/robotframework/
http://code.google.com/p/robotframework/source/detail?r=8010ff0d7eb4
Revision: 1da4f5985b2a
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 05:43:49 2011
Log: Add missing reporting test about output writing
http://code.google.com/p/robotframework/source/detail?r=1da4f5985b2a
Revision: 8fed6593cf4f
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 06:18:24 2011
Log: merge
http://code.google.com/p/robotframework/source/detail?r=8fed6593cf4f
==============================================================================
Revision: 80fbfb9076e4
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 05:13:03 2011
Log: Separate reporting tests for robot and rebot result generation as
we currently have two different implementations
http://code.google.com/p/robotframework/source/detail?r=80fbfb9076e4
Modified:
/src/robot/__init__.py
/src/robot/reporting/__init__.py
/src/robot/reporting/resultwriter.py
/src/robot/result/datamodel.py
/src/robot/result/jsondatamodelhandlers.py
/utest/reporting/test_reporting.py
=======================================
--- /src/robot/__init__.py Fri Nov 11 02:21:37 2011
+++ /src/robot/__init__.py Tue Nov 15 05:13:03 2011
@@ -15,6 +15,7 @@
import sys
import os
+
if __name__ == '__main__':
sys.stderr.write("Use 'runner' or 'rebot' for executing.\n")
sys.exit(252) # 252 == DATA_ERROR
@@ -45,7 +46,7 @@
from output import Output, LOGGER, pyloggingconf
from conf import RobotSettings, RebotSettings
from running import TestSuite, STOP_SIGNAL_MONITOR
-from robot.reporting import ResultWriter
+from robot.reporting import ResultWriter, RebotResultWriter
from errors import (DataError, Information, INFO_PRINTED, DATA_ERROR,
STOPPED_BY_USER, FRAMEWORK_ERROR)
from variables import init_global_variables
@@ -152,7 +153,7 @@
settings = RebotSettings(options)
LOGGER.register_console_logger(colors=settings['MonitorColors'])
LOGGER.disable_message_cache()
- result = ResultWriter(settings).write_rebot_results(*datasources)
+ result = RebotResultWriter(settings).write_rebot_results(*datasources)
LOGGER.close()
return result.suite, result.return_code
=======================================
--- /src/robot/reporting/__init__.py Mon Oct 24 03:12:31 2011
+++ /src/robot/reporting/__init__.py Tue Nov 15 05:13:03 2011
@@ -13,4 +13,4 @@
# limitations under the License.
-from resultwriter import ResultWriter
+from resultwriter import ResultWriter, RebotResultWriter
=======================================
--- /src/robot/reporting/resultwriter.py Mon Nov 14 03:52:30 2011
+++ /src/robot/reporting/resultwriter.py Tue Nov 15 05:13:03 2011
@@ -63,7 +63,6 @@
('endtime', 'EndTime')
]:
opts[opt_name] = self.settings[settings_name]
-
opts['metadata'] = dict(opts['metadata'])
return opts
@@ -74,25 +73,30 @@
ReportBuilder(self).build()
XUnitBuilder(self).build()
+
+class RebotResultWriter(ResultWriter):
+
def write_rebot_results(self, *data_sources):
self._data_sources = data_sources
OutputBuilder(self).build()
XUnitBuilder(self).build()
- self._create_reporting_datamodel()
LogBuilder(self).build()
ReportBuilder(self).build()
return self._execution_result
- def _create_reporting_datamodel(self):
- visitor = DatamodelVisitor(self.result_from_xml.result,
- log_path=self.settings['Log'],
- split_log=self.settings['SplitLog'])
- # Remove keywords while visiting as JSON datamodel visitor is the
last
- # thing that needs keywords from the model
- # this saves memory -- possibly a lot.
- self.result_from_xml.result.visit(CombiningVisitor(visitor,
- KeywordRemovingVisitor()))
- self._data_model = DataModelWriter(visitor.datamodel)
+ @property
+ def data_model(self):
+ if self._data_model is None:
+ visitor = DatamodelVisitor(self.result_from_xml.result,
+ log_path=self.settings['Log'],
+ split_log=self.settings['SplitLog'])
+ # Remove keywords while visiting as JSON datamodel visitor is
the last
+ # thing that needs keywords from the model
+ # this saves memory -- possibly a lot.
+ self.result_from_xml.result.visit(CombiningVisitor(visitor,
+ KeywordRemovingVisitor()))
+ self._data_model = DataModelWriter(visitor.datamodel,
visitor.split_results)
+ return self._data_model
class ResultFromXML(object):
=======================================
--- /src/robot/result/datamodel.py Sat Nov 12 04:59:53 2011
+++ /src/robot/result/datamodel.py Tue Nov 15 05:13:03 2011
@@ -24,6 +24,10 @@
self._context = Context(log_path=log_path, split_log=split_log)
self._elements.append(ExecutionResultHandler(self._context,
result))
+ @property
+ def split_results(self):
+ return self._context.split_results
+
def _start(self, func):
next = func(self._elements[-1])
self._elements.append(next)
=======================================
--- /src/robot/result/jsondatamodelhandlers.py Mon Nov 14 03:46:38 2011
+++ /src/robot/result/jsondatamodelhandlers.py Tue Nov 15 05:13:03 2011
@@ -144,6 +144,7 @@
self._doc = self._get_id(utils.html_format(suite.doc))
self._data_from_children.append(self._doc)
self._metadata = []
+ self._in_setup_or_teardown = False
for i in [self._get_ids(key, utils.html_format(value)) for key,
value in suite.metadata.items()]:
self._metadata.extend(i)
self._data_from_children.append(self._metadata)
@@ -158,6 +159,10 @@
def add_child_data(self, data):
self._current_children.append(data)
+ def start_keyword(self, keyword):
+ self._current_children = self._keywords
+ return SuiteSetupAndTeardownHandler(self._context, keyword)
+
def end_element(self, suite):
stats = self._context.end_suite()
status = _StatusHandler(self._context, suite).end_element('')
@@ -234,6 +239,16 @@
return self._keywords
+class SuiteSetupAndTeardownHandler(KeywordHandler):
+
+ def _start(self):
+ self._context.start_suite_setup_or_teardown()
+
+ def _get_keywords(self):
+ self._context.end_suite_setup_or_teardown(self._keywords)
+ return self._keywords
+
+
class _StatusHandler(_Handler):
_statuses = {'FAIL': 0, 'PASS': 1, 'NOT_RUN': 2}
=======================================
--- /utest/reporting/test_reporting.py Mon Nov 14 03:46:38 2011
+++ /utest/reporting/test_reporting.py Tue Nov 15 05:13:03 2011
@@ -1,10 +1,10 @@
import unittest
-from robot.reporting import ResultWriter
from robot.reporting.outputparser import OutputParser
from robot.reporting.builders import LogBuilder, ReportBuilder,
XUnitBuilder
import resources
+from robot.reporting.resultwriter import RebotResultWriter, ResultWriter
def set_write_log_mock():
@@ -45,7 +45,7 @@
return generated
-class TestReporting(unittest.TestCase):
+class _TestReporting(object):
def setUp(self):
self._settings = {
@@ -80,7 +80,6 @@
'LogLevel': 'INFO',
'RemoveKeywords': None
}
- self._reporter = ResultWriter(self._settings)
self._log_results = set_write_log_mock()
self._report_results = set_write_report_mock()
self._xunit_results = set_write_xunit_mock()
@@ -93,7 +92,6 @@
self._reporter.write_robot_results(resources.GOLDEN_OUTPUT)
self._assert_expected_log('log.html')
self._assert_expected_report('report.html')
- self._assert_data_model_generated_once()
def test_no_generation(self):
self._reporter.write_robot_results(resources.GOLDEN_OUTPUT)
@@ -120,17 +118,10 @@
self._assert_no_report()
self._assert_expected_xunit('xunitfile-only.xml')
- def test_multiple_outputs(self):
- self._settings['Log'] = 'log.html'
- self._settings['Report'] = 'report.html'
- self._reporter.write_rebot_results(*[resources.GOLDEN_OUTPUT,
resources.GOLDEN_OUTPUT2])
- self._assert_expected_log('log.html')
- self._assert_expected_report('report.html')
-
def test_split_tests(self):
self._settings['SplitLog'] = True
self._settings['Log'] = '/tmp/foo/log.bar.html'
- self._reporter.write_robot_results(resources.GOLDEN_OUTPUT)
+ self._write_results(resources.GOLDEN_OUTPUT)
expected = ('/tmp/foo/log.bar-%d.js' % i for i in range(1, 5))
self._assert_expected_split_tests(*expected)
@@ -159,5 +150,32 @@
self.assertEquals(len(self._datamodel_generations), 1)
+class TestRebotReporting(_TestReporting, unittest.TestCase):
+
+ def setUp(self):
+ _TestReporting.setUp(self)
+ self._reporter = RebotResultWriter(self._settings)
+
+ def _write_results(self, *sources):
+ self._reporter.write_rebot_results(*sources)
+
+ def test_multiple_outputs(self):
+ self._settings['Log'] = 'log.html'
+ self._settings['Report'] = 'report.html'
+ self._write_results(resources.GOLDEN_OUTPUT,
resources.GOLDEN_OUTPUT2)
+ self._assert_expected_log('log.html')
+ self._assert_expected_report('report.html')
+
+
+class TestRobotReporting(_TestReporting, unittest.TestCase):
+
+ def setUp(self):
+ _TestReporting.setUp(self)
+ self._reporter = ResultWriter(self._settings)
+
+ def _write_results(self, source):
+ self._reporter.write_robot_results(source)
+
+
if __name__ == '__main__':
unittest.main()
==============================================================================
Revision: 8010ff0d7eb4
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 05:13:11 2011
Log: Automated merge with https://code.google.com/p/robotframework/
http://code.google.com/p/robotframework/source/detail?r=8010ff0d7eb4
Modified:
/src/robot/result/jsondatamodelhandlers.py
=======================================
--- /src/robot/result/jsondatamodelhandlers.py Mon Nov 14 15:56:32 2011
+++ /src/robot/result/jsondatamodelhandlers.py Tue Nov 15 05:13:11 2011
@@ -144,6 +144,7 @@
self._doc = self._get_id(utils.html_format(suite.doc))
self._data_from_children.append(self._doc)
self._metadata = []
+ self._in_setup_or_teardown = False
for i in [self._get_ids(key, utils.html_format(value)) for key,
value in suite.metadata.items()]:
self._metadata.extend(i)
self._data_from_children.append(self._metadata)
@@ -158,6 +159,10 @@
def add_child_data(self, data):
self._current_children.append(data)
+ def start_keyword(self, keyword):
+ self._current_children = self._keywords
+ return SuiteSetupAndTeardownHandler(self._context, keyword)
+
def end_element(self, suite):
stats = self._context.end_suite()
status = _StatusHandler(self._context, suite).end_element('')
@@ -234,6 +239,16 @@
return self._keywords
+class SuiteSetupAndTeardownHandler(KeywordHandler):
+
+ def _start(self):
+ self._context.start_suite_setup_or_teardown()
+
+ def _get_keywords(self):
+ self._context.end_suite_setup_or_teardown(self._keywords)
+ return self._keywords
+
+
class _StatusHandler(_Handler):
_statuses = {'FAIL': 0, 'PASS': 1, 'NOT_RUN': 2}
==============================================================================
Revision: 1da4f5985b2a
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 05:43:49 2011
Log: Add missing reporting test about output writing
http://code.google.com/p/robotframework/source/detail?r=1da4f5985b2a
Modified:
/utest/reporting/test_reporting.py
=======================================
--- /utest/reporting/test_reporting.py Tue Nov 15 05:13:03 2011
+++ /utest/reporting/test_reporting.py Tue Nov 15 05:43:49 2011
@@ -1,7 +1,7 @@
import unittest
from robot.reporting.outputparser import OutputParser
-from robot.reporting.builders import LogBuilder, ReportBuilder,
XUnitBuilder
+from robot.reporting.builders import LogBuilder, ReportBuilder,
XUnitBuilder, OutputBuilder
import resources
from robot.reporting.resultwriter import RebotResultWriter, ResultWriter
@@ -28,6 +28,13 @@
XUnitBuilder.build = build_xunit
return results
+def set_write_output_mock():
+ results = {'output_path': None}
+ def build_output(self):
+ results['output_path'] = self._path
+ OutputBuilder.build = build_output
+ return results
+
def set_write_split_test_mock():
results = []
def _write_test(self, index, keywords, strings, name):
@@ -154,6 +161,7 @@
def setUp(self):
_TestReporting.setUp(self)
+ self._output_results = set_write_output_mock()
self._reporter = RebotResultWriter(self._settings)
def _write_results(self, *sources):
@@ -166,6 +174,14 @@
self._assert_expected_log('log.html')
self._assert_expected_report('report.html')
+ def test_output_generation(self):
+ self._settings['Output'] = 'ouz.xml'
+ self._write_results(resources.GOLDEN_OUTPUT,
resources.GOLDEN_OUTPUT2)
+ self._assert_expected_output('ouz.xml')
+
+ def _assert_expected_output(self, expected_file_name):
+ self.assertEquals(self._output_results['output_path'],
expected_file_name)
+
class TestRobotReporting(_TestReporting, unittest.TestCase):
==============================================================================
Revision: 8fed6593cf4f
Author: Mikko Korpela <[email protected]>
Date: Tue Nov 15 06:18:24 2011
Log: merge
http://code.google.com/p/robotframework/source/detail?r=8fed6593cf4f