OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Performance tests for Chrome Endure (long-running perf tests on Chrome). | 6 """Performance tests for Chrome Endure (long-running perf tests on Chrome). |
7 | 7 |
8 This module accepts the following environment variable inputs: | 8 This module accepts the following environment variable inputs: |
9 TEST_LENGTH: The number of seconds in which to run each test. | 9 TEST_LENGTH: The number of seconds in which to run each test. |
10 PERF_STATS_INTERVAL: The number of seconds to wait in-between each sampling | 10 PERF_STATS_INTERVAL: The number of seconds to wait in-between each sampling |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 return False | 243 return False |
244 return True | 244 return True |
245 | 245 |
246 | 246 |
247 class ChromeEndureControlTest(ChromeEndureBaseTest): | 247 class ChromeEndureControlTest(ChromeEndureBaseTest): |
248 """Control tests for Chrome Endure.""" | 248 """Control tests for Chrome Endure.""" |
249 | 249 |
250 _webapp_name = 'Control' | 250 _webapp_name = 'Control' |
251 _tab_title_substring = 'Chrome Endure Control Test' | 251 _tab_title_substring = 'Chrome Endure Control Test' |
252 | 252 |
253 def testControlAttachDetachDOMTree(self): | 253 # TODO(dennisjeffrey): Make this function available to the other Chrome Endure |
254 """Continually attach and detach a DOM tree from a basic document.""" | 254 # tests so that we can remove duplicated code in those other tests as well. |
255 test_description = 'AttachDetachDOMTree' | 255 # Ideally, tests shouldn't have knowledge about the details of how the test |
256 | 256 # harness runs; the only main difference between the tests is that they |
257 url = self.GetHttpURLForDataPath('chrome_endure', 'endurance_control.html') | 257 # navigate to different URLs, and perform different scenarios on them. |
258 self.NavigateToURL(url) | 258 def _RunControlTest(self, test_description, data_file_url, do_scenario): |
| 259 """Runs a general control test.""" |
| 260 self.NavigateToURL(data_file_url) |
259 loaded_tab_title = self.GetActiveTabTitle() | 261 loaded_tab_title = self.GetActiveTabTitle() |
260 self.assertTrue(self._tab_title_substring in loaded_tab_title, | 262 self.assertTrue(self._tab_title_substring in loaded_tab_title, |
261 msg='Loaded tab title does not contain "%s": "%s"' % | 263 msg='Loaded tab title does not contain "%s": "%s"' % |
262 (self._tab_title_substring, loaded_tab_title)) | 264 (self._tab_title_substring, loaded_tab_title)) |
263 | 265 |
264 # This test performs no interaction with the webpage. It simply sleeps | |
265 # and periodically checks to see whether it's time to take performance | |
266 # measurements. | |
267 self._test_start_time = time.time() | 266 self._test_start_time = time.time() |
268 last_perf_stats_time = time.time() | 267 last_perf_stats_time = time.time() |
269 self._GetPerformanceStats(self._webapp_name, test_description, | 268 self._GetPerformanceStats(self._webapp_name, test_description, |
270 self._tab_title_substring) | 269 self._tab_title_substring) |
271 iteration_num = 0 | 270 iteration_num = 0 |
272 while time.time() - self._test_start_time < self._test_length_sec: | 271 while time.time() - self._test_start_time < self._test_length_sec: |
273 iteration_num += 1 | 272 iteration_num += 1 |
274 | 273 |
275 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 274 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
276 last_perf_stats_time = time.time() | 275 last_perf_stats_time = time.time() |
277 self._GetPerformanceStats(self._webapp_name, test_description, | 276 self._GetPerformanceStats(self._webapp_name, test_description, |
278 self._tab_title_substring) | 277 self._tab_title_substring) |
279 | 278 |
280 if iteration_num % 10 == 0: | 279 if iteration_num % 10 == 0: |
281 remaining_time = self._test_length_sec - ( | 280 remaining_time = self._test_length_sec - (time.time() - |
282 time.time() - self._test_start_time) | 281 self._test_start_time) |
283 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 282 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
284 (iteration_num, remaining_time)) | 283 (iteration_num, remaining_time)) |
285 | 284 |
286 time.sleep(5) | 285 do_scenario() |
287 | 286 |
288 self._GetPerformanceStats(self._webapp_name, test_description, | 287 self._GetPerformanceStats(self._webapp_name, test_description, |
289 self._tab_title_substring) | 288 self._tab_title_substring) |
290 | 289 |
| 290 def testControlAttachDetachDOMTree(self): |
| 291 """Continually attach and detach a DOM tree from a basic document.""" |
| 292 test_description = 'AttachDetachDOMTree' |
| 293 url = self.GetHttpURLForDataPath('chrome_endure', 'endurance_control.html') |
| 294 |
| 295 def scenario(): |
| 296 # This test performs no interaction with the webpage. It simply sleeps |
| 297 # and periodically checks to see whether it's time to take performance |
| 298 # measurements. |
| 299 time.sleep(5) |
| 300 |
| 301 self._RunControlTest(test_description, url, scenario) |
| 302 |
| 303 |
| 304 def testControlAttachDetachDOMTreeWebDriver(self): |
| 305 """Use WebDriver to attach and detach a DOM tree from a basic document.""" |
| 306 test_description = 'AttachDetachDOMTreeWebDriver' |
| 307 url = self.GetHttpURLForDataPath('chrome_endure', |
| 308 'endurance_control_webdriver.html') |
| 309 |
| 310 driver = self.NewWebDriver() |
| 311 wait = WebDriverWait(driver, timeout=60) |
| 312 |
| 313 def scenario(driver, wait): |
| 314 # Interact with the control test webpage for the duration of the test. |
| 315 # Here, we repeat the following sequence of interactions: click the |
| 316 # "attach" button to attach a large DOM tree (with event listeners) to the |
| 317 # document, wait half a second, click "detach" to detach the DOM tree from |
| 318 # the document, wait half a second. |
| 319 self._ClickElementByXpath(driver, wait, 'id("attach")') |
| 320 time.sleep(0.5) |
| 321 self._ClickElementByXpath(driver, wait, 'id("detach")') |
| 322 time.sleep(0.5) |
| 323 |
| 324 self._RunControlTest(test_description, url, lambda: scenario(driver, wait)) |
| 325 |
291 | 326 |
292 class ChromeEndureGmailTest(ChromeEndureBaseTest): | 327 class ChromeEndureGmailTest(ChromeEndureBaseTest): |
293 """Long-running performance tests for Chrome using Gmail.""" | 328 """Long-running performance tests for Chrome using Gmail.""" |
294 | 329 |
295 _webapp_name = 'Gmail' | 330 _webapp_name = 'Gmail' |
296 _tab_title_substring = 'Gmail' | 331 _tab_title_substring = 'Gmail' |
297 | 332 |
298 def setUp(self): | 333 def setUp(self): |
299 ChromeEndureBaseTest.setUp(self) | 334 ChromeEndureBaseTest.setUp(self) |
300 | 335 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 iteration_num = 0 | 390 iteration_num = 0 |
356 while time.time() - self._test_start_time < self._test_length_sec: | 391 while time.time() - self._test_start_time < self._test_length_sec: |
357 iteration_num += 1 | 392 iteration_num += 1 |
358 | 393 |
359 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 394 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
360 last_perf_stats_time = time.time() | 395 last_perf_stats_time = time.time() |
361 self._GetPerformanceStats(self._webapp_name, test_description, | 396 self._GetPerformanceStats(self._webapp_name, test_description, |
362 self._tab_title_substring) | 397 self._tab_title_substring) |
363 | 398 |
364 if iteration_num % 10 == 0: | 399 if iteration_num % 10 == 0: |
365 remaining_time = self._test_length_sec - ( | 400 remaining_time = self._test_length_sec - (time.time() - |
366 time.time() - self._test_start_time) | 401 self._test_start_time) |
367 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 402 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
368 (iteration_num, remaining_time)) | 403 (iteration_num, remaining_time)) |
369 | 404 |
370 compose_button = self._wait.until(lambda _: self._GetElement( | 405 compose_button = self._wait.until(lambda _: self._GetElement( |
371 self._driver.find_element_by_xpath, | 406 self._driver.find_element_by_xpath, |
372 '//div[text()="COMPOSE"]')) | 407 '//div[text()="COMPOSE"]')) |
373 compose_button.click() | 408 compose_button.click() |
374 | 409 |
375 to_field = self._wait.until(lambda _: self._GetElement( | 410 to_field = self._wait.until(lambda _: self._GetElement( |
376 self._driver.find_element_by_name, 'to')) | 411 self._driver.find_element_by_name, 'to')) |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 iteration_num = 0 | 450 iteration_num = 0 |
416 while time.time() - self._test_start_time < self._test_length_sec: | 451 while time.time() - self._test_start_time < self._test_length_sec: |
417 iteration_num += 1 | 452 iteration_num += 1 |
418 | 453 |
419 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 454 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
420 last_perf_stats_time = time.time() | 455 last_perf_stats_time = time.time() |
421 self._GetPerformanceStats(self._webapp_name, test_description, | 456 self._GetPerformanceStats(self._webapp_name, test_description, |
422 self._tab_title_substring) | 457 self._tab_title_substring) |
423 | 458 |
424 if iteration_num % 10 == 0: | 459 if iteration_num % 10 == 0: |
425 remaining_time = self._test_length_sec - ( | 460 remaining_time = self._test_length_sec - (time.time() - |
426 time.time() - self._test_start_time) | 461 self._test_start_time) |
427 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 462 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
428 (iteration_num, remaining_time)) | 463 (iteration_num, remaining_time)) |
429 | 464 |
430 compose_button = self._wait.until(lambda _: self._GetElement( | 465 compose_button = self._wait.until(lambda _: self._GetElement( |
431 self._driver.find_element_by_xpath, | 466 self._driver.find_element_by_xpath, |
432 '//div[text()="COMPOSE"]')) | 467 '//div[text()="COMPOSE"]')) |
433 compose_button.click() | 468 compose_button.click() |
434 | 469 |
435 to_field = self._wait.until(lambda _: self._GetElement( | 470 to_field = self._wait.until(lambda _: self._GetElement( |
436 self._driver.find_element_by_name, 'to')) | 471 self._driver.find_element_by_name, 'to')) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 iteration_num = 0 | 511 iteration_num = 0 |
477 while time.time() - self._test_start_time < self._test_length_sec: | 512 while time.time() - self._test_start_time < self._test_length_sec: |
478 iteration_num += 1 | 513 iteration_num += 1 |
479 | 514 |
480 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 515 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
481 last_perf_stats_time = time.time() | 516 last_perf_stats_time = time.time() |
482 self._GetPerformanceStats(self._webapp_name, test_description, | 517 self._GetPerformanceStats(self._webapp_name, test_description, |
483 self._tab_title_substring) | 518 self._tab_title_substring) |
484 | 519 |
485 if iteration_num % 10 == 0: | 520 if iteration_num % 10 == 0: |
486 remaining_time = self._test_length_sec - ( | 521 remaining_time = self._test_length_sec - (time.time() - |
487 time.time() - self._test_start_time) | 522 self._test_start_time) |
488 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 523 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
489 (iteration_num, remaining_time)) | 524 (iteration_num, remaining_time)) |
490 | 525 |
491 # Find the first thread (e-mail) identified by a "span" tag that contains | 526 # Find the first thread (e-mail) identified by a "span" tag that contains |
492 # an "email" attribute. Then click it and wait for the conversation view | 527 # an "email" attribute. Then click it and wait for the conversation view |
493 # to appear (assumed to be visible when a particular div exists on the | 528 # to appear (assumed to be visible when a particular div exists on the |
494 # page). | 529 # page). |
495 thread = self._wait.until( | 530 thread = self._wait.until( |
496 lambda _: self._GetElement(self._driver.find_element_by_xpath, | 531 lambda _: self._GetElement(self._driver.find_element_by_xpath, |
497 '//span[@email]')) | 532 '//span[@email]')) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 iteration_num = 0 | 569 iteration_num = 0 |
535 while time.time() - self._test_start_time < self._test_length_sec: | 570 while time.time() - self._test_start_time < self._test_length_sec: |
536 iteration_num += 1 | 571 iteration_num += 1 |
537 | 572 |
538 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 573 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
539 last_perf_stats_time = time.time() | 574 last_perf_stats_time = time.time() |
540 self._GetPerformanceStats(self._webapp_name, test_description, | 575 self._GetPerformanceStats(self._webapp_name, test_description, |
541 self._tab_title_substring) | 576 self._tab_title_substring) |
542 | 577 |
543 if iteration_num % 10 == 0: | 578 if iteration_num % 10 == 0: |
544 remaining_time = self._test_length_sec - ( | 579 remaining_time = self._test_length_sec - (time.time() - |
545 time.time() - self._test_start_time) | 580 self._test_start_time) |
546 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 581 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
547 (iteration_num, remaining_time)) | 582 (iteration_num, remaining_time)) |
548 | 583 |
549 # Click the "Sent Mail" label, then wait for the tab title to be updated | 584 # Click the "Sent Mail" label, then wait for the tab title to be updated |
550 # with the substring "sent". | 585 # with the substring "sent". |
551 sent = self._wait.until( | 586 sent = self._wait.until( |
552 lambda _: self._GetElement(self._driver.find_element_by_xpath, | 587 lambda _: self._GetElement(self._driver.find_element_by_xpath, |
553 '//a[starts-with(text(), "Sent Mail")]')) | 588 '//a[starts-with(text(), "Sent Mail")]')) |
554 sent.click() | 589 sent.click() |
555 self.assertTrue( | 590 self.assertTrue( |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 iteration_num = 0 | 636 iteration_num = 0 |
602 while time.time() - self._test_start_time < self._test_length_sec: | 637 while time.time() - self._test_start_time < self._test_length_sec: |
603 iteration_num += 1 | 638 iteration_num += 1 |
604 | 639 |
605 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 640 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
606 last_perf_stats_time = time.time() | 641 last_perf_stats_time = time.time() |
607 self._GetPerformanceStats(self._webapp_name, test_description, | 642 self._GetPerformanceStats(self._webapp_name, test_description, |
608 self._tab_title_substring) | 643 self._tab_title_substring) |
609 | 644 |
610 if iteration_num % 10 == 0: | 645 if iteration_num % 10 == 0: |
611 remaining_time = self._test_length_sec - ( | 646 remaining_time = self._test_length_sec - (time.time() - |
612 time.time() - self._test_start_time) | 647 self._test_start_time) |
613 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 648 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
614 (iteration_num, remaining_time)) | 649 (iteration_num, remaining_time)) |
615 | 650 |
616 # Click the "Expand all" icon, then wait for that icon to be removed from | 651 # Click the "Expand all" icon, then wait for that icon to be removed from |
617 # the page. | 652 # the page. |
618 expand = self._wait.until( | 653 expand = self._wait.until( |
619 lambda _: self._GetElement(self._driver.find_element_by_xpath, | 654 lambda _: self._GetElement(self._driver.find_element_by_xpath, |
620 '//img[@alt="Expand all"]')) | 655 '//img[@alt="Expand all"]')) |
621 expand.click() | 656 expand.click() |
622 self._wait.until( | 657 self._wait.until( |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 logging.error('Error count threshold (%d) reached. Terminating test ' | 723 logging.error('Error count threshold (%d) reached. Terminating test ' |
689 'early.' % self._ERROR_COUNT_THRESHOLD) | 724 'early.' % self._ERROR_COUNT_THRESHOLD) |
690 break | 725 break |
691 | 726 |
692 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 727 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
693 last_perf_stats_time = time.time() | 728 last_perf_stats_time = time.time() |
694 self._GetPerformanceStats(self._webapp_name, test_description, | 729 self._GetPerformanceStats(self._webapp_name, test_description, |
695 self._tab_title_substring) | 730 self._tab_title_substring) |
696 | 731 |
697 if iteration_num % 10 == 0: | 732 if iteration_num % 10 == 0: |
698 remaining_time = self._test_length_sec - ( | 733 remaining_time = self._test_length_sec - (time.time() - |
699 time.time() - self._test_start_time) | 734 self._test_start_time) |
700 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 735 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
701 (iteration_num, remaining_time)) | 736 (iteration_num, remaining_time)) |
702 | 737 |
703 # Click the "Owned by me" button and wait for a resulting div to appear. | 738 # Click the "Owned by me" button and wait for a resulting div to appear. |
704 if not self._ClickElementByXpath( | 739 if not self._ClickElementByXpath( |
705 driver, wait, '//div[text()="Owned by me"]'): | 740 driver, wait, '//div[text()="Owned by me"]'): |
706 num_errors += 1 | 741 num_errors += 1 |
707 if not self._WaitForElementByXpath( | 742 if not self._WaitForElementByXpath( |
708 driver, wait, | 743 driver, wait, |
709 '//div[@title="Owned by me filter. Use backspace or delete to ' | 744 '//div[@title="Owned by me filter. Use backspace or delete to ' |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 logging.error('Error count threshold (%d) reached. Terminating test ' | 802 logging.error('Error count threshold (%d) reached. Terminating test ' |
768 'early.' % self._ERROR_COUNT_THRESHOLD) | 803 'early.' % self._ERROR_COUNT_THRESHOLD) |
769 break | 804 break |
770 | 805 |
771 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: | 806 if time.time() - last_perf_stats_time >= self._get_perf_stats_interval: |
772 last_perf_stats_time = time.time() | 807 last_perf_stats_time = time.time() |
773 self._GetPerformanceStats(self._webapp_name, test_description, | 808 self._GetPerformanceStats(self._webapp_name, test_description, |
774 self._tab_title_substring) | 809 self._tab_title_substring) |
775 | 810 |
776 if iteration_num % 10 == 0: | 811 if iteration_num % 10 == 0: |
777 remaining_time = self._test_length_sec - ( | 812 remaining_time = self._test_length_sec - (time.time() - |
778 time.time() - self._test_start_time) | 813 self._test_start_time) |
779 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % | 814 logging.info('Chrome interaction #%d. Time remaining in test: %d sec.' % |
780 (iteration_num, remaining_time)) | 815 (iteration_num, remaining_time)) |
781 | 816 |
782 # Click the "Friends" button and wait for a resulting div to appear. | 817 # Click the "Friends" button and wait for a resulting div to appear. |
783 if not self._ClickElementByXpath( | 818 if not self._ClickElementByXpath( |
784 driver, wait, | 819 driver, wait, |
785 '//a[text()="Friends" and starts-with(@href, "stream/circles")]'): | 820 '//a[text()="Friends" and starts-with(@href, "stream/circles")]'): |
786 num_errors += 1 | 821 num_errors += 1 |
787 if not self._WaitForElementByXpath( | 822 if not self._WaitForElementByXpath( |
788 driver, wait, '//div[text()="Friends"]'): | 823 driver, wait, '//div[text()="Friends"]'): |
(...skipping 10 matching lines...) Expand all Loading... |
799 driver, wait, '//div[text()="Acquaintances"]'): | 834 driver, wait, '//div[text()="Acquaintances"]'): |
800 num_errors += 1 | 835 num_errors += 1 |
801 time.sleep(1) | 836 time.sleep(1) |
802 | 837 |
803 self._GetPerformanceStats(self._webapp_name, test_description, | 838 self._GetPerformanceStats(self._webapp_name, test_description, |
804 self._tab_title_substring) | 839 self._tab_title_substring) |
805 | 840 |
806 | 841 |
807 if __name__ == '__main__': | 842 if __name__ == '__main__': |
808 pyauto_functional.Main() | 843 pyauto_functional.Main() |
OLD | NEW |