【问题标题】:Web Application Stress/Load Test using a simple Web Service使用简单的 Web 服务进行 Web 应用程序压力/负载测试
【发布时间】:2011-10-20 11:21:13
【问题描述】:

我目前正在编写一个 JMeter 插件来测试对似乎仅在我们的 Web 应用程序负载过重时才会出现的错误的修复。

作为允许编写负载/压力测试以测试 Web 应用程序的特定部分的通用解决方案,我正在考虑添加一个简单的 Restful Web 服务来调用测试。这样做的主要原因是绕过浏览器,因为我们感兴趣的测试是业务逻辑和数据库访问层(传统的内联 SQL)。

这是否值得花费时间和精力,或者是否可以使用 JMeter 来测试需要身份验证并大量使用 Javascript 和 Ajax 的复杂 Web 应用程序。

编辑

这些测试的目的是测试业务逻辑和数据访问层如何处理重负载情况,以确保没有错误或并发问题。这是一个遗留的 jsp Web 应用程序(即在 90 年代中期编写的),其中大部分是内联 sql,正在移动到 DAL 层。

【问题讨论】:

    标签: java testing web-applications jmeter


    【解决方案1】:

    直接进入业务逻辑的问题在于,您永远无法确定您在表示层中没有遇到给服务器带来额外负载的问题。并且单独测试业务逻辑可能意味着错过可能的性能问题(例如,如果在很多 HTTP 会话中有很多对象,您的服务器可能大部分时间都花在垃圾收集器上,因为堆太低了),所以我建议创建一个包含对服务器的所有调用的复杂测试计划。

    最简单的方法是使用 JMeter 的 HTTP 代理,启动您的浏览器,让 HTTP 代理为您记录测试计划。

    请参阅Basic JMeter Proxy Step By Step,了解如何开始使用代理。

    这将记录从浏览器到服务器的所有调用(您对 javascript 本身不感兴趣,因为这发生在浏览器上,因此不会影响服务器负载,尽管 AJAX 调用会)。

    HTTP 代理创建的测试计划将对所有值进行硬编码,因此您可能必须通过它来确定每次调用时哪些值不同(例如,如果您有一个返回新 ID 的创建选项,后续请求需要使用服务器返回的ID。

    要获得这些值,您可以将Regular Expression Extractors 添加到您的请求中,并分配一个变量名称,然后该变量名称可以在后续请求中用作请求参数。遍历请求参数并确定哪些需要替换为需要从先前页面解析的值可能有点乏味,但并不难。

    例如,如果您的页面在返回 HTML 中包含 recordId

    <input type="hidden" name="recordId" value="abcqwer123" />
    

    下一个请求中需要用到的,可以用下面的正则提取出来:

    name="recordId"\s+value="([a-z0-9]+)"
    

    要记住的另一件事是确保您使用范围广泛的测试数据(例如,如果您模拟多个用户登录,您需要确保并非每个测试都使用相同的 userId 运行,因为缓存可能意味着诸如数据库查找之类的繁重操作仅在您第一次运行时完成。为了简化使用多个帐户,您可以使用CSV Data Set Config 将值列表加载到变量中,然后每次迭代都会更改。

    我最后的建议是研究在Distributed Mode 中运行 JMeter。这是您在许多远程客户端上启动 Jmeter-server 的地方,然后它们都执行相同的测试。这可确保测试客户端本身会因没有足够的 CPU 内核或网络带宽来创建大量并发请求而造成瓶颈。

    【讨论】:

    • 谢谢,但我对性能测试本身并不感兴趣,但我对系统负载时在 DAL 中发生的并发性和错误进行测试。但是,如果我们需要优化性能,这将是值得考虑的,我们可能也会这样做。
    【解决方案2】:

    您可以从只为负载测试公开一个特殊的 API 中获得几个好处:

    • 此 API 会很稳定,Web UI 会发生变化(输入、按钮等)
    • 您可以设计自己的 API,以便创建难以通过 Web UI 模拟的相关加载场景
    • 无论是使用 JMeter 或类似工具,还是仅使用 curl 编写脚本,创建加载场景都会变得更加容易

    现在剩下的就是估计创建这样一个 API 需要做多少工作,以及这些好处是否值得。

    【讨论】:

    • 我之所以不太喜欢只为测试而创建特殊API是因为需要确保在创建发布版本时在构建过程中删除特殊API,或者安全以免创建后门。但是,如果安全,这可能是一个附加功能,可以更轻松地与第三方系统集成。
    • 是的,这些好处就是我考虑它的原因,希望我可以将它保留为一个简单的配置标志和 servlet,这样就不会做太多工作了。
    • @beny23 唯一的安全风险来自 DOS 攻击,它不会暴露任何数据,如果您想确保它不会暴露任何数据,您也可以使用静态常量作为 ac 样式预处理器标志t 进入发布版本。
    • @eaglestorm 我之前被咬过,由于混淆我在生产而不是测试环境中调用服务,所以我的建议是确保测试方法不容易在非测试环境中调用以避免意外故障,因为 Sod 定律指出它只会在生产负载达到峰值时发生:-)
    【解决方案3】:

    如果您有 JUnit 测试,您可以使用 JUnit Sampler 并重用数据访问和业务层的现有测试,而不是编写 REST 服务并通过 JMeter 调用它。

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2021-01-18
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多