天天看點

jenkins+ant+jmeter自動化接口測試架構搭建

接口測試是測試中極為重要的環節,它所處的位置,有别于單元測試和功能測試,在單元測試之後,在功能測試之前。每個接口都能代表某種功能,功能就有輸入與輸出。檢驗輸入輸出、各參數的取值以及異常情況,對于單元測試來說,是一個補充,因為往往單元測試是以類、以方法來測試的。對于功能測試來說,是一個護盾,在經過接口測試的驗證後,能更高程度的保證功能點的正常執行。若能讓接口定時測試或項目部署後自動進行驗證(等同于回歸測試),顯得極為友善、快捷,能更多地節省出時間,進行其他工作的處理。

基于以上的目的,搭建一套自動化接口測試架構顯得尤為重要,在市面上測試接口的工具有很多,比如:LR、jmeter、SoapUI、Gatling、Postman等。打包建構的工具有Make、Ant、Maven等。CI持續內建的工具有Jenkins、Hudson等。這些工具各有千秋,隻要能實作最初的目的,不管使用什麼工具都是一個輔助作用而已。而我選擇的工具是Jenkins+Ant+Jmeter作為自動化接口測試架構的搭建。為啥使用這套架構是由于最早時Jenkins上并沒有maven插件,Jmeter設計打包建構測試的案例裡用的就是Ant,基于以上背景,是以使用這套工具有天然的成分在裡面。

下面開始搭建這套架構的講解。工欲善其事,必先利其器,在搭建之前,jenkins、ant、jmeter的linux版本包要準備好。Java版本:1.8.0_131;Ant版本:1.9.9;Jenkins:2.65,并且都已安裝至Linux伺服器上。環境變量設定如下:

jenkins+ant+jmeter自動化接口測試架構搭建

在windows上打開Jmeter,把腳本編輯完成,能成功執行并傳回結果。

jenkins+ant+jmeter自動化接口測試架構搭建

在windos安裝好Ant,新增其環境變量。

jenkins+ant+jmeter自動化接口測試架構搭建
jenkins+ant+jmeter自動化接口測試架構搭建

編輯Jmeter在這個目錄下D:\Program Files (x86)\apache-jmeter-2.13\apache-jmeter-2.13\extras的build.xml檔案。因為ANT打包建構就是依賴這個檔案做處理的,這檔案如何編輯如下:

----------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF8"?>

<!--

Licensed to the Apache Software Foundation (ASF) under one or more

contributor license agreements. See the NOTICE file distributed with

this work for additional information regarding copyright ownership.

The ASF licenses this file to You under the Apache License, Version 2.0

(the "License"); you may not use this file except in compliance with

the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

-->

<project name="ant-jmeter" default="all">

<description>



Sample build file for use with ant-jmeter.jar

See http://www.programmerplanet.org/pages/projects/jmeter-ant-task.php



To run a test and create the output report:

ant -Dtest=script



To run a test only:

ant -Dtest=script run



To run report on existing test output

ant -Dtest=script report



The "script" parameter is the name of the script without the .jmx suffix.



Additional options:

-Dshow-data=y - include response data in Failure Details

-Dtestpath=xyz - path to test file(s) (default basedir).

N.B. Ant interprets relative paths against the build file

-Djmeter.home=.. - path to JMeter home directory (defaults to parent of this build file)

-Dreport.title="My Report" - title for html report (default is 'Load Test Results')



Deprecated:

-Dformat=2.0 - use version 2.0 JTL files rather than 2.1



</description>

<!-- 定義變量并指派,能夠減少配置工作量,後面會調用到-->

<!-- 定義jmeter的工作目錄,與%JMETER_HOME%指向同一個目錄-->

<!-- ${basedir}目前目錄的意思,在此指向%JMETER_HOME%目錄-->

<property name="jmeter.home" value="D:\Program Files (x86)\apache-jmeter-2.13\apache-jmeter-2.13"/>

<!-- 除了用basedir我們還可以用basedir來指定目錄,這個指定的是%JMETER_HOME%-->

<!--property name="jmeter.home" value="${basedir}/.."/-->

<!--定義Jmeter的腳本存放目錄,指向%JMETER_HOME%/script目錄-->

<property name="script.dir" value="${jmeter.home}/script"/>

<!--定義Jmeter的測試結果存放目錄,指向%JMETER_HOME%/result目錄-->

<property name="jmeter.result" value="${jmeter.home}/result"/>

<!--定義測試報告的Title-->

<property name="report.title" value="Performance Test_Summary_Report"/>

<!--定義測試結果名稱-->

<!-- Name of test (without .jmx) -->

<property name="test" value="Test"/>

<!--測試報告中是否顯示失敗事務,n為不顯示-->

<!-- Should report include response data for failures? -->

<property name="show-data" value="n"/>

<!--定義樣式版本,有更新時隻需要修改此處即可,其他調用處不用更改-->

<property name="format" value="2.1"/>

<condition property="style_version" value="">

<equals arg1="${format}" arg2="2.0"/>

</condition>



<condition property="style_version" value="_21">

<equals arg1="${format}" arg2="2.1"/>

</condition>



<condition property="funcMode">

<equals arg1="${show-data}" arg2="y"/>

</condition>

<condition property="funcMode" value="false">

<not>

<equals arg1="${show-data}" arg2="y"/>

</not>

</condition>

<!--定義依賴包目錄-->

<!-- Allow jar to be picked up locally -->

<path id="jmeter.classpath">

<!--${basedir}指向目前目錄,此build.xml所在的目錄-->

<fileset dir="${basedir}">

<!--把ant-jmeter字元開頭的包.jar結尾的包都引入進來,在此*一般是版本資訊-->

<!--在此*一般是版本資訊,我們使用的Jmeter中是ant-jmeter-1.1.1.jar-->

<include name="ant-jmeter*.jar"/>

</fileset>

</path>

<taskdef

name="jmeter"

classpathref="jmeter.classpath" target="_blank" rel="external nofollow" 

classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/>

<!--定義任務,一個是run,即運作腳本,一個是report,即生成報告-->

<target name="all" depends="run,report"/>

<!--定義run任務-->

<target name="run">

<!--顯示上面定義的${show-data}取值-->

<echo>funcMode = ${funcMode}</echo>

<!--删除前一次的測試報告,Html格式的,上面有定義${test}變量的值-->

<delete file="${jmeter.result}/${test}.html"/>

<!--删除前一次的測試報告,jtl格式的,上面有定義${test}變量的值-->

<delete file="${jmeter.result}/${test}.jtl"/>

<!--加載運作時設定,設定配置在jmeter.properties檔案中-->

<!--是否允許遠端執行-->

<!--測試結果儲存目錄-->

<jmeter

jmeterhome="${jmeter.home}"

jmeterproperties="${jmeter.home}/bin/jmeter.properties"

runremote="false"

resultlog="${jmeter.home}/result/${test}.jtl" >

<!--指定測試腳本或者測試腳本所在的檔案目錄-->

<!--如果是單一腳本,直接指定腳本名稱,如果是執行多個腳本,指定腳本所在的目錄-->

<!--下面定義的是一個單腳本,名稱是csveg1.jmx-->

<testplans dir="${script.dir}" includes="csveg1.jmx"/>

<!--指定測試結果輸出格式,在此指定的是xml格式,也可以指定成文本格式及csv格式-->

<!--先暫且指定成xml格式,後續會變換成文本格式-->

<!--

<jvmarg value="-Xincgc"/>

<jvmarg value="-Xmx128m"/>

<jvmarg value="-Dproperty=value"/>

<jmeterarg value="-qextra.properties"/>

-->

<!-- Force suitable defaults -->

<property name="jmeter.save.saveservice.output_format" value="xml"/>

<property name="jmeter.save.saveservice.assertion_results" value="all"/>

<property name="jmeter.save.saveservice.bytes" value="true"/>

<property name="file_format.testlog" value="${format}"/>

<!--是否記錄錯誤資訊,上面已經定義了${funcMode}=n-->

<property name="jmeter.save.saveservice.response_data.on_error" value="${funcMode}"/>

</jmeter>

</target>

<!--定義依賴包目錄-->

<property name="lib.dir" value="${jmeter.home}/lib"/>



<!-- Use xalan copy from JMeter lib directory to ensure consistent processing with Java 1.4+ -->

<path id="xslt.classpath">

<fileset dir="${lib.dir}" includes="xalan*.jar"/>

<fileset dir="${lib.dir}" includes="serializer*.jar"/>

</path>

<target name="report" depends="xslt-report,copy-images">

<echo>Report generated at ${report.datestamp}</echo>

</target>

<!--_message_xalan被xslt-reporxslt依賴,由它生成報告-->

<!--xslt不在此展開講解-->

<target name="xslt-report" depends="_message_xalan">

<tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>

<xslt

classpathref="xslt.classpath" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" 

force="true"

in="${jmeter.home}/result/${test}.jtl"

out="${jmeter.home}/result/${test}.html"

style="${basedir}/jmeter.results.shanhe.me.xsl">

<param name="showData" expression="${show-data}"/>

<param name="titleReport" expression="${report.title}"/>

<param name="dateReport" expression="${report.datestamp}"/>

</xslt>

</target>

<!--生成Html報告時需要Copy圖示到報告目錄,expand.png展開圖示,collapse.png收起圖示-->

<!-- Copy report images if needed -->

<target name="copy-images" depends="verify-images" unless="samepath">

<copy file="${basedir}/expand.png" tofile="${jmeter.home}/result/expand.png"/>

<copy file="${basedir}/collapse.png" tofile="${jmeter.home}/result/collapse.png"/>

</target>

<!--判斷${jmeter.home}與${basedir}是否是指向同一目錄-->

<target name="verify-images">

<condition property="samepath">

<equals arg1="${jmeter.home}" arg2="${basedir}" />

</condition>

</target>

<!--檢查依賴-->

<condition property="xalan.present">

<and>

<available classpathref="xslt.classpath" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  classname="org.apache.xalan.processor.TransformerFactoryImpl"/>

<available classpathref="xslt.classpath" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  classname="org.apache.xml.serializer.ExtendedContentHandler"/>

</and>

</condition>



<target name="_message_xalan" unless="xalan.present">

<echo>Cannot find all xalan and/or serialiser jars</echo>

<echo>The XSLT formatting may not work correctly.</echo>

<echo>Check you have xalan and serializer jars in ${lib.dir}</echo>

</target>

<!--僅僅列印前面定義的變量的值,檢查是否如你所願,在定義變量時做調試用,可以去掉-->

<echo>basedir = ${basedir}</echo>

<echo>jmeter.home = ${jmeter.home}</echo>

<echo>${xslt.classpath}</echo>

</project>
           

---------------------------------------------------------------------------------------------------------------------------

在jmeter.properties上更改以下配置。

jenkins+ant+jmeter自動化接口測試架構搭建

并把以下的配置在jmeter.properties進行修改。

----------------------------------------------------------------------------------------------------------------------------

# true when field should be saved; false otherwise



# assertion_results_failure_message only affects CSV output

jmeter.save.saveservice.assertion_results_failure_message=true

#

# legitimate values: none, first, all

#jmeter.save.saveservice.assertion_results=none

#

jmeter.save.saveservice.data_type=true

jmeter.save.saveservice.label=true

jmeter.save.saveservice.response_code=true

# response_data is not currently supported for CSV output

jmeter.save.saveservice.response_data=true

# Save ResponseData for failed samples

jmeter.save.saveservice.response_data.on_error=true

jmeter.save.saveservice.response_message=true

jmeter.save.saveservice.successful=true

jmeter.save.saveservice.thread_name=true

jmeter.save.saveservice.time=true

jmeter.save.saveservice.subresults=true

jmeter.save.saveservice.assertions=true

jmeter.save.saveservice.latency=true

jmeter.save.saveservice.connect_time=true

jmeter.save.saveservice.samplerData=true

jmeter.save.saveservice.responseHeaders=true

jmeter.save.saveservice.requestHeaders=true

jmeter.save.saveservice.encoding=true

jmeter.save.saveservice.bytes=true

jmeter.save.saveservice.url=true

jmeter.save.saveservice.filename=true

jmeter.save.saveservice.hostname=true

jmeter.save.saveservice.thread_counts=true

jmeter.save.saveservice.sample_count=true

jmeter.save.saveservice.idle_time=true
           

----------------------------------------------------------------------------------------------------------------------------

再在user.properties上增加如下配置:

jenkins+ant+jmeter自動化接口測試架構搭建

編輯好後,在windos的cmd指令行,執行一次,如果顯示下列資訊表示已經成功。

jenkins+ant+jmeter自動化接口測試架構搭建
jenkins+ant+jmeter自動化接口測試架構搭建

完成以上的步驟後,就可以将這套配置,全移到Linux伺服器上去。

如何安裝Jenkins就不做過多表述,下面直接講解如何配置Jenkins的内容。

需要安裝Ant Plugin插件,HTML Publisher plugin插件,Performance Plugin插件。Ant Plugin插件顧名思義就能知道是用于ANT打包建構的,而HTML Publisher plugin插件是用于形成類似與jmeter檢視結果樹類型的報表的,Performance Plugin插件是用于顯示性能報表的。

安裝後,配置如下:

jenkins+ant+jmeter自動化接口測試架構搭建

項目名稱:填寫你項目的名字

丢棄舊的的建構:當建立新的建構後,丢棄舊的的建構,避免占空間。

保持建構的天數:可以根據自己要求填寫。

保持建構的最大個數:可以根據自己要求填寫。

jenkins+ant+jmeter自動化接口測試架構搭建

使用參數化建構過程的一個好處是可以在頁面根據參數選擇你要建構的腳本。比如:你有2個腳本,1個腳本用作充值功能的,而另1個腳本用作查詢功能的,這些功能你并沒有全都放在1個腳本上,而建構時,使用參數化的話,就能選擇哪個腳本進行執行。

jenkins+ant+jmeter自動化接口測試架構搭建

源碼管理:可以實作對腳本的管理,你可以選擇源碼管理工具Git或SVN對你的腳本進行管理,也可以将腳本放在Linux的jmeter目錄下進行分目錄管理,我在這選擇的是放在jmeter目錄下進行腳本管理。

是以選擇的None。

jenkins+ant+jmeter自動化接口測試架構搭建

建構觸發器選擇Build periodically,下面的日程表,大概5個參數如下:

jenkins+ant+jmeter自動化接口測試架構搭建

第一個是代表分鐘 H 表示随機

第二個是代表小時 9-15/4 9點到下午三點期間的每隔4個小時

第三個是代表天 * 任意一天

第四個是代表月份 1-11 表示1到11月份

第五個是代表星期 1-5 表示工作日

沒有用到 H 随機的話,不要加括号

H(9-18) 9點到18點 中随機的一個點

eg:

* * * * * 表示任何一個時間段,同一個時間都可能會觸發執行。不建議使用

H/30 * * * * 表示每天每隔 30分鐘建構一次

H 4-19/3 * * * 表示,一天的淩晨點到下午7點,每隔3個小時建構一次

* * 3-5 * * 表示,每個月的3号,4号,5号 都會被建構,具體時間未知

* * * * 1-5 表示,工作日時會建構,具體時間未知

H/30 8-19/3 1-28 1-11 1-5 表示 在1月到11月中的1号-28号,每個工作日,早晨的8點到下午7點每隔3.5個小時會觸發建構

jenkins+ant+jmeter自動化接口測試架構搭建

建構可以新增shell腳本,将這個目錄下的Test.html、Test.jtl給删除,因為下面進行ant建構時會生成相同的檔案,以免造成影響。

jenkins+ant+jmeter自動化接口測試架構搭建

執行ANT,Ant Version填寫你安裝的版本,Targets填寫all,這個是對應jmeter的build.xml檔案,all代表執行run、report,如果填寫的run,那就不會生成報表,因為report沒執行。

jenkins+ant+jmeter自動化接口測試架構搭建

用于存檔的檔案是指你建構了後,選擇那些檔案進行存檔到jenkins工作目錄去。

格式可以百度一下,如何寫。

jenkins+ant+jmeter自動化接口測試架構搭建

釋出HTML報告的目錄歸檔很重要,jenkins 會去你填寫目錄去找有沒有html頁面,如果有它會将其copy到jenkins的工作目錄上去,如果沒有就會在控制台報錯,生成不了HTML報告。

索引頁填寫生成的html檔案,報告标題可以按自己想法填寫。

jenkins+ant+jmeter自動化接口測試架構搭建

釋出性能測試結果報告的源資料檔案路徑一定要設定成生成jtl的目錄,jtl是jmeter生成報表的源資料,使用xslt進行轉換可以生成HTML報告,單獨使用它用jenkins的Performance Plugin插件可以生成性能圖表。這方面的配置可以百度一下,了解下性能報表的各個配置。

如果還想要執行時發現錯誤,進行郵件提醒,那麼可以再行配置。基本上可以通路jenkins頁面直接檢視報表就知道有無錯誤了。

執行步驟如下:

jenkins+ant+jmeter自動化接口測試架構搭建
jenkins+ant+jmeter自動化接口測試架構搭建
jenkins+ant+jmeter自動化接口測試架構搭建
jenkins+ant+jmeter自動化接口測試架構搭建
jenkins+ant+jmeter自動化接口測試架構搭建
jenkins+ant+jmeter自動化接口測試架構搭建

發現是Finished: SUCCESS,那麼表示成功了,如果不是,那麼恭喜你,耐着性子再調試下吧。

繼續閱讀