【问题标题】:Test concurrent requests to a REST based web server测试对基于 REST 的 Web 服务器的并发请求
【发布时间】:2012-06-12 16:51:39
【问题描述】:

如何模拟对基于 REST 的 Web 服务器的数千个 GET 和 PUT 请求?是否有可用的工具,如果有,有哪些可用的工具?

【问题讨论】:

    标签: rest testing concurrency


    【解决方案1】:

    我知道这是一个老问题,但是我需要一个简单的基于 AJAX 的脚本来测试多个并发连接。如果你们中的任何人有类似的要求,那么您也可以像这个一样用于您的测试。

    请查看this js fiddle link 或查看附件(无论哪个适合您,因为两者都指向相同的 javascript 代码)

    var interval;
                var queue = [];
                var globalElapsedTime;
                
                 function getUrl() {
                        return $.trim($("#txtAjayUrl").val());
                    }
                
                 $("#btnLaunchRequests").on("click", function () {
                        queue = [];
                        $("#divTimeElapsed").html("<i>calculating</i>");                    
                        globalElapsedTime = window.performance.now();
                        $("#divRequestStatus").show();
                        $("#btnLaunchRequests").prop("disabled", true);
                        var totalRequests = 50;
                        var inputValue = $("#txtNumberOfConcurrentRequests").val();
                        totalRequests = inputValue.trim();
    
                        $("#divTotalNumberOfProcessed").html(totalRequests.toString());
                        if (interval != null && interval != undefined) {
                            clearInterval(interval);
                        }
                        interval = window.setInterval(function () {
                            $("#divNumberOfCurrentRequests").text(queue.length);
                        }, 500);
    
                        for (let i = 1; i <= totalRequests; i++) {
                            console.log("Loop No. " + i);
                            if (i == totalRequests) {
                                $.get(getUrl(), function (data) {
                                    queue.push("1");
                                    $("#btnLaunchRequests").prop("disabled", false);
                                    $("#divNumberOfCurrentRequests").text(queue.length);
                                    //clearInterval(interval);
                                }).always(function () {
                                    $("#btnLaunchRequests").prop("disabled", false);
                                    globalElapsedTime = window.performance.now() - globalElapsedTime;
                                    globalElapsedTime = Math.round((globalElapsedTime / 1000) * 100) / 100;                                                                
                                    console.log("%cLast Result Processed in " + globalElapsedTime + " Seconds.", "color:green");
                                    $("#divTimeElapsed").text(globalElapsedTime + " seconds");
                                });
                            }
                            else {
                                $.get(getUrl(), function (data) {
                                    queue.push("1");
                                });
                            }
                        }
                    });
    <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
          <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
          <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
          <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
          
          <div class="container">
            <div class="row" style="padding-top:50px;">
                <div class="col-sm-12">
                    <h3>HTTP GET Concurrent Requests Tester</h3>
                </div>
            </div>
            <div class="row">
                <div class="col-sm-12">
                    <ul>
                        <li>Sample Ajax URL for concurrent request testing: <input type="text" id="txtAjayUrl" value="http://localhost:4500/Api/Home/GetCustomerDetails/36603/Test" style="width:100%"> <br><br>
                        </li>                    
                        
                        <li><input type="number" value="50" id="txtNumberOfConcurrentRequests"> <input type="button" value="Launch Concurrent Requests" id="btnLaunchRequests"> <br></li>
                                
                    </ul>
                </div>
            </div>
            
            <div class="row" id="divRequestStatus" style="">
                <div class="col-sm-12">
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th>
                                    Total Number of Requests
                                </th>
                                <th>
                                    Total Number of Requests Processed
                                </th>
                                <th>
                                    Total Time Elapsed
                                </th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td>
                                    <div id="divTotalNumberOfProcessed"></div>
                                </td>
                                <td>
                                    <div id="divNumberOfCurrentRequests" style="font-weight: bolder;"></div>
                                </td>
                                <td>
                                    <div id="divTimeElapsed"></div>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

    【讨论】:

      【解决方案2】:

      ab - Apache HTTP 服务器基准测试工具http://httpd.apache.org/docs/2.0/programs/ab.html

      这是测试 REST API 的绝佳工具。

      例子:

      ab -c 100 -n 100 http://service/path/to/resource
      

      在这个例子中:

      • “-c 100”表示100个并发请求,
      • “-n 100”表示100个请求

      【讨论】:

      • 谢谢。所以这也可以用来模拟不同大小的数据检索?有没有办法指定文件大小?
      • 我不知道这个功能(即文件大小)
      • sudo apt-get install apache2-utils
      【解决方案3】:

      几乎任何 HTTP 性能测试工具,无论是商业的还是开源的,都可以用来对 REST 接口进行性能测试。

      【讨论】:

      • OP 在示例之后。
      • 原始发布者可能是在示例之后,但它们都是特定于工具的。 REST 使用 HTTP 或 SMTP 进行传输。因此,任何支持这些接口的工具,甚至是原始套接字接口,都可以用来发送和接收 RESTful 消息。架构愿景不存在于执行测试和选择工具的过程中,这应该让任何要求提供测试信息以降低部署风险的人感到担忧。架构知识是性能测试人员的基础技能
      • GET 和 PUT 在架构上将其放置在 HTTP 阵营中作为传输。因此,从架构来看,任何基于 HTTP 的性能测试工具都可以完成接口测试工作。有些可能具有其他理想的功能,例如监控、分析功能、SLA 报告,甚至更适合团队的技能。至于我,我将获得 LoadRunner 或 SOASTA CloudTest 的短期许可证
      • 谢谢,我完全同意你在回答和 cmets 中所说的一切,但如果没有列表,它就不是一个有用的答案。这个问题有点假设这些东西的存在,但要求一些想法。刚刚花了一天时间搜索和试用测试运行器,我可以在推荐列表中看到它的价值。我什至没见过你在这里提到的两个!谢谢。时间段到期后,我将删除反对票。
      【解决方案4】:

      【讨论】:

      • 在使用 Rest Commander 解决 Windows 10 冲突后,我尝试了 JMeter,发现它完全适合我的目的。学习界面的开销有点大,但这很明智。不过,如果 PostMan 实现并发,我会欣喜若狂!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多