新聞中心
簡介:
- 一、Psotman
- 二、Apache Bench(AB)
- 三、JMeter
- 四、代碼
一、Psotman:Http請求模擬工具
嚴格來說postMan并不是并發(fā)請求,而是串行執(zhí)行的,現(xiàn)在用postMan更多的是用來測試Http連接的一個工具,但是也是一個很實用的工具,也有一些比較強大的功能和優(yōu)點

目前創(chuàng)新互聯(lián)建站已為超過千家的企業(yè)提供了網(wǎng)站建設、域名、虛擬空間、網(wǎng)站托管、服務器托管、企業(yè)網(wǎng)站設計、柳林網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
1.1 下載地址
- 1) Postman for MAC:https://app.getpostman.com/app/download/osx64?utm_source=site&utm_medium=apps&utm_campaign=macapp&_ga=2.21151352.2119858274.1527039878-1088353859.1527039878
- 2) Postman for windows X64:https://app.getpostman.com/app/download/win64?_ga=2.201562513.1250696341.1530543681-1582181135.1530543681
- 3) Postman for windows X86:https://app.getpostman.com/app/download/win32?_ga=2.21151352.2119858274.1527039878-1088353859.1527039878
- 4) Postman for linux X64:https://app.getpostman.com/app/download/linux64?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878
- 5) Postman for Linux X86:https://app.getpostman.com/app/download/linux32?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878
- 6) 官網(wǎng)地址:https://www.getpostman.com/
1.2 操作說明(以win64為例)
1、打開Postman,輸入我們需要測試的網(wǎng)址,點擊左邊的"+",保存請求
2、點擊"+"后,彈出下面提示,保存鏈接地址生成測試文件夾名稱
3、保存成功后,選擇"collections"后選擇文件夾名為"gbfTest"的,點擊小三角——點擊Run
4、這里我們可以設置請求次數(shù)和間隔時間,一般間隔時間會設置為0,設置好之后,我們點擊Run gbfTest運行
5、查看結(jié)果,從圖中我們可以看到百度的響應速度還是很快的
6、點擊 Run Summary 可以看到運行結(jié)果概述
7、測試全部通過
8、測試結(jié)果可以通過點擊Export Results按鈕進行導出,方便分析每次的請求時間
二、Apace Bench(AB):Apache附帶的工具,測試網(wǎng)站性能
2.1 簡介
Apache Bench 是 Apache 服務器自帶的一個web壓力測試工具,簡稱ab。ab又是一個命令行工具,對發(fā)起負載的本機要求很低,根據(jù)ab命令可以創(chuàng)建很多的并發(fā)訪問線程,模擬多個訪問者同時對某一URL地址進行訪問,因此可以用來測試目標服務器的負載壓力??偟膩碚fab工具小巧簡單,它不僅可以對apache服務器進行網(wǎng)站訪問壓力測試,也可以對或其它類型的服務器進行壓力測試。比如nginx、tomcat、IIS等,上手學習較快,可以提供需要的基本性能指標,但是沒有圖形化結(jié)果,不能監(jiān)控
2.2 原理
ab命令會創(chuàng)建多個并發(fā)訪問線程,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基于URL的,因此,它既可以用來測試apache的負載壓力,也可以測試nginx、lighthttp、tomcat、IIS等其它Web服務器的壓力
2.3 Apache Bench安裝
Apache服務器,下載地址:https://www.apachelounge.com/download/
選擇:httpd-2.4.41-win64-VS16 下載目錄結(jié)構(gòu):
2.4 Apache Bench 使用
運行環(huán)境:Windows7 Apache Bench版本:httpd-2.4.41-win64-VS16
1、進入cmd目錄下,進入我們解壓好的Apache Bench目錄下
3 使用命令
- ab -c 10 -n 10 http://www.baidu.com/ 或者 ab.exe -n 1000 -c 500 http://www.baidu.com
對百度首頁進行一個請求總數(shù)為1000,本次請求并發(fā)數(shù)為500的測試
參數(shù)分析:
- C:\Users\Lenovo\Downloads\httpd-2.4.41-win64-VS16\Apache24\bin>ab.exe -n 1000 -c
- 500 http://www.baidu.com/path
- This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
- Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
- Licensed to The Apache Software Foundation, http://www.apache.org/
- Benchmarking www.baidu.com (be patient)
- Completed 100 requests
- Completed 200 requests
- Completed 300 requests
- Completed 400 requests
- Completed 500 requests
- Completed 600 requests
- Completed 700 requests
- Completed 800 requests
- Completed 900 requests
- Completed 1000 requests
- Finished 1000 requests
- Server Software: Apache #測試服務器的名字
- Server Hostname: www.baidu.com #請求的URL主機名
- Server Port: 80 #請求端口
- Document Path: /path #請求路徑
- Document Length: 222 bytes #頁面大小
- Concurrency Level: 500 #并發(fā)量,設置的參數(shù)之一
- Time taken for tests: 45.805 seconds #整個測試所用的時間/秒
- Complete requests: 1000 #完成的請求數(shù)
- Failed requests: 0 #失敗的請求數(shù)
- Non-2xx responses: 1000 #接收到的HTTP響應數(shù)據(jù)的頭信息中含有2XX以外的狀態(tài)碼,則會在測試結(jié)果中顯示另一個名為“Non-2xx responses”的統(tǒng)計項,用于統(tǒng)計這部分請求數(shù)(1000)
- Total transferred: 484000 bytes #表示所有請求的響應數(shù)據(jù)長度總和
- HTML transferred: 222000 bytes #表示所有請求的響應數(shù)據(jù)中正文數(shù)據(jù)的總和
- Requests per second: 21.83 [#/sec] (mean) #吞吐率,吞吐率是與并發(fā)數(shù)相關(guān)的,使請求總數(shù)相同,但如果并發(fā)數(shù)不一樣,吞吐率還是很可能有很大差異的
- Time per request: 22902.310 [ms] (mean) #用戶平均請求等待時間。也就是一次并發(fā)總的時間
- Time per request: 45.805 [ms] (mean, across all concurrent requests) #服務器平均請求等待時間。也就是一次請求(在本例中也就是500中的平均每一次)所需時間
- Transfer rate: 10.32 [Kbytes/sec] received #這些請求在單位時間內(nèi)從服務器獲取的數(shù)據(jù)長度
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 9 46 460.5 11 9060
- Processing: 25 20066 13796.4 14798 36549
- Waiting: 14 16163 15029.9 8460 36484
- Total: 37 20111 13785.1 22804 36562
- Percentage of the requests served within a certain time (ms)
- 50% 22804 #50%用戶請求在22804ms內(nèi)返回
- 66% 33043 #66%用戶請求在33043ms內(nèi)返回
- 75% 34181
- 80% 34791
- 90% 35877
- 95% 36416
- 98% 36502 #98%用戶請求在36502ms內(nèi)返回
- 99% 36512
- 100% 36562 (longest request)
命令參數(shù)參考:
- -n requests Number of requests to perform //本次測試發(fā)起的總請求數(shù)
- -c concurrency Number of multiple requests to make //一次產(chǎn)生的請求數(shù)(或并發(fā)數(shù))
- -t timelimit Seconds to max. wait for responses //測試所進行的最大秒數(shù),默認沒有時間限制。
- -r Don't exit on socket receive errors. // 拋出異常繼續(xù)執(zhí)行測試任務
- -p postfile File containing data to POST //包含了需要POST的數(shù)據(jù)的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt
- -T content-type Content-type header for POSTing
- //POST數(shù)據(jù)所使用的Content-type頭信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p)
- -v verbosity How much troubleshooting info to print
- //設置顯示信息的詳細程度 – 4或更大值會顯示頭信息, 3或更大值可以顯示響應代碼(404, 200等), 2或更大值可以顯示警告和其他信息。 -V 顯示版本號并退出。
- -C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3” (repeatable)
- //-C cookie-name=value 對請求附加一個Cookie:行。 其典型形式是name=value的一個參數(shù)對。此參數(shù)可以重復,用逗號分割。
- 提示:可以借助session實現(xiàn)原理傳遞 JSESSIONID參數(shù), 實現(xiàn)保持會話的功能,如-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。
- -w Print out results in HTML tables //以HTML表的格式輸出結(jié)果。默認時,它是白色背景的兩列寬度的一張表。
2.5 使用注意
1、MAC中自帶了Apache。
2、在使用ab命令時,并發(fā)了過高會出現(xiàn)錯誤:Too many open files,由于系統(tǒng)打開文件數(shù)量限制了具有輕量化特點的bench還是很適合中小企業(yè)使用,尤其在于模擬訪問頁面的多機測試
三、JMeter:Apache組織開發(fā)的壓力測試工具(使用比較多的工具)
3.1 簡介
Apache JMeter是一款純java編寫負載功能測試和性能測試開源工具軟件。相比Loadrunner而言,JMeter小巧輕便且免費,逐漸成為了主流的性能測試工具,是每個測試人員都必須要掌握的工具之一
JDK版本:1.8 運行環(huán)境:Windows 7 64 JMeter版本:3.3
注意:安裝JMeter需要 Java8和8以上的JDK版本
3.2 JDK安裝(如果已經(jīng)安裝JDK 1.8 忽略這一步)
1、jdk官網(wǎng)下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、選擇 Java SE 8u231,點擊JDK下載
安裝下載的JDK
配置系統(tǒng)環(huán)境變量 具體可以自行查找資料,這里就不做過多描述
3.2 JMeter安裝
1、官網(wǎng)下載地址:JMeter地址:http://jmeter.apache.org/download_jmeter.cgi
2、下載最新JMeter 5.1.1 版本:Apache JMeter 5.1.1 (Requires Java 8+)
3、下載完成后解壓zip包,雙擊bin目錄下jmeter.bat文件
3.3 JMeter 使用
1、雙擊bin目錄下jmeter.bat文件后,打開Apache JMeter工具
2、案例測試(Test Plan - > Add - > Thread(User) - > Thread Group)
3、設置名稱和線程數(shù)
線程參數(shù)解讀:Number of Threads (users):虛擬用戶數(shù)(也就是線程數(shù)),一個虛擬用戶占用一個進程或線程Ramp-Up Period(in seconds):準備時長,設置的虛擬用戶數(shù)需要多長時間全部啟動。
Loop Count:循環(huán)次數(shù)每個線程發(fā)送請求的次數(shù)
如果線程數(shù)為20,循環(huán)次數(shù)為100,那么每個線程發(fā)送100次請求??傉埱髷?shù)為20*100=2000 。
如果勾選了“Forever”,那么所有線程會一直發(fā)送請求,一到選擇停止運行腳本。
Delay Thread creation until needed:直到需要時延遲線程的創(chuàng)建
Scheduler:調(diào)度器,設置線程組啟動的開始時間和結(jié)束時間(配置調(diào)度器時,需要勾選循環(huán)次數(shù)為永遠)
Duration(Seconds):持續(xù)時間(秒),測試持續(xù)時間,會覆蓋結(jié)束時間
Startup delay(Seconds):啟動延遲(秒),測試延遲啟動時間,會覆蓋啟動時間
4、添加Http請求
右鍵點擊,Htto請求 > Add > Sampler > Http Request
接下來我們對接口 https://www.baidu.com/s?ie=UTF-8&wd=edg進行性能測試,如下圖所示:
請求參數(shù)詳解:
- Web Server(Http服務): 1、Protocol[http]:協(xié)議,向目標服務器發(fā)送HTTP請求協(xié)議,可以是HTTP或HTTPS,默認為HTTP 2、服務器名稱或IP:HTTP請求發(fā)送的目標服務器名稱(域名)或IP 3、Port Number:端口號
- Http Reuqeset(Http請求體): 1、Method:請求方法類型,有GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等 2、path:目標URL路徑,除去服務器地址、端口和請求參數(shù)后所得到的數(shù)據(jù) 3、Content encoding:編碼方式,設置為 UTF-8
- 請求參數(shù): 設置請求參數(shù),都在下面的列表中進行設置,
- 列表參數(shù)解讀:Name:請求參數(shù)名 Value:請求值 URL Encode:是否Url編碼 Conten-Type:內(nèi)容類型,有需要自行調(diào)整(一般選擇默認即可) include Equals:是否包含等于
注意:參數(shù)傳入中文時需要勾選“URL Encode”
這里的按鈕都是針對列表中的數(shù)據(jù)進行操作的
- Detail
- :查看參數(shù)詳情
- Add
- :添加一行列表請求參數(shù)
- Delte
- :刪除一行數(shù)據(jù)
- Up
- :設置列表參數(shù)上移
- Down
- :設置列表參數(shù)下移
- add from
- Clipdoard
- :從我們復制的內(nèi)容中進行添加
5、添加察看結(jié)果樹
1、右鍵點擊 Http請求 > Add > Listener > View Results Tree
2、這里我們設置響應數(shù)據(jù)格式:HTMLSourceFormatted,點擊運行我們就可以看到請求結(jié)果
3、本次搜索返回結(jié)果頁面標題為 edg_百度搜索
6、添加用戶自定義變量
1、添加用戶自定義變量用以Http請求參數(shù)化:Http請求 > Add > Config Element > User Defined Variables
2、新增請求參數(shù),存放搜索關(guān)鍵字
3、在 Http測試請求 中使用該參數(shù),格式為:${wd} ,如下圖所示
7、添加響應斷言
右鍵點擊 Http測試請求(注意是Http測試請求) > Add > Assertions > Response Assertion
校驗返回的文本中是否包含搜索詞,添加參數(shù)${wd}到要測試的模式中
- Contains
- :包括
- Matches
- :匹配
- Equals
- :相等
- SubString
- :原諒博主才疏學淺,這個就不做解釋了
- Not
- :否
- or
- :或者
7、添加響應斷言結(jié)果
右鍵點擊 Http測試請求 > Add > Listener > Assertion Results
點擊運行,查詢運行結(jié)果
8、添加聚合報告
右鍵點擊 Http請求 > Add > Listener > Aggregate Report
到這里我們就完成了一個完整的Http接口的性能測試編寫,接下來我們會對它的性能進行測試
3.4 JMeter 性能測試
1、配置Http請求(線程組)信息
點擊Http請求(線程組),配置相關(guān)的性能測試相關(guān)參數(shù)線程數(shù):50 循環(huán)次數(shù):永遠持續(xù)時間:60秒
2、執(zhí)行測試信息
選擇聚合報告,查詢結(jié)構(gòu),點擊 箭頭 按鈕啟動測試,如果要清楚具體內(nèi)容,點擊小掃把,清除調(diào)試結(jié)果
3、測試結(jié)果分析解讀
1、打開聚合報告
參數(shù)詳解:
- Label:每個 JMeter 的 element都有一個 Name 屬性,這里顯示的是 Name 屬性的值
- #Samples:請求數(shù)——表示這次測試中一共發(fā)出了多少個請求 如果模擬10個用戶,每個用戶迭代10次,那么這里顯示100
- Average:平均響應時間——默認情況下是單個 Request 的平均響應時間 當使用了 Transaction Controller 時,以Transaction 為單位顯示平均響應時間
- Median:中位數(shù),也就是 50% 用戶的響應時間
- 90% Line:90% 用戶的響應時間
- 99% Line:99% 用戶的響應時間
- Min:最小響應時間
- Max:最大響應時間
- Error%:錯誤率——錯誤請求數(shù)/請求總數(shù)
- Throughput:吞吐量——默認情況下表示每秒完成的請求數(shù)(Request per Second) 當使用了TransactionController時,也可以表示類似LoadRunner的TransactionperSecond數(shù)
- KB/Sec:每秒從服務器端接收到的數(shù)據(jù)量在實際中我們需要關(guān)注的點只有—— #Samples 請求數(shù),Average 平均響應時間,Min 最小響應時間,Max 最大響應時間,Error% 錯誤率和Throughput 吞吐量
四、代碼模擬
1、Semaphore
Semaphore是計數(shù)信號量。Semaphore管理一系列許可證。每個acquire方法阻塞,直到有一個許可證可以獲得然后拿走一個許可證;每個release方法增加一個許可證,這可能會釋放一個阻塞的acquire方法。然而,其實并沒有實際的許可證這個對象,Semaphore只是維持了一個可獲得許可證的數(shù)量。
1.1 代碼演示:獲取一個許可證
- import lombok.extern.slf4j.Slf4j;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Semaphore;
- @Slf4j
- public class SemaphoreExample1 {
- private final static int threadCount = 20;
- public static void main(String[] args) throws Exception {
- ExecutorService exec = Executors.newCachedThreadPool();
- final Semaphore semaphore = new Semaphore(3);
- for (int i = 0; i < threadCount; i++) {
- final int threadNum = i;
- exec.execute(() -> {
- try {
- semaphore.acquire(); // 獲取一個許可
- test(threadNum);
- semaphore.release(); // 釋放一個許可
- } catch (Exception e) {
- log.error("exception", e);
- }
- });
- }
- exec.shutdown();
- }
- private static void test(int threadNum) throws Exception {
- log.info("{}", threadNum);
- Thread.sleep(1000);
- }
- }
執(zhí)行結(jié)果:如下圖所示,我們看到雖然結(jié)果是無序的,但是請求的線程數(shù)量是正確的,這里展示的是獲取一個許可,同時也釋放一個許可,我們可不可以獲取多個許可,釋放多個許可呢,答案是可以的
1.2 代碼演示:獲取多個許可證
- package com.mmall.concurrency.example.aqs;
- import lombok.extern.slf4j.Slf4j;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Semaphore;
- @Slf4j
- public class SemaphoreExample {
- private final static int threadCount = 20;
- public static void main(String[] args) throws Exception {
- ExecutorService exec = Executors.newCachedThreadPool();
- final Semaphore semaphore = new Semaphore(3);
- for (int i = 0; i < threadCount; i++) {
- final int threadNum = i;
- exec.execute(() -> {
- try {
- semaphore.acquire(3); // 獲取多個許可
- test(threadNum);
- semaphore.release(3); // 釋放多個許可
- } catch (Exception e) {
- log.error("exception", e);
- }
- });
- }
- exec.shutdown();
- }
- private static void test(int threadNum) throws Exception {
- log.info("{}", threadNum);
- Thread.sleep(1000);
- }
- }
執(zhí)行結(jié)果:這里我們看到我們設置了獲取多個許可同時也釋放多個許可,放回的線程數(shù)是正確的,同時執(zhí)行結(jié)果也是有序的
2、CountDownLatch
CountDownLatch是一個同步工具類,用來協(xié)調(diào)多個線程之間的同步,或者說起到線程之間的通信(而不是用作互斥的作用)。CountDownLatch能夠使一個線程在等待另外一些線程完成各自工作之后,再繼續(xù)執(zhí)行。使用一個計數(shù)器進行實現(xiàn)。計數(shù)器初始值為線程的數(shù)量。當每一個線程完成自己任務后,計數(shù)器的值就會減一。當計數(shù)器的值為0時,表示所有的線程都已經(jīng)完成了任務,然后在CountDownLatch上等待的線程就可以恢復執(zhí)行任務的
2.1 代碼演示:
- import lombok.extern.slf4j.Slf4j;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- @Slf4j
- public class CountDownLatchExample1 {
- private final static int threadCount = 200;
- public static void main(String[] args) throws Exception {
- int num = 0;
- ExecutorService exec = Executors.newCachedThreadPool();
- final CountDownLatch countDownLatch = new CountDownLatch(threadCount);
- for (int i = 0; i < threadCount; i++) {
- final int threadNum = i;
- num++;
- exec.execute(() -> {
- try {
- test(threadNum);
- } catch (Exception e) {
- log.error("exception", e);
- } finally {
- countDownLatch.countDown();
- }
- });
- }
- countDownLatch.await();
- log.info("finish——"+num);
- exec.shutdown();
- }
- private static void test(int threadNum) throws Exception {
- Thread.sleep(100);
- log.info("{}", threadNum);
- Thread.sleep(100);
- }
- }
通過返回結(jié)果我們可以看到,設置的線程數(shù)量返回結(jié)果數(shù)量和我們設置的線程數(shù)量200一致
五、總結(jié)
- postMan:非專業(yè)的并發(fā)測試,嚴格來說postMan并不是并發(fā)請求,而是串行執(zhí)行的,postMan更多的是用來測試Http連接的一個工具,是一個很實用的工具
- Apache Bench:Apache Bench是 Apache 服務器自帶的一個web壓力測試工具,簡稱ab,ab工具小巧簡單,上手學習較快,可以提供需要的基本性能指標,但是沒有圖形化結(jié)果,不能監(jiān)控
- JMeter:Apache JMeter 是Apache 組織開發(fā)的基于java的壓力測試工具。用于對軟件做壓力測試的工具,它可以用于測試靜態(tài)和動態(tài)資源例如靜態(tài)文件、Java 小服務程序、CGI 腳本、Java 對象、 數(shù)據(jù)庫, FTP 服務器等等
總的來說,并發(fā)測試中,JMeter和Apache Bench是比較好的選擇,由于Apache Bench是基于命令行的,ab處理速度更快,而Jmeter更準確,由于Jmeter本身支持斷言、可變參數(shù)和CSV數(shù)據(jù)集的輸入,能設定更加靈活多變的的測試場景,至于postMan這款工具,用來最多的是用來模擬Http請求的一個,并不是一個專業(yè)的并發(fā)請求工具。
網(wǎng)站名稱:測試妹子問我會壓測嗎?我笑了笑并給她看了這篇文章
網(wǎng)站網(wǎng)址:http://m.fisionsoft.com.cn/article/ccojdsc.html


咨詢
建站咨詢
