Jmeter+Jenkins實現(xiàn)接口自動化的持續(xù)集成

Jmeter+Jenkins實現(xiàn)接口自動化的持續(xù)集成

1、前置準備工具(安裝步驟省略)

  • Jmeter

  • Tomcat+Jenkins

  • Python

2、Jmeter錄制腳本

  • 第一步:新建測試計劃--線程組--HTTP代理服務器

    • 目標控制器可以修改為線程組,分組可以設置為每個組放入一個新的控制器中,這樣錄制的腳本根據(jù)操作停頓的時間按組分配進入線程組中,線程組中的組名可以自己修改,比如:商品模塊

    • 端口號設置8888,如果沖突的話可以任意修改

    • Requests Filtering存在包含模式和排除模式

      • 包含模式:使用正則過濾要抓包的域名(正則表達式可以百度在線正則表達式),如我要抓取任何和baidu.com有關的請求

      • 排除模式:前一步包含模式是過濾要抓的包,排除模式是在前面的基礎上去掉包含bmp|css|js|gif|ico|jpe?g|png|swf|woff|woff2|htm|html|gif的包,避免錄制到了頁面請求的js、gif等請求

  • 第二步:打開電腦IE瀏覽器,點擊右上角設置--Internet選項--連接--局域網(wǎng)設置--代理服務器,勾選代理服務器,且進入高級設置中設置地址為127.0.0.1,端口號為Jmeter中的端口號,一致即可,建議8888,這樣避免后續(xù)多次修改


    image

    image

  • 第三步:啟動Jmeter

  • 第四步:安裝證書給瀏覽器,打開瀏覽器--設置--管理證書--受信任的根證書頒發(fā)機構--導入,導入剛剛jmeter/bin中的ApacheJMeterTemporaryRootCA.crt即可,有效期7天,如7天后還要錄制,該證書需要更換一次。教程已Google瀏覽器為例,上圖啟動Jmeter后,證書自動生成在Jmeter中的bin路徑下(ApacheJMeterTemporaryRootCA.crt),附圖:


    image

  • 第五步:操作頁面,可以根據(jù)功能操作,一個模塊多個接口放入線程組中的一個組內,至此錄制已完成,如圖:

3、設置全局斷言和單個接口斷言

  • 響應斷言:線程組--右鍵新建斷言--新建響應斷言,設置main sample only,勾選響應頭和忽略狀態(tài),模式匹配規(guī)則用包括即可,測試模式輸入框輸入200,該斷言是斷言錄制的所有請求的HTTP響應碼都為200,保障接口正常,但無法保障數(shù)據(jù)正常。遇到接口返回參數(shù)無規(guī)則(有時候list[0].type為1,有時候list[0].type為3,JSON提取器無法準確提取到值)的時候也可以使用該方法斷言返回參數(shù)中的字符串,詳情看圖:


    image

  • JSON斷言:線程組--xx組--xx接口--右鍵新建斷言--新建JSON斷言,因為每個接口返回的數(shù)據(jù)類型不一致,不好用全局斷言,所以可以嘗試單個接口斷言,如A接口返回數(shù)據(jù)code:0,B接口返回數(shù)據(jù)code:1,表達式表達方法用代替接口返回的整個數(shù)據(jù),然后使用JSON提取方法去JSON中的key,比如接口返回{"code":1,"total":2,"score":[100,90,80]},提取total的表達式就是.total,提取score的100分的時候就是$.score[0],如圖:

4、設置測試報告

  • 察看結果樹:線程組--右鍵新建監(jiān)聽器--新建察看結果樹,該監(jiān)聽器功能便于查看請求參數(shù)、返回參數(shù)及斷言結果,利于debug。也可以設置單個接口或者單個組,建議設置全局,即線程組--察看結果樹,可以勾選僅錯誤日志,這樣只有斷言不通過的才會出現(xiàn)在這,斷言通過的會被過濾掉,文件名中可以輸出三種報告,其中jtl(轉html報告用),csv(python提取數(shù)據(jù),進行過濾用),xml(不太好看),推薦jtl,這樣便于集成jenkins,如圖:

  • 用表格察看數(shù)據(jù):該功能可以查看接口發(fā)出時間等,可以更直觀的查看接口并發(fā)的情況

  • 聚合報告:可以用來查看接口并發(fā)的時間,耗時等,接口并發(fā)用較好

  • 匯總報告:接口并發(fā)用較好,做自動化的話可以不用加這個

5、HTTP信息頭管理器

  • 全局信息頭管理器:可以在線程組中直接添加一個信息頭管理器,后續(xù)所有接口都會拿到該信息頭,需要加上,若后續(xù)接口需要獲取登錄接口的token的話,可以在信息頭管理器中調用變量,這個變量用JSON提取器或者正則表達式提取器從登錄接口獲?。ㄒ话銇碚f),引用名稱就是后面調用的變量,比如名稱叫auth_token,后面信息頭管理器中調用的話就是${auth_token},所有的接口,存在關聯(lián)參數(shù)的話都可以通過JSON提取器和正則表達式提取器獲取

  • 局部信息頭管理器:錄制腳本的時候不要勾選,不然會在每一個接口中生成一個HTTP信息頭管理器,這樣會增加內存消耗,建議統(tǒng)一使用線程組中的HTTP信息頭管理器

6、CSV數(shù)據(jù)文件設置

  • 域名、賬號、密碼等動態(tài)數(shù)據(jù)(換個人使用或者換個環(huán)境運行的話就要替換域名),可以線程組--右鍵新建配置元件--csv data set config,文件名即存放txt的路徑,編碼使用utf-8,變量名稱自己任意取,后面根據(jù)取的變量調用,多個變量之間使用英文逗號隔開,分隔符使用英文逗號,后面的默認選項即可,需要幾個自己控制,比如域名只需要傳遞www.baidu.com,前綴的https在接口處已經(jīng)存在,所以不用傳遞,變量調用方法還是${變量名},如圖:

7、性能測試

  • 線程組中修改線程數(shù)、ramp-up(時間)、循環(huán)次數(shù),1個線程數(shù)即代表一個人或者一臺機器去執(zhí)行整個腳本,ramp-up時間就是并發(fā)時間,設置0時可以實現(xiàn)毫秒級并發(fā),設置1的話就是秒級別并發(fā),循環(huán)次數(shù)就是執(zhí)行幾次這個腳本,按需設置即可,接下來把這三個參數(shù)設置遍歷,便于后續(xù)集成,線程數(shù)設置{threadNum}調用變量,ramp-up設置{rampupTime},循環(huán)次數(shù)設置${loopNum},在指令運行的時候傳遞這三個值的參數(shù)即可,如Jmeter -JthreadNum=100 -JloopNum=1 -JrampupTime=0 -n -t xx.jmx -l xx.jtl -e -o report。至此Jmeter操作已全部結束,后續(xù)是關于Jenkins集成的步驟。

8、Jenkins

  • 搭建虛擬機、Linux,安裝Tomcat,部署Jenkins,步驟省略。因為Jmeter依賴jdk,所以Windows/Linux中還需要安裝JDK和Jmeter,以及環(huán)境變量,步驟省略。進入Jenkins插件管理中找到和安裝對應的插件(HTML report、dingtalk等),安裝完畢后進入配置中配置釘釘機器人的參數(shù),步驟省略,附圖:

  • 新建item,勾選機器人,設置運行空間,構建觸發(fā)器設置(定時、token、gitlab、github等),構建,以及構建后的報告,如圖:

9、Python篩選、過濾數(shù)據(jù)

  • 如遇到報告接口數(shù)據(jù)過多,可搭配CSV報告進行數(shù)據(jù)的提取,去重、拼接,以及推送釘釘,如圖:

  • 釘釘機器人代碼已經(jīng)封裝好了,比較簡單,可以直接導入和調用,也可以自己寫,代碼復制在下面:

    # -*- coding: utf-8 -*-
    # @Time: 2021/1/29 14:40
    # @Author: wangzhijing
    # @File: dingtalk_robot.py
    import base64
    import hashlib
    import hmac
    import time
    import json
    import requests
    import urllib
    import urllib.parse
    
    
    class DingTalkRobot:
        def __init__(self, secret, webhook):
            # 釘釘機器人秘鑰和webhook, 替換成自己的,可以點擊機器人設置查看(前提是自己機器人的安全設置選擇的加簽,非關鍵詞和ip地址)
        
            self.secret = secret
            self.webhook = webhook
            # signature,不用修改
            self.times = int(round(time.time() * 1000))
            secret_encode = str(self.secret).encode('utf-8')
            string_to_sign = '{}\n{}'.format(self.times, self.secret)
            string_to_sign_encode = str(string_to_sign).encode('utf-8')
            hmac_code = hmac.new(secret_encode, string_to_sign_encode, digestmod=hashlib.sha256).digest()
            self.sign = urllib.parse.quote(base64.b64encode(hmac_code))
            # 拿釘釘機器人唯一的webhook與時間戳、base64后的秘鑰進行拼湊
            self.url = self.webhook + '&timestamp=' + str(self.times) + '&sign=' + self.sign
    
        def push(self, content, isAtAll=False):
            # 推送文本樣式,內容填充在content中,isAtAll為true時@所有人,為false時會@atMobiles中的手機號碼,手機號碼需群員的真實號碼
            push_content = {
                "msgtype": "text",
                "text": {
                    "content": f"{content}\n"  # content是要推送的內容,如果要自定義推送的內容及樣式,可以查閱釘釘api官方文檔
                },
                "at": {
                    "atMobiles": [
                        "xxx",
                        "xxx",
                        "xxx"
                    ],
                    "isAtAll": isAtAll  # 是否@所有人,是的話True, False的話會@列表中的真實手機號碼(需在機主在群里才@到)
                }
            }
            response = requests.post(self.url, json=push_content)
            # print(json.dumps(response.json(), indent=4, ensure_ascii=False))
            print(str(time.strftime("%H:%M:%S")) + "推送成功")
    
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容