最近在鼓搗Jmeter的接口測試,把他集成到了Jenkins上做自動化接口監聽。把操作記錄下來。
- 首先就是進行接口測試的編寫。打開Jmeter。主要是把接口的測試邏輯和斷言處理調通后就OK了,接口程序的IP和端口做成參數化。隨時可以根據測試環境和開發環境以及生產環境間進行切換。請求參數里根據測試用例來設置接口所需的參數值



接口的后置BeanShell Assertion斷言處理器
1 import java.util.regex.*; 2 3 //斷言列表 4 String[] assertList =new String[]{("\"list\""+":\\[(\\{.*?\\})+?\\]"),"\"ID\":\"pl_findGroup\"","\"action\":\"post\"","\"teacherId\":\"tea_951_20368\"","\"serviceId\":\"pl_findGroup\"","\"status\":\"1\""}; 5 // 要驗證的字符串 6 String response = prev.getResponseDataAsString(); 7 // 編譯正則表達式 8 Pattern pattern = Pattern.compile(assertList[0]); 9 // 忽略大小寫的寫法 10 // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); 11 Matcher matcher = pattern.matcher(response); 12 // 查找字符串中是否有匹配正則表達式的字符/字符串 13 boolean rs = matcher.find(); 14 if(!rs){ 15 FailureMessage = "斷言失敗:"+assertList[0]; 16 Failure = true; 17 prev.setResponseCode("500"); 18 log.info("Fail======================================"); 19 }else{ 20 //循環斷言 21 for(int i =1;i<assertList.length;i++){ 22 if(!response.contains(assertList[i])){ 23 FailureMessage = "斷言失敗:"+assertList[i]; 24 Failure = true; 25 prev.setResponseCode("500"); 26 log.info("Fail======================================"); 27 return; 28 } 29 } 30 }
這邊斷言使用的是后置處理器的bean shell,當然斷言也可以連接數據庫進行數據diff,如果有必要的話。
- 最終接口調試完成后Jmeter會生成一個.jmx的測試腳本。下一步就是通過Ant的build.xml文件來調用Jmeter測試腳本和生成測試報告。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project name="JmeterTest" default="all" basedir="."> 3 <tstamp> 4 <format property="time" pattern="yyyy/MM/dd HH:mm" /> 5 </tstamp> 6 7 <!--Jmeter主目錄--> 8 <property name="jmeter.home" value="D:/ProgramFiles/apache-jmeter-3.1" /> 9 10 11 <!--存放Jmeter生成的報告文件的文件夾--> 12 <property name="jmeter.result.dir" value="D:/ProgramFiles/jenkinsworkspace/workspace/Jmeter/results" /> 13 14 <!--Jmeter文件名--> 15 <property name="ReportName" value="TestReport" /> 16 17 <!--jtl文件--> 18 <property name="jmeter.result.jtlName" value="${jmeter.result.dir}/${ReportName}.jtl" /> 19 <!--html報告文件--> 20 <property name="jmeter.result.htmlName" value="${jmeter.result.dir}/${ReportName}.html" /> 21 22 23 <!--匯總標簽--> 24 <target name="all"> 25 <antcall target="clean" /> 26 <antcall target="test" /> 27 <antcall target="report" /> 28 </target> 29 30 <!--每次清除Jmeter生成的結果目錄--> 31 <target name="clean"> 32 <delete includeemptydirs="true"> 33 <fileset dir="${jmeter.result.dir}" includes="**/*"/> 34 </delete> 35 </target> 36 37 38 <!--運行Jmeter腳本文件--> 39 <target name="test"> 40 <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" /> 41 <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}"> 42 <testplans dir="D:/jmeter/script" includes="*.jmx" /> 43 <property name="jmeter.save.saveservice.output_format" value="xml"/> 44 </jmeter> 45 </target> 46 47 <path id="xslt.classpath"> 48 <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/> 49 <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/> 50 </path> 51 52 <!--生成測試報告--> 53 <target name="report"> 54 <xslt classpathref="xslt.classpath" force="true" in="${jmeter.result.jtlName}" out="${jmeter.result.htmlName}" style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" > 55 <param name="dateReport" expression="${time}"/> 56 </xslt> 57 <!--復制報告所需圖標--> 58 <copy todir="${jmeter.result.dir}"> 59 <fileset dir="${jmeter.home}/extras"> 60 <include name="collapse.png" /> 61 <include name="expand.png" /> 62 </fileset> 63 </copy> 64 </target> 65 66 </project>
- 代碼中
是每次執行為build.xml后生成的測試報告html文件里會出現重復的數據。所以要在生成報告之前清楚一下以前的文件 - 把上面的build.xml文件放到某個文件夾下后,就可以開始配置Jenkins了。在Jenkins新建一個自由風格的項目,設置保存構建次數最大個數,因為是接口巡檢,比較頻繁,這樣可以減少磁盤壓力。

- 設置構建觸發器,這里沒30分鍾自動構建一次

- 構建步驟,使用Ant進行構建。使用Ant的前提必須先下載ant后解壓至磁盤,添加環境變量,在Jenkins的系統設置里設置Ant等步驟略過。

- 點擊后設置運行build.xml文件的路徑

- 下一步構建后操作添加Publish HTML reports插件,該插件用來展示Jmeter生成的測試報告結果的html文件

- 設置Publish HTML reports的html文件展示路徑以及文件名稱等設置

- 項目構建后,我們想要如果測試接口有錯誤的話(不管是斷言邏輯錯誤還是服務器錯誤因素),就讓他自動發送預警郵件,郵件里包含了所有的接口測試詳情,錯誤信息。這個時候就用到了Editable Email Notification郵件擴展插件。但是現在有這樣一種情況,在項目構建的過程中,不管jmx腳本文件中的接口是邏輯錯誤或者是服務器等其他因素造成的接口報錯,郵件插件是根據Jenkins的構建錯誤后,才會發送定義好的報告。而Jmeter的腳本里的接口不管如何的報錯,是都不會引起Jenkins構建錯誤的。也就是說項目構建除了特殊因素之外會一直構建成功,那么也就達不到我們想要的只在接口巡檢發生錯誤的情況下才發送預警郵件的需求。
- 這個時候我們就要借助一些外在的因素,人為的讓Jenkins在構建項目后,出現構建失敗的情況。
- 重新建立一個新的自由風格的項目,該項目的構建觸發器選擇為依賴其他項目構建完成后才開始構建

- 下一步設置構建方式,選擇用windows命令進行構建。

- 邏輯就是在Jmeter項目構建后,會在某個目錄下生成TestReport.html報告。我們通過windows命令findstr搜索html報告里面的特殊關鍵字,比如報告里面就有100.00%的成功率關鍵字,如果沒有出現這個關鍵字,就證明被測接口有錯誤的,我們就讓該項目構建失敗。如果找到了,就略過。

- 配置完命令后,在添加Editable Email Notification郵件擴展插件,來進行自定義郵件內容格式設置

- 在設置該插件之前必須先把Jenkins的系統設置里的基礎郵件配置完成。下圖擴展郵件設置。設置郵件內容類型Content Type為HTML格式的。在Default Content里面,可以把測試報告嵌入到郵件里。

- 完成之后回到Jenkins首頁,點擊Jmeter項目的構建,構建成功后,會自動再次構建依賴項目,該項目構建會根據縮寫doc命令來查找生成的測試報告里有沒有發送郵件的關鍵字。

- 如果報告里的接口出現錯誤的話,最終會根據郵件擴展插件的配置發送預警郵件

至於郵件里的html文件內容中文亂碼問題,現在還沒有找到好的解決辦法。。。。
