在Web应用程序上执行压力测试?

dea*_*mer 241 performance web-applications stress-testing webapplicationstresstool pylot

过去,我使用Microsoft Web Application Stress Tool和Pylot来强调测试Web应用程序.我写了一个简单的主页,登录脚本和网站演练(在电子商务网站中添加一些项目到购物车和结帐).

只需与少数几个开发人员一起努力点击主页几乎总能找到一个主要问题.更多可扩展性问题将在第二阶段出现,甚至更多 - 在发布之后.

我使用的工具的URL是Microsoft Homer(又名Microsoft Web Application Stress Tool)和Pylot.

这些工具生成的报告对我来说从来没有多大意义,我会花费很多时间来弄清楚网站能够支持哪种并发负载.它总是值得的,因为最愚蠢的错误和瓶颈总是会出现(例如,Web服务器配置错误).

您做了什么,使用了哪些工具,以及您的方法取得了哪些成功?对我来说最有趣的部分是提出某种有意义的公式,用于根据压力测试应用程序报告的数量计算应用程序可以支持的并发用户数.

Pet*_*ier 110

这是JMeter的另一次投票.

JMeter是一个用Java编写的开源负载测试工具.它能够测试许多不同的服务器类型(例如,Web,Web服务,数据库,几乎任何使用请求的服务器).

然而,一旦你开始进行复杂的测试,它确实有一个陡峭的学习曲线,但它是值得的.您可以非常快速地启动和运行,并且根据您想要进行的压力测试,可能没问题.

优点:

  • 来自Apache项目的开源/免费工具(帮助买入)
  • 一旦掌握了核心概念,便于上手,易于使用.(即,如何创建请求,如何创建断言,如何使用变量等).
  • 非常可扩展.我用11台机器运行测试,在服务器上产生负载,达到近百万次点击/小时.它的设置比我预期的容易得多.
  • 拥有活跃的社区和良好的资源,可以帮助您启动和运行.首先阅读教程并使用它一段时间.

缺点:

  • UI是用Swing编写的.(啊!)
  • JMeter通过解析服务器返回的响应文本来工作.因此,如果您希望验证任何类型的JavaScript行为,那么您将失去运气.
  • 非程序员的学习曲线很陡峭.如果您熟悉正则表达式,那么您已经领先于游戏.
  • 在支持论坛中有大量(插入咒骂)白痴问愚蠢的问题,如果他们给文档甚至粗略一瞥就可以轻松解决.('如何使用JMeter对我的Windows GUI进行压力测试'经常出现).
  • 报告"开箱即用"还有很多不足之处,特别是对于大型测试.在我上面提到的测试中,我最终必须编写一个快速控制台应用程序来执行"xml-logfile"到"html"转换.那是几年前的事情,所以很可能不再需要这样做了.

  • 我不同意JMeter的可扩展性.每小时一百万个请求仅为278个请求/秒,与其他工具相比,它在11台机器上运行时极低.我实际上将JMeter的可扩展性放在了Cons方面. (5认同)

Mik*_*one 36

我用过磨床.它是开源的,非常易于使用,并且非常易于配置.它是基于Java的,并使用Jython作为脚本.我们针对.NET Web应用程序运行它,所以不要认为它是一个仅限Java的工具(就其本质而言,任何Web压力工具都不应该与它使用的平台绑定).

我们做了一些巧妙的事情...我们是一个基于网络的电信应用程序,所以我设置的一个很酷的用途是模仿通过我们的网络应用程序拨号,然后使用我们的自动答案工具(这基本上是一个教程来自Microsoft的应用程序连接到他们的RTC LCS服务器......这是Microsoft Office Communicator在本地网络上连接的...然后修改为自动接听电话).这使我们可以使用它来代替昂贵的电话工具The Hammer(或类似的东西).

无论如何,我们还使用该工具来查看我们的应用程序如何在高负载下保持,并且它在查找瓶颈方面非常有效.该工具内置了报告功能,可显示请求的持续时间,但我们从未使用过它.日志还可以存储所有响应和诸如此类的自定义日志记录.

我强烈推荐这个工具,价格非常有用......但期望用它做一些自定义设置(它有一个内置的代理来记录脚本,但它可能需要自定义来捕获类似会话...我知道我必须自定义它以利用每个线程的唯一会话).


Pat*_*ody 23

这次聚会有点晚了.我同意Pylot是最好的新兴开源工具.它使用简单,并由一个伟大的家伙(科里戈德堡)积极工作.作为OpenQA的创始人,我也很高兴Pylot现在列在我们的主页上并使用我们的一些基础设施(即论坛).

但是,我最近还决定负载测试的整个概念存在缺陷:模拟HTTP流量,应用程序虽然变得复杂,但却是一个痛苦的屁股.这就是我创建商业工具BrowserMob的原因.它是一种外部负载测试服务,在回放负载时使用Selenium控制真实的Web浏览器.

这种方法显然需要比正常负载测试的技术更多的硬件,但硬件实际上是相当便宜的,当你正在使用云计算.这样做的好处是脚本比正常的负载测试容易得多.您不必进行任何高级正则表达式匹配(如JMeter要求)来提取cookie,.NET会话状态,Ajax请求参数等.由于您使用的是真正的浏览器,他们只是按照自己的意愿去做.

很抱歉公然宣传商业产品,但希望这个概念对某些人来说很有意思,至少让他们考虑一些新的方法来处理负载测试,当你可以访问一堆额外的硬件时!

  • Pylot的作者还创建了另一个网络测试工具:http://code.google.com/p/multi-mechanize/ (2认同)
  • pylot.org链接重定向到某个可疑网站. (2认同)

gro*_*rom 15

我用过JMeter.除了测试Web服务器,您还可以测试数据库后端,消息传递服务和电子邮件服务器.


小智 9

对于简单的用法,我更喜欢ab(apache基准测试)和围攻,后来需要一个,因为ab不支持cookie,并且会从动态站点创建无限的会话.

两者都很简单:

ab -c n -t 30 url

siege -b -c n -t 30s url
Run Code Online (Sandbox Code Playgroud)

围攻可以运行更多的网址.

最后的围攻版本在siegerc上变得冗长,这很烦人.你只能通过编辑该文件(/usr/local/etc/siegerc)来禁用它.


dan*_*iti 9

有关基于Web的服务,请查看loader.io.

摘要:

loader.io是一个免费的负载测试服务,允许您通过数千个并发连接对web-apps/apis进行压力测试.

他们也有一个API.

  • 这是使用您自己的机器测试您自己的机器的一个很好的替代方案 (2认同)

小智 9

由于这个问题仍未解决,我不妨考虑一下.

好消息是,在过去5年左右的时间里,开源工具已经真正成熟并在这个领域取得了成功,坏消息是其中有很多这样的工具.

以下是我的想法: -

Jmeter vs Grinder

Jmeter由XML样式规范驱动,该规范通过GUI构建.

Grinder在多线程Java框架中使用Jython脚本,因此更加面向程序员.

这两个工具都将处理HTTP和HTTPS,并有一个代理记录器来帮助您入门.这两个工具都使用Controller模型来驱动多个测试代理,因此可扩展性不是问题(给定访问云).

哪个更好:-

当你进入更复杂的脚本重写,关联,为每个虚拟用户提供唯一数据以及第一次模拟或返回用户(通过操纵HTTP标头)时,这两个工具的学习曲线都很陡峭.

这就是说我会从Jmeter开始,因为这个工具有很多关注者,网上有很多使用这个工具的例子和教程.如果你来到一个"路障",这是你不能轻易用Jmeter做的事情,那么看看磨床.好消息是这些工具具有相同的Java要求,并且"混合搭配"解决方案不是不可能的.

新增内容 - 运行Selenium WebDriver多个实例的无头浏览器.

这是一种相对较新的方法,因为它依赖于现在可以从云配置的资源的可用性.使用这种方法,可以在多个线程中的无头浏览器(即WebDriver = New HtmlUnitDriver())驱动程序中运行Selenium(WebDriver)脚本.

根据经验,可以从Amazon M1 Small Instance执行大约25个"无头浏览器"实例.

这意味着当您将功能测试脚本重新调整为性能测试脚本时,所有相关性,URL重写问题都会消失.

与HTTP驱动程序(如Grinder或Jmeter)相比,可扩展性受到影响,因为需要更多的VM来驱动负载.也就是说,如果您希望以每小时1.20美元的成本驱动500个虚拟用户,然后使用20个亚马逊小型实例(每个小时6美分),那么您的负载将非常接近真实用户体验.


ale*_*cxe 7

此外,还有一个使用greenlet的真棒开源pure-python分布式和可扩展的蝗虫框架.它非常适合模拟大量的并发用户.


Sun*_*pil 7

我们最近开始使用Gatling进行负载测试.我强烈建议您尝试使用此工具进行负载测试.我们过去曾经使用过SOASTA和JMETER.我们考虑加特林的主要原因如下:

  • 记录场景的记录器
  • 使用Akka和Netty,与Jmeter线程模型相比,它具有更好的性能
  • 与Scmeter XML相比,DSL Scala非常易于维护
  • 容易编写测试,不要吓唬它是否是scala.
  • 报告

让我举一个使用Gatling Code编写代码的简单示例:

// your code starts here  
val scn = scenario("Scenario")  
     .exec(http("Page")
     .get("http://example.com")) 
// injecting 100 user enter code here's on above scenario.   
setUp(scn.inject(atOnceUsers(100)))       
Run Code Online (Sandbox Code Playgroud)

但是,您可以尽可能地使其复杂化.其中一个突出Gatling的功能是报告非常详细.

以下是一些链接:
Gatling
Gatling Tutorial

我最近就此发表了演讲,你可以在这里进行讨论:https:
//docs.google.com/viewer?url = http%3A%2F%2Ffiles.meetup.com%2F3872152%2FExploring-Load-Testing-with -Gatling.pdf


Chr*_*s F 6

这是一个老问题,但我认为新的解决方案值得一提.Checkout LoadImpact:http://www.loadimpact.com.