测试REST基础的Web服务器并发请求

20

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

4个回答

39

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个请求。

谢谢。那么这可以用来模拟不同大小的数据检索吗?有没有指定文件大小的方法? - Naveen Mohan
我不知道这个功能(即文件大小)。 - ioseb
5
安装Apache2工具:在终端中输入sudo apt-get install apache2-utils - gavenkoa

4
我知道这是一个老问题,但我需要一个简单的基于AJAX的脚本来测试多个并发连接。如果你们中有任何人有类似的要求,那么你们也可以像这个脚本一样用来进行测试。
请查看这个js fiddle链接或查看附加的截图(两者都指向相同的JavaScript代码)。模拟多个Ajax请求的JS代码快照

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

1
在使用Rest Commander时,我一直与Windows 10冲突作斗争。后来,我尝试了JMeter,并发现它非常适合我的需求。虽然要学习界面有些麻烦,但它相当容易理解。如果PostMan实现并发,那我会很高兴的! - Astravagrant

-3

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


楼主需要示例。 - Astravagrant
1
原帖可能是在寻找示例,但它们都是特定于工具的。REST 基于 HTTP 或 SMTP 进行传输。因此,任何支持这些接口甚至原始套接字接口的工具都可以用于发送和接收 RESTful 消息。测试并选择工具的人没有体现出架构愿景,这应该让要求测试信息以减少部署风险的人感到担忧。架构知识是性能测试人员的基本技能。 - James Pulley
1
GET和PUT将其在HTTP阵营中作为传输方式。因此,从架构的角度来看,任何基于HTTP的性能测试工具都可以用于对接口进行测试。有些工具可能具有其他理想的功能,例如监控、分析能力、SLA报告甚至更适合团队的技能。至于我,我会获取LoadRunner或SOASTA CloudTest的短期许可证。 - James Pulley
谢谢,我完全同意你在回答和评论中所说的一切,但是如果没有列表,这就不是一个有用的答案。问题有点假设这些东西的存在,但请求一些想法。我刚刚花了一天时间搜索和试用测试运行器,我可以看到推荐列表的价值。我甚至都没见过你在这里提到的两个!谢谢。时间过后我会取消踩的。 - Astravagrant

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