jenkins+ANT+jmeter 接口測試環境搭建

目的

jmeter很早就接觸了,最近又在接觸項目的時候整了一下。寫這篇博客主要有兩個目的css

1,爲了給本身搭建jmeter作一個總結。html

2,在部署過程當中遇到過一些坑,在這分享出來,也但願能給須要的人一個參考。前端

 

接口測試概述

詳細介紹jmeter接口測試環境以前,先簡單介紹下接口測試node

API testing is a type of software testing that involves testing application programming interfaces (APIs) directly and as part of integration testing to determine if they meet expectations for functionality, reliability, performance, and security. Since APIs lack a GUI, API testing is performed at the message layer.[2] API testing is now considered critical for automating testing because APIs now serve as the primary interface to application logic and because GUI tests are difficult to maintain with the short release cycles and frequent changes commonly used with Agile software development and DevOps).mysql

WIKI定義:接口測試做爲集成測試的一部分,經過直接控制API來判斷系統的功能性,可靠性,性能與安全性。API測試是沒有界面的,執行在通信層。API 測試在自動化測試中有着重要的地位,由於API通常是應用邏輯的主要接口,而GUI測試在敏捷開發和DevOps的快速迭代和頻繁變動中很難維護。web

分類

接口測試是測試系統組件間接口的一種測試。接口測試主要用於檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換,傳遞和控制管理過程,以及系統間的相互邏輯依賴關係等。
  接口測試適用於爲其餘系統提供服務的底層框架系統和中心服務系統,主要測試這些系統對外部提供的接口,驗證其正確性和穩定性。接口測試一樣適用於一個上層系統中的服務層接口,越往上層,其測試的難度越大。
  接口測試實施在多系統多平臺的構架下,有着極爲高效的成本收益比,接口測試天生爲高複雜性的平臺帶來高效的缺陷監測和質量監督能力。平臺越複雜,系統越龐大,接口測試的效果越明顯。
  基於接口測試的重要性,以及它比較容易自動化的特性,經過持續集成的接口監控可以及時的發現項目中存在的問題,這對持續運營的項目來講,很是重要。算法

模塊接口測試

模塊接口測試是單元測試的基礎。它主要測試模塊的調用與返回。常常須要編寫一些樁模塊與驅動模塊。
主要測試要點以下:sql

檢查接口返回的數據是否與預期結果一致。
檢查接口的容錯性,假如傳遞數據的類型錯誤時是否能夠處理。
接口參數的邊界值。例如,傳遞的參數足夠大或爲負數時,接口是否能夠正常處理。
接口的性能,接口處理數據的時間也是測試的一個方法。牽扯到內部就是算法與代碼的優化。
接口的安全性數據庫

WEB接口測試

web接口測試又可分爲兩類:服務器接口測試和外部接口測試。apache

服務器接口測試:是測試瀏覽器與服務器的接口。用戶輸入的數據是輸入到的前端頁面上,怎樣把這些數據傳遞的後臺的呢?經過http協議的get與post請求來實現先後端的數據傳遞。這也可認爲是接口測試。
外部接口測試:這個很典型的例子就是第三方支付,好比在咱們應用中在充流量時,交話費時,都會調用第三方支付接口。

主要測試要點以下:

請求是否正確,默認請求成功是200,若是請求錯誤也能返回40四、500等。
檢查返回數據的正確性與格式;json是一種很是常見的格式。
接口的安全性,通常web都不會暴露在網上任意被調用,須要作一些限制,好比鑑權或認證。
接口的性能,這直接影響用戶的使用體驗。

接口測試工具

SOAPUI
JMeter
Grinder
Suds Python

接口測試的流程

一、 項目啓動後,測試人員要儘早找到開發人員拿到接口測試文檔
  二、 獲取接口測試文檔後,就能夠進行接口用例的編寫和調試
  三、 接口用例編寫調試完成後,部署到持續集成的測試環境中,
  四、 設定腳本運行頻率,告警方式等基本參數,進行接口的平常監控
  五、 每日進行接口腳本的維護更新,接口異常的處理

測試用例設計與原則

測試用例

正面測試用例:

  • 覆蓋全部的必選參數

  • 組合可選參數

  • 參數邊界值

  • 若是參數的取值範圍是枚舉變量,須要覆蓋全部枚舉值

  • 還應考慮實際業務應用場景,去設計輸入參數的組合。(這些用例可用來測試功能,做爲SMOKE用例。也可未來用於壓力測試模擬實際業務場景,但要注意保證用例的獨立性,由於壓力測試是多線程的。好比咱們測試ACCOUNT 建立接口,NAME是不能重的,在寫測試用例時,給NAME賦值時能夠加一個時間戳, 這樣用例在多線程併發測試時也不會有問題)

負面測試用例:

  • 空數據

  • 包含特殊的字符

  • 越界的數據

  • 錯誤的數據

驗證點:

  • status code (正常狀況下,全部請求都應該返回200)

  • 響應信息數據結構(目前大多數狀況下,返回信息都是JSON, 咱們應該驗證相應的結構當數據信息發生改變時)

  • 驗證結點的類型

  • 驗證結點的值 (主要是針對固定的值或者值遵循某些規則,咱們能知道預期的結果的)

  • 對於列表,應該根據請求參數,也應該驗證列表的長度是否與指望值一致

  • 負面測試用例,應驗證ERROR INFO是否與實際相匹配

測試原則

測試應該是獨立的、可讀的、抗變的、可維護的,其實這也是全部自動測試應該遵循的原則

  • 每一個測試用例都是獨立的

  • 測試用例都是可重複運行的 (這主要是說一些測試數據不能寫死,不一樣的環境數據可能不一樣。在實際工做中,解決方案有二:自已建立所須要的數據,好比你要測試接口須要輸入參數ACCOUNTID,你能夠先調用建立ACCOUNT API, 而後從響應值拿到ACCOUNTID, 當你測試完你要測的接口後,再把新建的ACCOUNT刪除,也就是說一個測試用例分了三步。另一種方法就是讀取數據庫,從數據庫獲取數據,這種方法在測試開發與測試環境還OK,但若是測線上環境就比較困難了,由於咱們不能隨意更新上面的數據,也不能放過多的測試數據在上面。所以我我的比較推崇第一種方法,雖然增長開發用例的工做量,但一勞永逸)

  • 測試能被運行在不一樣的環境裏(日常測試環境至少會分DEV/TEST/STAGING/ONLINE,咱們在測試過程當中,應該把域名,token/apikey等應放在一個變量裏,當切換環境時,咱們只需改變變量的值便可

  • 測試數據與業務相分離(測試數據包括參數接口數據/ 測試執行所須要的系統數據)

  • 儘可能統一共用的測試環境變量

  • 測試完成後,要刪除沒必要要的測試數據。

爲何要用Jmeter作接口測試

很大的一個緣由是考慮了在部門內進行推廣的成本問題,另外也有開發能力較弱,時間有限不能充分去研究。jmeter自身也是很是好的一個接口測試工具,有如下一些優勢:

  1. Jmeter支持錄製,工具備Gui界面,入手相對簡單。
  2. Gui便於調試,本地調試經過上傳,管理容易。
  3. 維護成本很小,Jmeter功能比較全面,不會讓本身陷入不停的維護框架的坑。
  4. Jmeter Case是基於xml的(雖而後綴是jmx格式),執行結果也能夠導出xml格式(結果爲jtl後綴)

Jmeter作接口測試的缺陷:

 

  1. 單條Case執行依賴本地
  2. Jmeter編寫Case有必定學習成本
  3. 拓展性稍差,Case基於xml格式管理,後續若是想要本身編寫平臺,導出這些Case是個不小的工做量

Jmeter+Jenkins+Ant實施方案的適用範圍

 

  1. 小型公司或小團隊,大公司有本身的平臺,後續需求也多,仍是本身寫一套吧。
  2. 測試團隊較小,沒有專門的測試開發部門支持。
  3. 編程不是很牛逼的,若是你很厲害,本身能搞定全部前端,後臺,本身搞比較好。
  4. 須要馬上出活的,不想將有限的精力放到後期維護當中的

環境搭建

Jmeter相關插件安裝:

Jmeter的插件安裝很簡單,只須要下載對應插件解壓便可。

用例生成

生成原則:

  • 每一個功能模塊爲一個獨立的jmx文件。增長可維護性。(儘可能不要將一個jmx文件放入太多功能,後期維護成本會很高。)
  • 模塊的私有變量保存在模塊中,多模塊共有的(例如服務器ip端口等)能夠考慮存在單獨的文件中讀取。
  • 接口測試不要放太多線程,畢竟不是作壓力測試,意義也不大。
  • 導出方法:
  • 編寫測試用例
  • 文件——保存爲——指定路徑——肯定:

Jmeter配置文件修改:

爲何要修改配置文件

  • jmeter執行結果文件默認保存的不是xml格式,沒法轉化成html格式
  • jmeter執行結果文件默認有不少執行數據是不保存的,而測試報告須要這些數據
  • 配置文件路徑 ${jmeterhome}/bin/jmeter.profile
  • 配置文件修改內容: 修改jtl文件格式
    • 2.7默認實際已經是xml,可是在2.7以前的版本仍是csv

去掉註釋(#),修改csv爲xml
添加jtl文件結果參數:

 

根據想要保存的參數修改,若不會可參照後文第三方模板網址給出的參數修改。(後面會提到修改jmeter自帶的報告模板,部分數據須要在這裏配置進行展現
修改後別忘記去掉註釋(#)

Jenkins相關插件介紹與配置:

Jenkins插件安裝方法本文不作介紹,感興趣的能夠看我jenkins相關的博客。

Jmeter插件:Performance plugin

 

  • 功能:用來展現jmeter執行結果
  • 配置截圖

  • 配置說明:
  • Report files:配置jtl文件路徑,相對路徑與絕對路徑都可,圖爲相對路徑
  • 其餘選項:配置失敗比例顯示圖形等參數,按需配置

Ant插件:Ant Plugin

  • 功能:用來執行Ant
  • 配置截圖:

  • 配置說明:
  • Ant Plugin能夠在構建步驟中添加,直接執行構建。
  • targets:執行執行目標
  • build files:指定執行build.xml路徑

除了Ant插件執行,也能夠選擇命令行執行:

  • 添加shenll腳本(windows下添加dos腳本)執行構建
  • 相比用插件構建,命令行構建有如下優缺點:
    1. 須要在服務器中直接安裝ant並配置環境變量,確保jenkins能夠直接執行ant命令
    2. 若是Jenkins是放在tomcat容器中,須要在tomcat中配置環境變量,不然會報找不到Ant命令,具體配置以下:
    3. 編輯catalina.sh文件,加入環境變量,不然jenkins會報找不到Ant錯誤()
      #See the license for the……
      JAVA_HOME=/usr/lib/jvm/jdk1.8.0_31
      Export JENKINS_HOME="/root/.jenkins"
    4. 靈活性更強,能夠直接指定Ant的執行參數

 Svn插件:Subversion Plug-in

  • 功能:版本管理,按需使用
  • 配置截圖:

  • 配置說明:
  • Reponsitory URL:填寫倉庫url地址
  • Add按鈕:添加svn的用戶名密碼
  • 其餘選項:按需配置

  Html展現插件:HTML Publisher plugin

  • 配置說明:
  • HTML directory to archive:填寫生成html文件的路徑
  • index page[s]:填寫展現報告的主頁
  • 其餘選項:按需填寫
  • 原理說明:
  • 本插件並不會本身產生html文件,而是經過xslt轉化xml生成的報告
  • xslt能夠本身在服務器中安裝,也能夠經過經過Ant配置文件指定jar包,本文就是經過Ant指定jmeter內部集成的jar包生成的html文件並非在jenkins中默認的報告路徑展現,而是會複製到${jenkinshome}/jobs/projectname/htmlreports/HTML_REPORT目錄下

  每次只能展現最新版本的html報告,也就是說上一次編譯的html報告會被覆蓋,由於jenkins安全性的問題,默認加載出來的報告是無css的,經過如下配置解決:

  HTML Publisher Plugin 插件在新的Jenkins版本中會致使打開的網頁中沒法加載CSS以及沒法點擊按鈕的狀況,因爲CSP致使,可在Jenkins控制檯中執行:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
  以解決此問題。其餘因爲CSP緣由致使的html插件也可用此方法解決

Jenkins項目整體配置:

  • 服務器環境與依賴
  • Jdk:安裝並配置環境變量
  • Ant:安裝並配置環境變量
  • Jmeter:安裝並添加須要的插件
  • 其餘:
  • Jmeter+Ant,須要將${jmeterhome}/extras/ant-jmeter-1.1.1.jar文件拷貝到${anthome}/lib目錄下,不然編譯會報錯
  • Jmeter如需連接數據庫,需添加jdbc插件
  • 若是不引入jmeter中的xslt,須要手動安裝該軟件
  • Jenkins項目配置:
  • jenkins的工做路徑,一樣的jar包均可能會生成不一樣的路徑。 jenkins——系統設置——高級

Ant相關使用:

定製集成Ant配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<project name="ant-jmeter-test" default="all" basedir=".">
    <tstamp>
        <format property="time" pattern="yyyyMMddhhmm" />
    </tstamp>
    <!-- 須要改爲本身本地的 Jmeter 目錄-->
    <property name="jmeter.home" value="D:\Devlop\jmeter\apache-jmeter-2.7" />
    <!-- jmeter生成jtl格式的結果報告的路徑-->
    <property name="jmeter.result.jtl.dir" value="D:\API\JF_API\Report\jtl" />
    <!-- jmeter生成html格式的結果報告的路徑-->
    <property name="jmeter.result.html.dir" value="D:\API\JF_API\Report\html" />
    <!-- 生成的報告的前綴 -->
    <property name="ReportName" value="TestReport" />
	<!-- 須要輸出html報告的時候,html附帶時間
    <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" />
	-->
	<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />
    <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" />
	<!-- Diffrent version of Jmeter has its own ant-jmeter.jar,Please input the right versioin -->
	<path id="ant.jmeter.classpath">
	<pathelement location="${jmeter-home}/extras/ant-jmeter-1.1.1.jar" />
	</path>
	<!-- use this config to generate html report; if not, may not display Min/Max Time in html-->
	<path id="xslt.classpath">
	<fileset dir="${jmeter.home}/lib" includes="xalan-2.7.1.jar"/>
	<fileset dir="${jmeter.home}/lib" includes="serializer-2.7.1.jar"/>
	</path>
	
    <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腳本 -->
            <testplans dir="D:\API\JF_API\Test_Play" includes="*.jmx" />
			<property name="jmeter.save.saveservice.output_format" value="xml"/>			
        </jmeter>
    </target>

    <target name="report">
        <xslt in="${jmeter.result.jtlName}"
              out="${jmeter.result.htmlName}" classpathref="xslt.classpath"  
              style="${jmeter.home}/extras/jmeter-results-detail-report_30.xsl.xml" />
		<xslt in="${jmeter.result.jtlName}"
              out="${jmeter.result.html.dir}\TestLog.html" classpathref="xslt.classpath"  
              style="${jmeter.home}/extras/jmeter-results-shanhe-me.xsl" />

        <!-- 由於上面生成報告的時候,不會將相關的圖片也一塊兒拷貝至目標目錄,因此,須要手動拷貝 -->
        <copy todir="${jmeter.result.html.dir}">
            <fileset dir="${jmeter.home}/extras">
                <include name="collapse.png" />
                <include name="expand.png" />
            </fileset>
        </copy>
    </target>
</project>

 

  • 如上,有文字標示的地方須要修改,對應的路徑須要修改成本身的本地路徑
  • style參數爲生成html文件的模板文件,能夠修改成本身的模板文件,jmeter提供了多個模板文件可供使用,我這裏調用了兩個style文件

Case管理目錄結構:

  1. ./Test_Play/目錄用來放Jmeter生成的Case文件(編寫時注意,不要用絕對路徑,不然後續維護成本會提升)
  2. ./Test_suit/目錄用來放Jmeter測試須要的相關配置文件
  3. ./資源/目錄用來存放項目相關的一些文檔信息
  4. build.xml文件,Ant的配置文件
  5. 閱讀build.xml文件,會發先還有一個自動生成的目錄./report,該目錄下有兩個目錄jtl以及html,用來放置不一樣格式的測試報告。

測試執行與報告優化:

  • jmeter自帶模板
  • jmeter自帶了4個模板
  • 模板路徑:${jmeterhome}/extras/jmeter-results*.xsl
  • 模板效果(jmeter-results-detail-report_30.xsl.xml):

- 模板使用:

- 修改${jmeterhome}/bin/jmeter.profile配置文件,添加所需的報告參數
- build.xml文件中指定,(演示效果指定了兩個模板 1.jmeter-results-detail-report_30.xsl.xml   2.jmeter-results-shanhe-me.xsl  兩個模板均可在網上進行下載)

- 下載地址:http://shanhe.me/node/18/314

注意事項:
- 千萬不要忘記修改jmeter.profile文件
- 地址中介紹build.xml文件以及jmeter.profile文件具體的參數修改,不要忽視

指定從第一個跳轉到第二個Log網頁也很簡單,jenkins要用的時候把兩份都上傳了就好

 
 
注:文中許多內容參考了網上許多資料,很是感謝各位的知識分享!
相關文章
相關標籤/搜索