通过 selenium 进行浏览器性能测试

Posted

技术标签:

【中文标题】通过 selenium 进行浏览器性能测试【英文标题】:Browser performance tests through selenium 【发布时间】:2015-02-20 04:06:16 【问题描述】:

我们正在使用protractor 来测试内部 AngularJS 应用程序。

除了功能测试之外,我们还借助基于 nodejs browser-perf 库的 protractor-perf 来检查性能回归。因为,"Performance is a feature"。

使用protractor-perf,我们可以在进行浏览器操作时测量和断言不同的性能特征for example:

browser.get('http://www.angularjs.org');

perf.start(); // Start measuring the metrics
element(by.model('todoText')).sendKeys('write a protractor test');
element(by.css('[value="add"]')).click();
perf.stop(); // Stop measuring the metrics 

if (perf.isEnabled)  // Is perf measuring enabled ?
    // Check for perf regressions, just like you check for functional regressions
    expect(perf.getStats('meanFrameTime')).toBeLessThan(60); 
;

现在,对于另一个内部应用程序,我们有一组用 Python 编写的基于硒的测试。

是否可以使用 selenium-python 检查性能回归,或者我应该使用 protractor 重写测试以便能够编写浏览器性能测试?

【问题讨论】:

希望这可能help...在GTAC - 2013 中对此进行了详细讨论。 @VivekSingh 确实如此。在这个谷歌测试自动化会议演讲中提出的想法非常棒,并且与我所问的非常相关。我将尝试以特定于 python 的方式开发这个想法,我希望我能在这里提交一个答案。非常感谢。 很高兴知道它有帮助...干杯... 【参考方案1】:

通过收集chrome performance logs 并对其进行分析,有可能更接近what browser-perf is doing。

对于get performance logs,通过调整loggingPrefs 所需的功能来打开performance 日志:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.CHROME
caps['loggingPrefs'] = 'performance': 'ALL'
driver = webdriver.Chrome(desired_capabilities=caps)

driver.get('https://***.com')

logs = [json.loads(log['message'])['message'] for log in driver.get_log('performance')]

with open('devtools.json', 'wb') as f:
    json.dump(logs, f)

driver.close()

此时,devtools.json 文件将包含一堆跟踪记录:

[
  
    "params": 
      "timestamp": 1419571233.19293,
      "frameId": "16639.1",
      "requestId": "16639.1",
      "loaderId": "16639.2",
      "type": "Document",
      "response": 
        "mimeType": "text/plain",
        "status": 200,
        "fromServiceWorker": false,
        "encodedDataLength": -1,
        "headers": 
          "Access-Control-Allow-Origin": "*",
          "Content-Type": "text/plain;charset=US-ASCII"
        ,
        "url": "data:,",
        "statusText": "OK",
        "connectionId": 0,
        "connectionReused": false,
        "fromDiskCache": false
      
    ,
    "method": "Network.responseReceived"
  ,
  
    "params": 
      "timestamp": 1419571233.19294,
      "encodedDataLength": 0,
      "requestId": "16639.1"
    ,
    "method": "Network.loadingFinished"
  ,
  ..
]

现在的问题是,如何处理它。

最初建议during the Google Test Automation Conference 的一个选项是将日志提交给webpagetest.org。有一个示例 in java 可用here,但是,目前,我没有运气在 Python 中实现它。

理论上,webpagetest.org 生成的 UI 报告应该是这样的:

它们还提供 JSON/XML 和其他可以进一步分析的格式的指标。

这真的很重要,感谢 Vivek Singh 的指点评论。


browser-perf 还使用日志记录功能来获取跟踪日志并分析数据。

【讨论】:

【参考方案2】:

可以使用 Selenium 进行性能回归测试。但是,正如您可能已经注意到的那样。 Selenium 的核心本质是模仿用户行为。这意味着如果用户能够执行相同的操作,Selenium 只会执行该操作(例如单击按钮)。还要考虑到某些代码、变通方法(即硬等待、各种检查和自定义代码),甚至能够运行 Selenium 脚本。这意味着使用 Selenium 进行性能测试的“定义”与传统的性能测试相比会略有不同。

您需要为 Selenium 执行的每个操作设置一个计时器(开始/停止)。例如:单击一个按钮并将其记录到文件中以供以后使用。

使用 Selenium,您可以创建性能基准,然后将每个连续结果与基准进行比较。这将为您提供统计数据,然后您可以将其用于进一步分析。

Selenium 和 Webdriver (Selenium 2.0) 开箱即用。因此,需要进行一些自定义编码才能使其正常工作。

【讨论】:

这是一个有趣且扎实的观点。这是我个人想指出的——selenium 只是一个浏览器自动化工具,用于模仿用户在页面上的操作。但是,browser-perf 工具肯定是doing a lot on top of it - 使用about:tracing 来收集性能指标。我想我应该遵循您建议的方法(坚持基线),或者切换到protractor,这是我们无论如何都开始广泛使用的东西。谢谢。【参考方案3】:

不建议通过 Selenium 进行性能测试,因为它没有针对工作进行优化。它已被 Selenium team 列为最糟糕的做法之一:

在用户的上下文中进行性能测试似乎很理想,但一套 WebDriver 测试会受到许多外部和内部脆弱性的影响,这些都是您无法控制的;例如浏览器启动速度、HTTP 服务器的速度、托管 javascript 或 CSS 的第三方服务器的响应,以及 WebDriver 实现本身的检测损失。这些点的变化会导致结果的变化。很难区分您网站的性能和外部资源的性能之间的差异,也很难说在浏览器中使用 WebDriver 的性能损失是多少,尤其是在您注入脚本的情况下。

【讨论】:

以上是关于通过 selenium 进行浏览器性能测试的主要内容,如果未能解决你的问题,请参考以下文章

selenium第一天学习

基于webdriver的jmeter性能测试-Eclipse+Selenium+JUnit生成jar包

软件测试特训,系统测试,WEB测试,UFT与Selenium自动化测试,LR性能测试

重放浏览器多个请求性能测试实践

前端自动化测试漫长路之——Selenium初探

JMeter如何联合Selenium WebDriver进行自动化测试?