1. 程式人生 > >自動化測試與持續整合方案--Jmeter 測試介面及效能

自動化測試與持續整合方案--Jmeter 測試介面及效能

轉載地址:https://testerhome.com/topics/2580

一、什麼是介面測試?

  介面測試是測試系統元件間介面的一種測試。介面測試主要用於檢測外部系統與系統之間以及內部各個子系統之間的互動點。測試的重點是要檢查資料的交換,傳遞和控制管理過程,以及系統間的相互邏輯依賴關係等。
  介面測試適用於為其他系統提供服務的底層框架系統和中心服務系統,主要測試這些系統對外部提供的介面,驗證其正確性和穩定性。介面測試同樣適用於一個上層系統中的服務層介面,越往上層,其測試的難度越大。
  介面測試實施在多系統多平臺的構架下,有著極為高效的成本收益比,介面測試天生為高複雜性的平臺帶來高效的缺陷監測和質量監督能力。平臺越複雜,系統越龐大,介面測試的效果越明顯。
  基於介面測試的重要性,以及它比較容易自動化的特性,通過持續整合的介面監控能夠及時的發現專案中存在的問題,這對持續運營的專案來說,非常重要。

二、介面測試的流程

  1、 專案啟動後,測試人員要儘早找到開發人員拿到介面測試文件
  2、 獲取介面測試文件後,就可以進行介面用例的編寫和除錯
  3、 介面用例編寫除錯完成後,部署到持續整合的測試環境中,
  4、 設定指令碼執行頻率,告警方式等基本引數,進行介面的日常監控
  5、 每日進行介面指令碼的維護更新,介面異常的處理

三、編寫介面測試指令碼

  大部分效能工具都可以用來進行介面測試,jmeter就是一個好用的效能測試工具,他也同樣可以用來進行介面測試,jmeter比較適用於CGI、webservice、DB等型別的介面測試。下面以websevice api介面為例說明如何編寫介面測試用例(本文側重於介面測試平臺的搭建,對於具體工具是使用只進行簡單介紹,對於工具不瞭解的,可以自行百度):
以下是我弄的一個簡單的指令碼。


每個請求都加一個響應斷言來判斷是否達到期望。
如果用命令來執行,也很簡單:
jmeter -n -t test.jmx -l test.jtl

四、介面持續整合

在這塊卡了好久,主要是report展示。之前是不想再用其他工具(如:Ant, Maven ), 就想將jtl檔案的報告展現出來,弄了很久沒成功。最後還是向工具屈服,用的Ant來編譯.
主要是配置build.xml
一個示例:

<code><span class="cp"><?xml version="1.0" encoding="UTF-8"?></span>

<span class="nt"><project</span> <span class="na">name=</span><span class="s">"ant-jmeter-test"</span> <span class="na">default=</span><span class="s">"all"</span> <span class="na">basedir=</span><span class="s">"."</span><span class="nt">></span>
    <span class="nt"><tstamp></span>
        <span class="nt"><format</span> <span class="na">property=</span><span class="s">"time"</span> <span class="na">pattern=</span><span class="s">"yyyyMMddhhmm"</span> <span class="nt">/></span>
    <span class="nt"></tstamp></span>
    <span class="c"><!-- 需要改成自己本地的 Jmeter 目錄--></span>
    <span class="nt"><property</span> <span class="na">name=</span><span class="s">"jmeter.home"</span> <span class="na">value=</span><span class="s">"F:\xxxxx\Jmeter"</span> <span class="nt">/></span>
    <span class="c"><!-- jmeter生成jtl格式的結果報告的路徑--></span>
    <span class="nt"><property</span> <span class="na">name=</span><span class="s">"jmeter.result.jtl.dir"</span> <span class="na">value=</span><span class="s">"F:\xxxxx\resultLog\jtl"</span> <span class="nt">/></span>
    <span class="c"><!-- jmeter生成html格式的結果報告的路徑--></span>
    <span class="nt"><property</span> <span class="na">name=</span><span class="s">"jmeter.result.html.dir"</span> <span class="na">value=</span><span class="s">"F:\xxxxx\resultLog\html"</span> <span class="nt">/></span>
    <span class="c"><!-- 生成的報告的字首->
    <property name="ReportName" value="TestReport" />
    <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />

    <target name="all">
        <antcall target="test" />
        <antcall target="report" />
    </target>

    <target name="test">
        <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
        <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
            <!-- 宣告要執行的指令碼。"*.jmx"指包含此目錄下的所有jmeter指令碼--></span>
            <span class="nt"><testplans</span> <span class="na">dir=</span><span class="s">"D:\test_case_path"</span> <span class="na">includes=</span><span class="s">"*.jmx"</span> <span class="nt">/></span>
        <span class="nt"></jmeter></span>
    <span class="nt"></target></span>

    <span class="nt"><target</span> <span class="na">name=</span><span class="s">"report"</span><span class="nt">></span>
        <span class="nt"><xslt</span> <span class="na">in=</span><span class="s">"${jmeter.result.jtlName}"</span>
              <span class="na">out=</span><span class="s">"${jmeter.result.htmlName}"</span>
              <span class="na">style=</span><span class="s">"${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"</span> <span class="nt">/></span>

        <span class="c"><!-- 因為上面生成報告的時候,不會將相關的圖片也一起拷貝至目標目錄,所以,需要手動拷貝 --></span>
        <span class="nt"><copy</span> <span class="na">todir=</span><span class="s">"${jmeter.result.html.dir}"</span><span class="nt">></span>
            <span class="nt"><fileset</span> <span class="na">dir=</span><span class="s">"${jmeter.home}/extras"</span><span class="nt">></span>
                <span class="nt"><include</span> <span class="na">name=</span><span class="s">"collapse.png"</span> <span class="nt">/></span>
                <span class="nt"><include</span> <span class="na">name=</span><span class="s">"expand.png"</span> <span class="nt">/></span>
            <span class="nt"></fileset></span>
        <span class="nt"></copy></span>
    <span class="nt"></target></span>
<span class="nt"></project></span></code>

Jenkins 上安裝 “Publish performance test result report” ,“Publish HTML reports” 的外掛,配置一下。
執行。
結果如下:


如果加上一些併發,負載等,就是效能測試報告了。
效能報告的曲線展示還沒弄出來,有空再看看。

補上效能測試報告:

之前一直出了個錯:

<code>Performance: Recording JMeter reports '**/*.jtl'
Performance: no JMeter files matching '**/*.jtl' have been found. Has the report generated?. Setting Build to FAILURE
Build step 'Publish Performance test result report' changed build result to FAILURE
Finished: FAILURE</code>

導致結果出不來。後面在 Jmeter/bin 下將 jmeter.properties 中的:
jmeter.save.saveservice.output_format=csv
改成:
jmeter.save.saveservice.output_format=xml

結果就是這樣的:

我提供一個build.xml檔案,我也是Jenkins+Jmeter+SVN實現介面測試,build.xml檔案內容如下:

特別說明,裡面用到的jar包自行下載並且替換路徑

<?xml version="1.0" encoding="utf-8"?>
<project default="all">
<!-- Define your Jmeter Home & Your Report Title & Interval Time Between Test-->
<property name="report.title" value="資料中心介面測試報告"/>
<property name="jmeter-home" location="/home/xiongjinfei/ProgramFiles/apache-jmeter-2.11" />
<property name = "interval-time-in-seconds" value ="10"/>
<!-- default path config, you can modify for your own requirement;Generally, you do not need to modify -->
<property environment="env" />
<property name="runremote" value="false"/>
<property name="resultBase" value="results"/>
<property name="results.jtl" value="jtl"/>
<property name="results.html" value ="html"/>
<property name="jmxs.dir" value= "jmxs"/>
<tstamp><format property="report.datestamp" pattern="yyyy-MM-dd-HH-mm-ss"/></tstamp>
<property name="time" value="${report.datestamp}"/>

<!-- Diffrent version of Jmeter has its own ant-jmeter.jar,Please input the right versioin -->
<path id="ant.jmeter.classpath">
<pathelement location="${jmeter-home}/lib/ant-jmeter-1.1.1.jar" />
</path>
<taskdef name="jmeter"
classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"
classpathref="ant.jmeter.classpath" />
<!-- just to support foreach by ant -->
<taskdef resource="net/sf/antcontrib/antlib.xml" >
<classpath>
<pathelement location="/usr/share/java/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>

<!-- use this config to generate html report; if not, may not display Min/Max Time in html-->
<path id="xslt.classpath">
<fileset dir="/home/xiongjinfei/work/CITEST/libs" includes="xalan-2.7.1.jar"/>
<fileset dir="/home/xiongjinfei/work/CITEST/libs" includes="serializer-2.9.1.jar"/>
</path>
<!--執行之前首先建立臨時結果資料夾-->
<target name="create-folder">
<delete dir="${resultBase}/temp"/>
<mkdir dir="${resultBase}/temp/${results.jtl}" />
<mkdir dir="${resultBase}/temp/${results.html}" />
</target>

<target name="all-test" depends="create-folder">
<foreach param="jmxfile" target="test" >
<fileset dir="${jmxs.dir}">
<include name="*.jmx" />
</fileset>
</foreach>
</target>

<target name="test" >
<basename property="jmx.filename" file="${jmxfile}" suffix=".jmx"/>
<echo message="---------- Processing ${jmxfile} -----------"/>
<echo message="resultlogdir===${resultBase}/temp/${results.jtl}"/>
<jmeter
jmeterhome="${jmeter-home}"
resultlogdir="${resultBase}/temp/${results.jtl}"
runremote="${runremote}"
resultlog="${jmx.filename}.jtl"
testplan="${jmxs.dir}/${jmx.filename}.jmx">
<jvmarg value="-Xincgc"/>
<jvmarg value="-Xms1024m"/>
<jvmarg value="-Xmx1024m"/>
<property name="jmeter.save.saveservice.output_format" value="xml"/>

</jmeter>
<sleep seconds="3"></sleep>
<!--Generate html report-->

<xslt in="${resultBase}/temp/${results.jtl}/${jmx.filename}.jtl"
out="${resultBase}/temp/${results.html}/${jmx.filename}.html" classpathref="xslt.classpath"
style="${jmeter-home}/extras/jmeter-results-detail-report_21.xsl" >
<param name="dateReport" expression="${report.datestamp}"/>
<param name="showData" expression="n"/>
<param name="titleReport" expression="${report.title}:[${jmx.filename}]"/>
</xslt>

<echo message="跑完了一個指令碼,讓我休息一下吧!Sleep ${interval-time-in-seconds} Seconds, yo-yo-check-now,開始工作 Please waiting ......"/>
<sleep seconds="${interval-time-in-seconds}"></sleep>
</target>

<target name="copy-images" depends="all-test">
<copy file="${jmeter-home}/extras/expand.png" tofile="${results.html}/expand.png"/>
<copy file="${jmeter-home}/extras/collapse.png" tofile="${results.html}/collapse.png"/>
<copydir src="${resultBase}/temp" dest="${resultBase}/${report.datestamp}"/>
<copydir src="${results.html}" dest="${resultBase}/${report.datestamp}/html"/>
<delete dir="${resultBase}/temp"/>
</target>

<target name="all" depends="all-test, copy-images" />
</project>