1. 程式人生 > >如何在Linux命令列介面愉快進行效能測試

如何在Linux命令列介面愉快進行效能測試

本人在做效能測試的過程中,遇到一個問題,測試機選了一臺Linux伺服器,只有命令列介面。執行測試用例不是非常的靈活,有時候我需要改一兩個引數新增一些日誌,都需要重新打包部署,雖然自動化構建比較方便,但感覺繞了一大圈,在經過一些簡單嘗試之後做好了兩個方案,一個是針對單介面的壓測,以配置檔案形式完成每一個request的組裝,然後通過調節併發的引數執行不同的測試用例,且支援多個請求一起壓測;另外一個以groovy指令碼形式執行用例,則需要在伺服器上配置好groovy環境以及把專案打包後的jar包推送到groovy的lib目錄下。

方案一:

從文字中讀取request組裝:

首先從文字讀取組裝request的類:

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方法實現引數化:


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()
    }
}

  • 這裡就不放Concurrent類的方法了,有興趣的同學可以去翻一翻之前的文章。

執行用例的命令列: java -jar performance.jar test 10 login 10 1000

解釋一下,test指令碼的請求分配10個執行緒,login指令碼請求分配10個執行緒,每個執行緒執行1000次請求。下面是test的內容:

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}

方案二:

這個就比較簡單了,首先在伺服器上配置好groovy環境,然後把介面功能測試和自動化測試專案的打包jar放到groovy的lib目錄下即可。這裡用到了Jenkins自動化構建,在後置指令碼中增加一行mv或者cp檔案的shell即可。

然後在伺服器上新建一個目錄存放groovy指令碼,下面放一個test指令碼內容:

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

歡迎有興趣的