本人在作性能測試的過程當中,遇到一個問題,測試機選了一臺Linux服務器,只有命令行界面。執行測試用例不是很是的靈活,有時候我須要改一兩個參數添加一些日誌,都須要從新打包部署,雖然自動化構建比較方便,但感受繞了一大圈,在通過一些簡單嘗試以後作好了兩個方案,一個是針對單接口的壓測,以配置文件形式完成每個request的組裝,而後經過調節併發的參數執行不一樣的測試用例,且支持多個請求一塊兒壓測;另一個以groovy腳本形式執行用例,則須要在服務器上配置好groovy環境以及把項目打包後的jar包推送到groovy的lib目錄下。java
從文本中讀取request組裝:git
首先從文本讀取組裝request的類:shell
package com.fun.utils.request; import com.fun.frame.SourceCode; import com.fun.httpclient.FanLibrary; import com.fun.profile.Constant; import com.fun.utils.WriteRead; import net.sf.json.JSONObject; import org.apache.http.client.methods.HttpRequestBase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 從文件中讀取接口相關參數,用來發送請求,實現接口請求的配置化 * <p>從當前路徑下獲取後綴爲.log的文件,以文件名爲準讀取文件內容</p> */ public class RequestFile extends SourceCode { private static Logger logger = LoggerFactory.getLogger(RequestFile.class); String url; /** * get對應get請求,post對應post請求表單參數,其餘對應post請求json參數 */ JSONObject headers; String requestType; String name; JSONObject info; JSONObject params; /** * @param name */ public RequestFile(String name) { this.name = name; getInfo(); this.url = this.info.getString("url"); requestType = this.info.getString("requestType"); getParams(); headers = JSONObject.fromObject(this.info.getString("headers")); } /** * 獲取當前目錄下的配置文件,以數字開頭,後綴是.log的 * * @param i */ public RequestFile(int i) { this(i + Constant.EMPTY); } /** * 從配置文件中讀取信息,組成一個json對象 */ private void getInfo() { String filePath = Constant.WORK_SPACE + name; logger.info("配置文件地址:" + filePath); this.info = WriteRead.readTxtByJson(filePath); } /** * 獲取請求參數 */ private void getParams() { params = JSONObject.fromObject(info.getString("params")); } /** * 根據info組成請求 * * @return */ public HttpRequestBase getRequest() { HttpRequestBase requestBase = requestType.equalsIgnoreCase(Constant.REQUEST_TYPE_POST) ? FanLibrary.getHttpPost(this.url, this.params) : requestType.equalsIgnoreCase(Constant.REQUEST_TYPE_GET) ? FanLibrary.getHttpGet(this.url, this.params) : FanLibrary.getHttpPost(this.url, this.params.toString()); FanLibrary.addHeaders(requestBase, headers); FanLibrary.setHeaderKey(); output(FanLibrary.getHttpResponse(requestBase)); return requestBase; } }
而後是經過main方法實現參數化:apache
class PerformanceFromFile extends SourceCode { public static void main(String[] args) { MySqlTest.setFlag(); def size = args.size(); List<HttpRequestBase> list = new ArrayList<>() for (int i = 0; i < size - 1; i += 2) { def name = args[i] int thread = changeStringToInt(args[i + 1]) def request = new RequestFile(name).getRequest() for (int j = 0; j < thread; j++) { list.add(request) } } int perTimes = changeStringToInt(args[size - 1]) def concurrent = new Concurrent(list, perTimes) concurrent.start() FanLibrary.testOver() } }
執行用例的命令行: java -jar performance.jar test 10 login 10 1000
json
解釋一下,test腳本的請求分配10個線程,login腳本請求分配10個線程,每一個線程執行1000次請求。下面是test的內容:vim
url=http://127.0.0.1:8050/api/pad/user/login requestType=peost params={"uname":"81951375115","pwd":"QJ81KU2LV6z1X4nA+czzvqVZVDsQnjOIKt857kEbemcs/SJW8GXL+sjOcemH5GFIm6rKKpqIOrqp1z0DUig/9QJouhBp1OQnZbNlkXSS84+IOQS022kbsN9e51r+GeyZDCrr7WWLenZJcyIE1BRrMeq1EkWCBotzwegXUJjR6Qs="} headers={requestId:88888888}api
這個就比較簡單了,首先在服務器上配置好groovy環境,而後把接口功能測試和自動化測試項目的打包jar放到groovy的lib目錄下便可。這裏用到了Jenkins自動化構建,在後置腳本中增長一行mv或者cp文件的shell便可。服務器
而後在服務器上新建一個目錄存放groovy腳本,下面放一個test腳本內容:markdown
import com.fun.httpclient.FanLibrary import com.okayqa.studentapd.base.OkayBase import com.fun.frame.excute.Concurrent class T8 extends OkayBase{ public static void main(String[] args) { def base = getBase() output(base.getLoginResponse()) def get = FanLibrary.requests.get(FanLibrary.requests.size() - 1) // new Concurrent(get,10,100).start() FanLibrary.testOver() } }
而後在服務器上經過vim就能夠靈活編輯腳本,執行不一樣的用例了,包括打點日誌什麼都是沒有問題的。併發
執行方法: groovy test