1. 程式人生 > >jmeter java sampler測試java介面(一)javatest解讀

jmeter java sampler測試java介面(一)javatest解讀

  • jmeter線上api文件
    http://jmeter.apache.org/api/overview-summary.html
    首先分析javatest的原始碼。
    getDefaultParameters()方法返回一個Arguments,這是獲取入參的方法。在jmeter上建立一個java請求,選擇javatest可以看到需要使用者輸入的引數都是在這設定的。
    1 每一個引數都必須先在類中宣告為常量,常量值最好先賦值,如:
    private static final String SLEEP_NAME = “Sleep_Time”;
    jmeter視窗展示為Sleep_Time
    2 params.addArgument(SLEEP_NAME, String.valueOf(DEFAULT_SLEEP_TIME));
    (key)SLEEP_NAME - (value)使用者傳入/DEFAULT_SLEEP_TIME預設值
    3 通過context獲取SLEEP_NAME的值
    sleepTime = context.getLongParameter(SLEEP_NAME, DEFAULT_SLEEP_TIME);
    4 當然類中還要宣告
    private long sleepTime;
    public static final long DEFAULT_SLEEP_TIME = 100;
    上面4部實現了傳參,sleepTime 就可以直接使用了。如果沒有傳值,則使用預設的100
    5 DEFAULT_SLEEP_TIME可以不申明,後面一節就沒有使用預設值,程式碼也看起來簡單點
 public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument(SLEEP_NAME, String.valueOf(DEFAULT_SLEEP_TIME));
        params.addArgument(MASK_NAME, DEFAULT_MASK_STRING);
        params.addArgument(LABEL_NAME, "");
        params.addArgument(RESPONSE_CODE_NAME, RESPONSE_CODE_DEFAULT);
        params
.addArgument(RESPONSE_MESSAGE_NAME, RESPONSE_MESSAGE_DEFAULT); params.addArgument(SUCCESS_NAME, SUCCESS_DEFAULT); params.addArgument(SAMPLER_DATA_NAME, SAMPLER_DATA_DEFAULT); params.addArgument(RESULT_DATA_NAME, SAMPLER_DATA_DEFAULT); return params; }

先執行一下一個javatest請求
這裡寫圖片描述


runTest()方法返回一個SampleResult測試結果,這是測試主體。這裡的測試主體就是進行sleep的休眠,然後返回成功。出現異常則返回失敗

 @Override
    public SampleResult runTest(JavaSamplerContext context) {
        setupValues(context);
        //初始化引數值

        SampleResult results = new SampleResult();
//設定results的屬性 
//直接獲取setupValues()裡面引數的值
        results.setResponseCode(responseCode);//返回code
        results.setResponseMessage(responseMessage);//返回資訊
        results.setSampleLabel(label);//samplerlabel

        if (samplerData != null && samplerData.length() > 0) {
            results.setSamplerData(samplerData);
        }

        if (resultData != null && resultData.length() > 0) {
            results.setResponseData(resultData, null);
            results.setDataType(SampleResult.TEXT);
        }

        // Record sample start time.
        //測試的啟動時間
        results.sampleStart();
//測試程式碼
//休眠時間
        long sleep = sleepTime;
        if (sleepTime > 0 && sleepMask > 0) { // / Only do the calculation if
                                                // it is needed
            long start = System.currentTimeMillis();
            // Generate a random-ish offset value using the current time.
            sleep = sleepTime + (start % sleepMask);
        }

        try {
            // Execute the sample. In this case sleep for the
            // specified time, if any
            if (sleep > 0) {
                TimeUnit.MILLISECONDS.sleep(sleep);
            }
            results.setSuccessful(success);
        } catch (InterruptedException e) {
            LOG.warn("JavaTest: interrupted.");
            results.setSuccessful(true);
        } catch (Exception e) {
        //執行失敗
            LOG.error("JavaTest: error during sample", e);
            results.setSuccessful(false);
        } finally {
            // Record end time and populate the results.
            //用例結束時間
            results.sampleEnd();
        }

        if (LOG.isDebugEnabled()) {
            LOG.debug(whoAmI() + "\trunTest()" + "\tTime:\t" + results.getTime());
            listParameters(context);
        }

        return results;
    }

listParameters()日誌列印傳入的引數值

private void listParameters(JavaSamplerContext context) {
        Iterator<String> argsIt = context.getParameterNamesIterator();
        while (argsIt.hasNext()) {
            String name = argsIt.next();
            LOG.debug(name + "=" + context.getParameter(name));
        }
    }

whoAmI()返回當前執行緒

  private String whoAmI() {
        StringBuilder sb = new StringBuilder();
        sb.append(Thread.currentThread().toString());
        sb.append("@");
        sb.append(Integer.toHexString(hashCode()));
        return sb.toString();
    }

在進行debug的時候,呼叫了whoAmI()和listParameters(context)方法


        if (LOG.isDebugEnabled()) {
            LOG.debug(whoAmI() + "\trunTest()" + "\tTime:\t" + results.getTime());
            listParameters(context);
        }

setupTest()初始化測試的時候用到

  public void setupTest(JavaSamplerContext context) {
        if (LOG.isDebugEnabled()) {
            LOG.debug(whoAmI() + "\tsetupTest()");
            listParameters(context);
        }
    }

初始化引數方法,相當於LR的init函式

    public void setupTest(JavaSamplerContext context) {
        if (LOG.isDebugEnabled()) {
            LOG.debug(whoAmI() + "\tsetupTest()");
            listParameters(context);
        }
    }

建構函式,每建立一個java sampler執行緒的時候執行一次

  public TestJavaSampler() {
        LOG.debug(whoAmI() + "\tConstruct");
    }

這裡簡單介紹一下javatest的原始碼,解析還不是很清楚,但已經不影響測試。後面介紹如何修改測試主體和傳參,進行java方法測試