如何使用 Selenium 进行模拟重负载的压力测试

Posted

技术标签:

【中文标题】如何使用 Selenium 进行模拟重负载的压力测试【英文标题】:How to stress test simulating heavy load using Selenium 【发布时间】:2012-04-10 05:03:57 【问题描述】:

我有一个系统要测试,它是一种视频广告分发技术。我需要像 1-2 分钟那样加载每个视频来投放广告。视频在 Flash 客户端中播放,并像在 YouTube 中一样以 FLV 流的形式流式传输。

我只需要通过浏览器对其进行测试(而其他所有方法都行不通)的原因是同时对视频流服务器和广告服务器进行压力测试并实时显示广告。

我使用过 Selenium、WatiN、Automation Anywhere 和许多其他自动化工具。但是,当我尝试在我的机器上启动 10000 个浏览器(32GB RAM,16 核 CPU)时,它们都无法完成这项工作。

使用 Selenium,到目前为止,我能够启动最多的 FireFox 实例,但这仍然太低:一半的实例没有运行测试。

对 Selenium 有什么建议吗?

【问题讨论】:

如果您需要模拟负载,您可以使用名为 pylot (pylot.org) 的开源工具,该工具可以模拟并发连接,您可以提供用 XML 编写的测试场景(阅读入门在网站上)。该工具未使用真正的浏览器。 【参考方案1】:

您不会在您的机器上运行 10,000 个浏览器。这将为每个浏览器实例提供 3.2MB 的物理内存,我很确定 FireFox 不会喜欢这样。

您可以创建一个 JMeter 脚本,用许多线程访问您的服务器。它不会与 UI 交互,但会模拟许多客户端访问您告诉它的任何 URL 的负载。我相信它还包括录制和回放会话的功能,以便轻松设置会话。

【讨论】:

10000 是一个假设的数字,对于当前的服务器配置,即使 1000-5000 也可以。 Jmeter 在我的情况下没有用,因为我有一个富媒体应用程序需要执行一分钟才能使测试成功。 3.2MB 或 32MB 的 ram,我怀疑 firefox 在这两者上同样会窒息。可以说,如果您希望向服务器抛出 1000 个线程,那么您正在测试服务器,那么谁在乎客户端在做什么呢?客户端是使用媒体并使用媒体执行某些操作的成熟的 firefox,还是只是 curl 或 wget 以与富媒体应用程序相同的时间到达适当的 URL,这对服务器来说应该是无关紧要的,不是吗? 测试更多地与富媒体应用程序在压力下的行为方式有关,而不仅仅是服务器在负载下。我正在尝试在这里测试可能最近的现实世界用户场景。 curl 请求不会执行富媒体客户端应用程序,因此它不会是对整个应用程序的真正测试。 如果您正在寻找测试客户端应用程序,那么创建一个严重不足的虚拟机并在其上启动一些实例呢?您仍然可以使用 jmeter 脚本访问服务器以将负载加载到那里,然后您可以在弱 vm 上运行您的 selenium 脚本。【参考方案2】:

Selenium 并未真正针对负载/压力测试进行优化,尤其是当您在本地运行浏览器时。运行 1000 多个浏览器甚至会扼杀最强大的服务器。尽管 RAM 是一个明显的瓶颈,但 CPU 资源和带宽也有限。如果您正在加载视频,则后者是主要问题。

更不用说您将使用 10k 浏览器从单个 IP 进行测试,因此负载平衡可能无法正常启动,以及视频广告的实际分发给特定虚拟用户。

如果您想坚持使用现有的 Selenium 测试,我对 BrowserMob 有很好的体验。他们基本上有一个巨大的网格来进行真正的浏览器负载测试,分布在 AWS 上。

另一个建议是实际的性能测试工具。我推荐Soasta CloudTest。他们有一个运行 100 个用户的免费版本,因此您可以查看它是否适合您。我发现 CloudTest 的脚本编写相对简单。

免责声明:我在这两家公司的经历都是作为付费客户,我从未为这两家公司工作过。

【讨论】:

【参考方案3】:

如果您使用的是 Windows 机器,那么根据我的经验,要打开的浏览器窗口实例的数量是有限制的。根据我上次的测试,它确实限制了 100-150 个浏览器窗口。

我建议您使用无需打开浏览器窗口的无头机器人。我认为最新版本的 Selenium 具有这种能力。但它似乎更像是一个负载测试,因为您试图模拟 10,000 多个用户实例,我建议您使用 JMeter 或 LoadRunner 等负载测试工具。

【讨论】:

我能够使用 selenium 运行 500 多个 firefox 实例,但问题是其中一半不会加载记录的测试脚本,它们只是显示空白浏览器。如果没有真正的浏览器,则无法进行此测试,我将更新我的原始帖子,并提供有关测试场景的更多详细信息。 Sumit,如果您必须使用活动浏览器窗口运行测试,那么您现在有以下选项: Sumit,如果您必须使用活动的浏览器窗口运行测试,并且您已经投入了大量时间和金钱来编写 selenium 脚本,那么我建议以下选项:1)在 Amazon EC2 上使用多个实例。您可以在 EC2 实例上设置 Selenium Grid。详情请访问:selenium-grid.seleniumhq.org/…。 2)如果由于数据安全或任何其他原因您不能使用云,那么您可以在实验室使用多台测试机设置 selenium 网格。就我个人而言,我更喜欢使用 EC2 作为其快速、简单且便宜的选择。 嘿 Sandip,我这样做没有问题,但现在我什至无法使用我的怪物测试服务器中 30% 的内存和 CPU。如果我在那里超过 80%,我会考虑水平缩放。问题不在于向外扩展,而在于效率启动 1000 个 Firefox 实例并让它们完成由 selenium 脚本驱动的自动化工作。 Sumit,在启动浏览器窗口时,您是否有适当的启动时间。我们在 2 个浏览器窗口启动之间有大约 10 毫秒的睡眠时间。我们已经看到,设置适当的睡眠时间增加了浏览器实例数量的容量。在您的情况下,10 ms 秒可能无法正常工作,但您可以从该数字开始。我知道这会使您的测试数据需求复杂化,因为现在您必须让每个用户多次运行其测试场景,以实现所有用户都启动并运行的最终场景。我们必须为同一个测试脚本设置多个测试数据。【参考方案4】:

在我看来,您正在尝试根据高流量验证客户端会看到什么,不是吗?

在这种情况下,乔尔是完全正确的。如果您绝对必须查看客户端看到的内容,则可以使用线程命中并将结果转储到数据库中。这将向您显示客户端无论如何都会看到的任何内容,并且比数千个浏览器实例更容易排序。

无论哪种方式,如果服务器端没有错误,您的客户端将不会看到错误。如果您在带宽受限的环境、CPU 密集型环境或内存密集型环境中测试功能,那么这些比运行数千个浏览器实例更容易实现。

【讨论】:

【参考方案5】:

您的帖子在我看来是某种形式的基于广告的欺诈行为,但无论哪种方式:您是否考虑过使用除 Firefox 之外的其他网络浏览器? PhantomJS 是一个与 Selenium 兼容的基于 webkit 的无头浏览器。它支持所有核心浏览器功能,如 DOM 处理、CSS 选择器、javascript 和 Canvas。不知道是否支持Flash。

This 帖子有一个不错的列表,列出了您可能会考虑的其他无头和可自动化网络浏览器。

此外,如果每个浏览器实例都在实例化 Flash 插件,请不要忽视问题可能出在 Flash 而不是 Firefox 的可能性。或者,为什么要实例化几个不同的 Firefox 进程?你可以通过使用标签来完成你想要的吗?

【讨论】:

【参考方案6】:

使用 selenium 的内部方法是使用 browsermob proxy 和多个浏览器代理来重新创建不同用户的体验,更改 ip 更加困难,因为它需要更改您的家庭网络。

Here is a good example

【讨论】:

以上是关于如何使用 Selenium 进行模拟重负载的压力测试的主要内容,如果未能解决你的问题,请参考以下文章

Apache网页深入优化——ab压力测试,工作模式

作为DBA,你不得不掌握的压测工具

Apache 的 ab 压测工具快速使用

白帽***与网络安全工程师教你:如何进行DDOS***与网站压力测试实战?

白帽***与网络安全工程师教你:如何进行DDOS***与网站压力测试实战?

如何使用 Apache ab 以及 OneAPM 进行压力测试?