自動化接口測試搭建
文章目錄
1. 環境介紹 jmeter+ant+jenkins
1.1 jmeter介紹
Apache JMeter™應用程序是開放源碼軟件,它是一個100%純Java應用程序,用於加載測試功能行爲和度量性能。它最初是爲測試Web應用程序而設計的,但後來擴展到其他測試功能。
下載地址: http://jmeter.apache.org/download_jmeter.cgi
版本:5.1.1
1.2 ant介紹
Apache Ant是一個Java庫和命令行工具,其任務是將構建文件中描述的進程作爲相互依賴的目標和擴展點來驅動。Ant的主要用途是構建Java應用程序。Ant提供了許多內置任務,允許編譯、組裝、測試和運行Java應用程序。Ant還可以有效地用於構建非Java應用程序,例如C或c++應用程序。更一般地說,Ant可以用於試驗任何類型的流程,這些流程可以根據目標和任務進行描述。
下載地址: https://ant.apache.org/bindownload.cgi
版本: 1.9.14
1.3 jenkins介紹
Jenkins是一個屢獲殊榮的跨平臺、持續集成和持續交付的應用程序,它可以提高您的工作效率。使用Jenkins來構建和測試您的軟件項目,使開發人員更容易地將更改集成到項目中,並使用戶更容易地獲得新的構建。它還允許您通過提供定義構建管道的強大方法以及與大量測試和部署技術的集成來持續交付軟件(本文不暫時不敘述更多有關於jenkins內容)。
2. 總體設計思路
需求: 自動化測試可行的方法以及實現(每次發佈,每天早上6點都會進行服務自動化腳本測試)
可行方案:首先後端接口自動測試需要將測試的接口和參數以及規則事先定義存入Excel中,後面根據定義好的數據請求響應接口,根據請求返回值判斷請求是否成功。
總體設計思路圖:
3. jmeter 的實現
3.1 準備工作
1.在 jmeter 5.1.1解壓路徑下的目錄下\apache-jmeter-5.1.1\bin找到jmeter.properties文件。
2.編輯jmeter.properties文件,增加以下配置。
#增加自定義的屬性信息的配置文件
user.properties=user.properties
#增加依賴的jar包文件路徑
plugin_dependency_paths=../lib/dependences
#保存輸出xml格式文檔
jmeter.save.saveservice.output_format=xml
dependences依賴如下:
同級目錄下的user.properties文件定義如下變量:
#發送請求的登陸url地址
TEST_USER_LOGIN_URL = 192.168.2.101
#登陸賬號
TEST_USER_USERNAME = huzx
#登陸密碼
TEST_USER_PASSWORD = 1
#jmeter相關文件的根目錄
home_dir = D:\\API
#發送請求的url
test_host = 192.168.2.101
3.2 具體實現
首先在測試計劃中新建一個線程組 —>線程組下新建一個全局變量、新建兩個個http請求、新建一個前置處理、新建一個前置處理器bean shell、新建一個循環控制器、新建一個結果樹。
- 新建全局變量,獲取自定義配置文件中的的變量信息。
-
獲取token。分兩個請求,第一個首先獲取並提取code和state,再根據code和state獲取token並提取,響應斷言,根據返回參數status判斷請求是否成功。
http信息頭管理器配置Content-Type 爲application/json
獲取code和state:
提取code和state:
響應斷言判斷請求是否成功,後面的請求斷言大部分相似。
拿到code和state去請求獲取access-token。
-
編寫一個前置處理器的Bean Shell 預處理腳本 ----》讀取***.xlsx的Excel文件,獲取excel中總條數,並存到變量row中,-1是爲了減去Excel首行定義數據。
代碼:import upanda.*; String path=vars.get("test_data"); log.info(path); String data = Test2.getRowNum(path); String row = String.valueOf(Integer.parseInt(data)-1); vars.put("row",row); log.info(row);
自己打的第三方工具包zzz-1.0-SNAPSHOT.jar。
Test2.getRow(path)方法代碼
package upanda;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Test2 {
public static String getRowNum(String path){
InputStream is = null;
try {
is = new FileInputStream(path);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
XSSFWorkbook wb = null;
try {
wb = new XSSFWorkbook(is);
} catch (IOException e) {
e.printStackTrace();
}
Sheet sheet = wb.getSheet("測試");
int rowsnum = sheet.getPhysicalNumberOfRows();
System.out.println(rowsnum);
try {
is.close();
wb.close();
} catch (IOException e) {
e.printStackTrace();
}
return String.valueOf(rowsnum);
}
}
- 循環控制器,根據Excel總行數定義循環次數,根據每一行數據發送請求。
根據計數器獲取Excel哪一行數據,併發送該數據的請求
獲取Excel哪一行數據
代碼:
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.InputStream;
String path=vars.get("test_data");
log.info(path);
String rownum=vars.get("rownum");
log.info("rownum"+rownum);
int i;
int k=0;
String [] datalist=new String[20];
String content;
int row = Integer.parseInt(rownum);
log.info("row"+row);
InputStream is = new FileInputStream(path);
log.info("is"+is);
Workbook wb = new XSSFWorkbook(is);
log.info("wb"+wb);
Sheet sheet = wb.getSheetAt(0);
log.info("sheet"+sheet);
Row row1 = sheet.getRow(row);
//9是因爲我表格就是8列的
for(i=0;i<8;i++){
//表格中5-6的兩行不取
if (i!=4&&i!=5){
Cell oCell= row1.getCell(i);
content=oCell.getStringCellValue();
datalist[k]=content;
k++;
}
}
//標識
vars.put("load",datalist[0]);
//用例名稱
vars.put("testcase",datalist[1]);
//接口
vars.put("inter",datalist[2]);
//請求方法
vars.put("method",datalist[3]);
//請求數據
vars.put("request",datalist[4]);
///斷言校驗
vars.put("response",datalist[5]);
log.info(datalist[0]);
log.info(datalist[1]);
log.info(datalist[2]);
log.info(datalist[3]);
log.info(datalist[4]);
log.info(datalist[5]);
根據Execl中的執行標識判斷是否爲yes, 判斷是否發送請求。
判斷請求是否爲post,發送post請求。
請求頭信息。
發送Post請求。
查看結果樹可以查看每一次請求的詳細信息。
4.jmeter集成ant的實現
編寫build.xml文件
<?xml version="1.0" encoding="utf-8"?>
<project name="JmeterTest" default="all" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>
<!-- 需要改成自己本地的 Jmeter 目錄-->
<property name="jmeter.home" value="D:\apache-jmeter-5.1.1" />
<!-- jmeter生成jtl格式的結果報告的路徑-->
<property name="jmeter.result.jtl.dir" value="D:\API\report\jtl" />
<!-- jmeter生成html格式的結果報告的路徑-->
<property name="jmeter.result.html.dir" value="D:\API\report\html" />
<!-- 生成的報告的前綴 -->
<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" />
<!-- 接收測試報告的郵箱
<property name="mail_to" value="[email protected]" />-->
<!-- 電腦地址 -->
<property name="ComputerName" value="upanda" />
<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\jmx" includes="*.jmx" />
</jmeter>
</target>
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan-2.7.2.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>
<target name="report">
<!--解決html中min和max爲NaN的情況和dataReport not define -->
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.htmlName}"
style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" >
<param name="dateReport" expression="${ReportName}${time}"/>
</xslt>
<!-- 因爲上面生成報告的時候,不會將相關的圖片也一起拷貝至目標目錄,所以,需要手動拷貝 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
<!-- 發送郵件 -->
</project>
執行ant命令,就可以自動生成html測試報告。
ant -f build.xml
至於集成jenkins執行shell腳本,然後將生成的測試報告可以通過郵件或者釘釘等進行推送。這個可在後面分享jenkins的可持續集成可持續部署進行分享。