Ngrinder多接口的混合場景壓測比例設定方案


在考慮實際場景中多個業務同時由不同用戶數進行請求訪問,這時需要進行模擬測試。

本文中采用控制線程數運行百分比例,也就是控制虛擬用戶的比例來達到相應場景要求。

基於groovy腳本語言開發設計。

import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.plugin.http.HTTPRequest
import net.grinder.plugin.http.HTTPPluginControl
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith
import java.util.Date
import java.util.List
import java.util.ArrayList
import HTTPClient.Cookie
import HTTPClient.CookieModule
import HTTPClient.HTTPResponse
import HTTPClient.NVPair


/**
* A simple example using the HTTP plugin that shows the retrieval of a
* single page via HTTP.
*
* This script is automatically generated by ngrinder.
*
* @author ylfeng
*/

@RunWith(GrinderRunner)
class TestPre {

    public static GTest test
    public static HTTPRequest request
    public static NVPair[] headers = []
    public static NVPair[] params = []
    public static Cookie[] cookies = []
    public static GTest test1
    public static GTest test2
    public static GTest test3
    public static GTest test4
    public static GTest test5


    @BeforeProcess
    public static void beforeProcess() {
        HTTPPluginControl.getConnectionDefaults().timeout = 6000
        // 實例化五個GTest對象
        test1 = new GTest(1, "test1") 
        test2 = new GTest(2, "test2")
        test3 = new GTest(3, "test3")
        test4 = new GTest(4, "test4")
        test5 = new GTest(5, "test5")
        request = new HTTPRequest()
        grinder.logger.info("before process.");
    }

    @BeforeThread
    public void beforeThread() {
        // 設置五個請求的統計測試結果
        test1.record(this, "test1")
        test2.record(this, "test2")
        test3.record(this, "test3")
        test4.record(this, "test4")
        test5.record(this, "test5")
        grinder.statistics.delayReports=true;
        grinder.logger.info("before thread.");
    }

    @Before
    public void before() {
        request.setHeaders(headers)
        cookies.each { CookieModule.addCookie(it, HTTPPluginControl.getThreadHTTPClientContext()) }
        grinder.logger.info("before thread. init headers and cookies");
    }

    @Test
    public void test(){
        // 獲取總虛擬用戶和運行線程數
        int vusers = getVusers()
        int runThreadNum = getRunThreadNum()
        
        // 運行百分比例設置
        int runRate1 = 30
        int runRate2 = 30
        int runRate3 = 10
        int runRate4 = 10
        int runRate5 = 10
        
        // 計算線程運行比例數
        int runNum1 =  vusers / 100 * runRate1
        int runNum2 =  vusers / 100 * (runRate1 + runRate2)
        int runNum3 =  vusers / 100 * (runRate1+ runRate2 + runRate3)
        int runNum4 =  vusers / 100 * (100 - runRate5)
        int runNum5 =  vusers / 100 * 100
        
        // 根據比例進行相應請求
        if (runThreadNum > 0 && runThreadNum <= runNum1)
            this.test1()
        else if (runThreadNum > runNum1 && runThreadNum <= runNum2)
            this.test2()
        else if (runThreadNum > runNum2 && runThreadNum <= runNum3)
            this.test3()
        else if (runThreadNum > runNum3 && runThreadNum <= runNum4)
            this.test4()
        else if (runThreadNum > runNum4 && runThreadNum <= runNum5)
            this.test5()
    }

    public void test1(){
        grinder.logger.info("---請求一ones: {}---", grinder.threadNumber+1)

    }

    public void test2(){
        grinder.logger.info("---請求二twos: {}---", grinder.threadNumber+1)

    }

    public void test3(){
        grinder.logger.info("---請求三threes: {}---", grinder.threadNumber+1)

    }

    public void test4(){
        grinder.logger.info("---請求四fours: {}---", grinder.threadNumber+1)

    }
    
    public void test5(){
        grinder.logger.info("---請求五fives: {}---", grinder.threadNumber+1)

    }
    
    public int getVusers() {
        // 獲取虛擬用戶總數
        int totalAgents = Integer.parseInt(grinder.getProperties().get("grinder.agents").toString())
        int totalProcesses = Integer.parseInt(grinder.properties.get("grinder.processes").toString())
        int totalThreads = Integer.parseInt(grinder.properties.get("grinder.threads").toString())
        int vusers = totalAgents * totalProcesses * totalThreads
        return vusers
    }
    
    public int getRunThreadNum() {
        // 獲取當前壓力機數、進程數、線程數
        int agentNum = grinder.agentNumber
        int processNum = grinder.processNumber
        int threadNum = grinder.threadNumber
        
        // 獲取當前線程數
        int runThreadNum = (agentNum+1) * (processNum+1) * (threadNum+1)
        return runThreadNum
    }
}

 參考文檔:

  1、https://testerhome.com/topics/17585?locale=zh-CN

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM