Commit 5378371d authored by chrishenry@google.com's avatar chrishenry@google.com

Add ValidateAndMeasurePage to PageTest; this is a replacement for both...

Add ValidateAndMeasurePage to PageTest; this is a replacement for both ValidatePage and MeasurePage.

Usage will be cleaned up in subsequent patch(es), along with
killing PageMeasurement.

BUG=383635

Review URL: https://codereview.chromium.org/452523002

Cr-Commit-Position: refs/heads/master@{#288291}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288291 0039d316-1c4b-4281-b951-d872f2087c98
parent 64f60703
...@@ -27,14 +27,11 @@ class MeasurementFailure(Failure): ...@@ -27,14 +27,11 @@ class MeasurementFailure(Failure):
class PageTest(command_line.Command): class PageTest(command_line.Command):
"""A class styled on unittest.TestCase for creating page-specific tests. """A class styled on unittest.TestCase for creating page-specific tests.
This class also support running a measurement by default (but can be Test should override ValidateAndMeasurePage to perform test
overridden by overriding ValidatePage method). validation and page measurement as necessary.
To use this for measurement, subclass from the measurement and
override MeasurePage. For example:
class BodyChildElementMeasurement(PageTest): class BodyChildElementMeasurement(PageTest):
def MeasurePage(self, page, tab, results): def ValidateAndMeasurePage(self, page, tab, results):
body_child_count = tab.EvaluateJavaScript( body_child_count = tab.EvaluateJavaScript(
'document.body.children.length') 'document.body.children.length')
results.AddValue(scalar.ScalarValue( results.AddValue(scalar.ScalarValue(
...@@ -44,14 +41,14 @@ class PageTest(command_line.Command): ...@@ -44,14 +41,14 @@ class PageTest(command_line.Command):
an example: an example:
class BodyChildElementMeasurement(PageTest): class BodyChildElementMeasurement(PageTest):
def AddCommandLineArgs(parser): def AddCommandLineArgs(parser):
parser.add_option('--element', action='store', default='body') parser.add_option('--element', action='store', default='body')
def MeasurePage(self, page, tab, results): def ValidateAndMeasurePage(self, page, tab, results):
body_child_count = tab.EvaluateJavaScript( body_child_count = tab.EvaluateJavaScript(
'document.querySelector('%s').children.length') 'document.querySelector('%s').children.length')
results.AddValue(scalar.ScalarValue( results.AddValue(scalar.ScalarValue(
page, 'children', 'count', child_count)) page, 'children', 'count', child_count))
Args: Args:
action_name_to_run: This is the method name in telemetry.page.Page action_name_to_run: This is the method name in telemetry.page.Page
...@@ -263,37 +260,40 @@ class PageTest(command_line.Command): ...@@ -263,37 +260,40 @@ class PageTest(command_line.Command):
"""Override to examine the page set before the test run. Useful for """Override to examine the page set before the test run. Useful for
example to validate that the pageset can be used with the test.""" example to validate that the pageset can be used with the test."""
def ValidatePage(self, page, tab, results): def ValidateAndMeasurePage(self, page, tab, results):
"""Override to check the actual test assertions. """Override to check test assertions and perform measurement.
This is where most your test logic should go. By default it runs
self.MeasurePage.
"""
self.MeasurePage(page, tab, results)
def MeasurePage(self, page, tab, results):
"""Override to actually measure the page's performance.
Should call results.AddValue(...) for each result. Can raise an When adding measurement results, call results.AddValue(...) for
exception of add a failure.FailureValue on failure. each result. Raise an exception or add a failure.FailureValue on
failure. page_test.py also provides several base exception classes
to use.
Prefer metric value names that are in accordance with python Prefer metric value names that are in accordance with python
variable style. e.g., metric_name. The name 'url' must not be used. variable style. e.g., metric_name. The name 'url' must not be used.
Put together: Put together:
def ValidateAndMeasurePage(self, page, tab, results):
def MeasurePage(self, page, tab, results): res = tab.EvaluateJavaScript('2+2')
res = tab.EvaluateJavaScript('2+2') if res != 4:
if res != 4: raise Exception('Oh, wow.')
raise Exception('Oh, wow.') results.AddValue(scalar.ScalarValue(
results.AddValue(scalar.ScalarValue( page, 'two_plus_two', 'count', res))
page, 'two_plus_two', 'count', res))
Args: Args:
page: A telemetry.page.Page instance. page: A telemetry.page.Page instance.
tab: A telemetry.core.Tab instance. tab: A telemetry.core.Tab instance.
results: A telemetry.results.PageTestResults instance. results: A telemetry.results.PageTestResults instance.
""" """
# TODO(chrishenry): Switch to raise NotImplementedError() when
# subclasses no longer override ValidatePage/MeasurePage.
self.ValidatePage(page, tab, results)
def ValidatePage(self, page, tab, results):
"""DEPRECATED: Use ValidateAndMeasurePage instead."""
self.MeasurePage(page, tab, results)
def MeasurePage(self, page, tab, results):
"""DEPRECATED: Use ValidateAndMeasurePage instead."""
def RunPage(self, page, tab, results): def RunPage(self, page, tab, results):
# Run actions. # Run actions.
...@@ -306,8 +306,7 @@ class PageTest(command_line.Command): ...@@ -306,8 +306,7 @@ class PageTest(command_line.Command):
self._RunMethod(page, self._action_name_to_run, action_runner) self._RunMethod(page, self._action_name_to_run, action_runner)
self.DidRunActions(page, tab) self.DidRunActions(page, tab)
# Run validator. self.ValidateAndMeasurePage(page, tab, results)
self.ValidatePage(page, tab, results)
def _RunMethod(self, page, method_name, action_runner): def _RunMethod(self, page, method_name, action_runner):
if hasattr(page, method_name): if hasattr(page, method_name):
......
...@@ -10,7 +10,7 @@ from telemetry.page import page_test ...@@ -10,7 +10,7 @@ from telemetry.page import page_test
class DoNothingPageTest(page_test.PageTest): class DoNothingPageTest(page_test.PageTest):
def ValidatePage(self, *_): def ValidateAndMeasurePage(self, *_):
pass pass
...@@ -22,8 +22,8 @@ class TestPage(page_module.Page): ...@@ -22,8 +22,8 @@ class TestPage(page_module.Page):
def RunActionToRun(self, _): def RunActionToRun(self, _):
self.run_action_to_run_called = True self.run_action_to_run_called = True
class PageTestUnitTest(unittest.TestCase):
class PageTestUnitTest(unittest.TestCase):
def testRunActions(self): def testRunActions(self):
test = DoNothingPageTest('RunActionToRun') test = DoNothingPageTest('RunActionToRun')
page = TestPage('file://blank.html', None, util.GetUnittestDataDir()) page = TestPage('file://blank.html', None, util.GetUnittestDataDir())
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment