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

16

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

之所以只能通过浏览器进行测试,而其他任何方法都行不通,是为了同时对视频流服务器和广告服务器进行压力测试,并实时显示广告。

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

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

有什么建议可以用 Selenium 解决这个问题吗?


如果您需要模拟负载,可以使用名为 pylot(http://pylot.org/)的开源工具。该工具可以模拟并发连接,并且您可以提供一个以 XML 编写的测试场景(请阅读网站上的入门指南)。该工具不使用真实浏览器。 - alonp
6个回答

5
你不会在你的机器上运行1万个浏览器,那样每个浏览器实例将给予3.2MB的物理内存,我相信FireFox肯定不喜欢这种情况。你可以创建一个JMeter脚本,使用多个线程向服务器发送请求。虽然它不会与UI交互,但会模拟许多客户端同时访问你指定的URLs带来的负载。我相信它还包括记录会话并进行回放以简化会话设置的功能。

1
10000是一个假设的数字,对于当前的服务器配置,即使1000-5000也足够了。在我的情况下,Jmeter并不实用,因为我有一个需要执行一分钟才能成功测试的富媒体应用程序。 - Sumit Ghosh
2
3.2MB或32MB的RAM,我怀疑Firefox在任何一种情况下都会崩溃。如果你想向服务器投放1000个线程,可以说你正在测试服务器,那么客户端在做什么并不重要。无论客户端是完整的Firefox使用媒体并对其进行操作,还是只是使用与富媒体应用程序相同的时间轴对适当的URL进行curl或wget,对服务器来说都没有影响,对吗? - digitaljoel
2
测试更多地涉及到富媒体应用在压力下的行为,而不仅仅是服务器负载。我正在尝试测试可能最接近真实用户场景的情况。Curl请求无法执行富媒体客户端应用程序,因此它不会是整个应用程序的真正测试。 - Sumit Ghosh
2
如果您想测试客户端应用程序,那么创建一个性能严重不足的虚拟机并在其中启动几个实例如何?您仍然可以使用jmeter脚本向服务器发送请求以使负载达到要求,并且您可以在弱虚拟机上运行selenium脚本。 - digitaljoel

4
Selenium并不是真正针对负载/压力测试进行优化的,尤其是如果您正在本地运行浏览器。运行1000多个浏览器甚至会使最强大的服务器崩溃。虽然RAM显然是一个瓶颈,但您还有受限制的CPU资源和带宽。如果您加载视频,则后者是主要问题。
更不用说您将使用单个IP进行10k浏览器测试,因此负载平衡可能无法正常启动,以及实际的视频广告分发给特定的虚拟用户。
如果您想坚持使用现有的Selenium测试,我建议使用BrowserMob。他们基本上有一个巨大的网格来进行真正的浏览器负载测试,分布在AWS上。
另一个建议是使用实际的性能测试工具。我推荐Soasta CloudTest。他们有一个免费版本,可以运行100个用户,因此您可以看到它是否适合您。我发现为CloudTest编写脚本相对简单。
免责声明:我与这两家公司的经验都是作为付费客户,并且我从未为任何一家公司工作过。

1

你的帖子让我感觉有某种形式的基于广告欺诈,但无论如何:你考虑过使用除Firefox之外的不同网络浏览器吗?PhantomJS是一个基于Webkit的无头浏览器,与Selenium兼容。它支持所有核心浏览器功能,如DOM处理、CSS选择器、Javascript和Canvas。我不知道它是否支持Flash。

这篇文章列出了一些其他可自动化的无头浏览器,你可以考虑一下。

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


1

如果您使用的是Windows机器,根据我的经验,打开浏览器窗口实例的数量是有限制的。根据我上次测试的结果,它在100-150个浏览器窗口之间进行限制。

我建议您使用无头机器人,它不需要打开浏览器窗口。我认为最新版本的Selenium具备这种能力。但是,由于您正在尝试模拟10,000多个用户实例,因此我建议您使用负载测试工具,如JMeter或LoadRunner。


我可以使用Selenium运行500个以上的Firefox实例,但问题是其中一半无法加载记录的测试脚本,只显示空白浏览器。没有真正的浏览器,这个测试是不可能完成的。我将在原帖中更新有关测试场景的更多细节。 - Sumit Ghosh
Sumit,如果你必须在活动的浏览器窗口中运行测试,则现在有以下选项: - Sandip Dhummad
如果您必须在活动浏览器窗口下运行测试,并且已经投入了大量时间和金钱编写Selenium脚本,那么我建议采用以下选项:1)在Amazon EC2上雇用多个实例。您可以在EC2实例上设置Selenium Grid。详细信息请参见:http://selenium-grid.seleniumhq.org/setting_up_selenium_grid_on_ec2.html。2)如果由于数据安全或其他原因无法使用云,则可以使用多个测试机在实验室中设置Selenium Grid。个人而言,我更喜欢使用EC2,因为它是快速、简单和便宜的选择。 - Sandip Dhummad
嗨,Sandip,我没有问题做到这一点,但现在我甚至不能使用我的怪兽测试服务器上仅有的30%的RAM和CPU。如果我在那里超过80%,我会考虑水平扩展。问题不在于扩展外部,而在于效率,启动1000个Firefox实例并让它们执行由Selenium脚本驱动的自动化作业。 - Sumit Ghosh
2
Sumit,你在启动浏览器窗口时是否有适当的预热时间。我们在启动两个浏览器窗口之间设置了大约10毫秒的休眠时间。我们发现设置适当的休眠时间可以增加浏览器实例的数量。在你的情况下,10毫秒可能不起作用,但你可以从这个数字开始。我知道它会使你的测试数据要求变得复杂,因为现在你必须让每个用户运行其测试场景多次,以达到所有用户都在运行的最终场景。我们不得不为同一个测试脚本设置多个测试数据。 - Sandip Dhummad

1

看起来你是想通过高流量来验证客户端会看到什么,对吗?

在这种情况下,Joel 是完全正确的。如果你绝对必须要看到客户端看到的内容,你可以使用线程命中并将结果存储在数据库中。这将显示客户端可能看到的任何内容,而且比成千上万个浏览器实例更容易整理。

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接