java解析Jemter的jmx文件

 解析拼接思路:把一个完整的jmx文件拆分成3份,方便多个接口jmx串可以进行循环拼接。

  • 拼接接口url和参数
  • 将多个接口拼接到一个线程池
  • 配置计算并发量
    private static String file1 = "/data1/tydic/jmeter/t.jmx";
    private static String file2 = "/data1/tydic/jmeter/t1.jmx";
    private static String file3 = "/data1/tydic/jmeter/t2.jmx";

public static void parseXml(String[] sId, String[] sum, String[] ts, ApiMapper apiMapper) {
        String url = "";
        // 解析books.xml文件
        // 创建SAXReader的对象reader
        SAXReader reader = new SAXReader();
        try {
            // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
            Document document = reader.read(new File(file1));

            // 通过document对象获取根节点bookstore
            Element bookStore = document.getRootElement();
            Element element = bookStore.element("hashTree").element("hashTree");
            // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
            Document document1 = reader.read(new File(file2));
            // 通过document对象获取根节点bookstore
            Element bookStore1 = document1.getRootElement();
            // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
            Document document2 = reader.read(new File(file3));
            // 通过document对象获取根节点bookstore
            Element bookStore2 = document2.getRootElement();
            for (int i = 0; i < sum.length; i++) {
                List<DopApiCase> caseList = apiMapper.findCaseById(sId[i]);
                // todo 根据测试用例的数量对测试总数进行计算,重新设置
                // 计算并发量
                int i1 = Integer.parseInt(ts[i]) / caseList.size();

                getElement2(bookStore1, sum[i], i1 >=0 ? 1 : i1);
                List<Map<String, Object>> interResList = apiMapper.findInterInfoBysId(sId[i]);
                Map<String, Object> m2 = apiMapper.findMethodById(sId[i]);
                // 直接从原始表里查一条测试数据
                List<DopApiPara> m4 = apiMapper.findParaById(sId[i]);
                // 先改成从用例表里查数据,拼接成现有的参数格式
                List<DopApiPara> paraList = apiMapper.findParaById(sId[i]);
                //todo 将测试用例表当中的数据取出来拼接成以下格式,抽出一个方法List<DopApiCase>==》List<DopApiPara>
                List<DopApiPara> m3 = caseToPara(caseList, paraList);
                System.out.println("=======================-================");
                System.out.println(m3.size());
                System.out.println(m3);
                System.out.println(m4);
                System.out.println("=======================-================");

                String sName = interResList.get(0).get("S_NAME").toString();
                if ("1".equals(interResList.get(0).get("S_TYPE").toString().trim())) {
                    System.out.println("原子服务Jmeter测试开始!!!");
                    HashMap<String, String> st = apiMapper.findSkeyToken(sId[i]);
                    HashMap<String, String> path = apiMapper.findParaPath(sId[i]);
                    String skey = "";
                    if (st == null) {
                        st = new HashMap<>(4);
                        Map<String, String> valMap = apiMapper.findSkeyAndToken();
                        st.put("sToken", valMap.get("sToken"));
                        skey = valMap.get("sKey");
                    }else {
                        skey = "57f0773e26c84e0f";
                    }
                    String token = st.get("sToken");
                    String timestamp = System.currentTimeMillis() + "";
                    // 随机生成seqid,再进行截取
                    String s = UUID.randomUUID().toString();
                    String seqid = s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24);

                    Map<String, String> params = new HashMap<>(4);
                    params.put("token", token);
                    params.put("timestamp", timestamp);
                    params.put("seqid", seqid);
                    String sign = DopSign.makeSign(params, skey);

                    url = "10.142.101.156:80/openapi" + path.get("PATH_URL");
                    // 添加原子服务的必须参数
                    DopApiPara p = new DopApiPara();
                    p.setParaCode("sign");
                    p.setColValExp(sign);
                    DopApiPara p1 = new DopApiPara();
                    p1.setParaCode("timestamp");
                    p1.setColValExp(timestamp);
                    DopApiPara p2 = new DopApiPara();
                    p2.setParaCode("seqid");
                    p2.setColValExp(seqid);
                    DopApiPara p3 = new DopApiPara();
                    p3.setParaCode("token");
                    p3.setColValExp(token);
                    DopApiPara p4 = new DopApiPara();
                    p4.setParaCode("md");
                    p4.setColValExp("GET");
                    m3.add(p);
                    m3.add(p1);
                    m3.add(p2);
                    m3.add(p3);
                    m3.add(p4);
                    getElement3(bookStore2, sId[i], sName, url, m3);
                } else {
                    if ("49".equals(interResList.get(0).get("PROT_ID").toString().trim())) {
                        for (DopApiPara p : m3) {
                            if ("keyId".equals(p.getParaCode())) {
                                p.setParaCode("key_id");
                            } else if ("serviceId".equals(p.getParaCode())) {
                                p.setParaCode("service_id");
                            }
                        }
                        DopApiPara para = new DopApiPara();
                        para.setParaCode("user_id");
                        para.setColValExp(interResList.get(0).get("PARA_VAL").toString());
                        m3.add(para);
                        DopApiPara para1 = new DopApiPara();
                        para1.setParaCode("md");
                        para1.setColValExp("GET");
                        m3.add(para1);
                    }
                    DopApiPara para = new DopApiPara();
                    para.setParaCode("seq_id");
                    para.setColValExp(UUIDUtil.uuid());
                    m3.add(para);
                    String sys_url = interResList.get(0).get("SYS_URL").toString().split("http://")[1];

                    if (m2 == null || m2.get("sMethod") == null) {
                        url = sys_url;
                    } else {
                        // 拼写url
                        url = sys_url + "/" + m2.get("sMethod");
                    }
                    m3.remove(0);
                    getElement3(bookStore2, sId[i], sName, url, m3);
                }

                element.add((Element) bookStore1.clone());
                element.add((Element) bookStore2.clone());
                getElement(element);
                element.remove((Element) element.elements("ThreadGroup").get(0));
                element.remove((Element) element.elements("hashTree").get(0));
                writeFile(document, bookStore);
                FileUtil.execJmeter(sId[i], apiMapper);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

 

    private static void getElement3(Element e2, String sid, String sName, String url, List<DopApiPara> m3) {
        // TODO Auto-generated method stub
        List<Element> list2 = e2.elements();
        Element element2 = list2.get(0);
        Element element3 = list2.get(1);
        element2.addAttribute("testname", sName);
        Element collectionProp = element2.element("elementProp").element("collectionProp");
        String me = "";
        for (int i = 0; i < m3.size(); i++) {

            Element ele = collectionProp.addElement("elementProp");
            // 设置参数名称
            ele.addAttribute("name", m3.get(i).getParaCode());
            ele.addAttribute("elementType", "HTTPArgument");
            Element ele1 = ele.addElement("boolProp");
            Element ele2 = ele.addElement("stringProp");
            Element ele3 = ele.addElement("stringProp");
            Element ele4 = ele.addElement("boolProp");
            Element ele5 = ele.addElement("stringProp");
            ele1.addAttribute("name", "HTTPArgument.always_encode");
            ele1.setText("false");
            ele2.addAttribute("name", "Argument.value");
            // 设置参数值
            ele2.setText(m3.get(i).getColValExp()== null ? "" : m3.get(i).getColValExp());
            ele3.addAttribute("name", "Argument.metadata");
            ele3.setText("=");
            ele4.addAttribute("name", "HTTPArgument.use_equals");
            ele4.setText("true");
            ele5.addAttribute("name", "Argument.name");
            ele5.setText(m3.get(i).getParaCode());
            if ("md".equals(m3.get(i).getParaCode())) {
                me = m3.get(i).getColValExp();
            }
        }
        List<Element> elements = element2.elements("stringProp");
        for (Element e : elements) {
            if ("HTTPSampler.domain".equals(e.attributeValue("name"))) {
                e.setText(url.split(":")[0]);
            } else if ("HTTPSampler.port".equals(e.attributeValue("name"))) {
                e.setText(url.split(":")[1].split("/")[0]);
            } else if ("HTTPSampler.path".equals(e.attributeValue("name"))) {
                e.setText(url.substring(url.indexOf("/")));
            } else if ("HTTPSampler.method".equals(e.attributeValue("name"))) {
                e.setText(me);
            }
        }
        Element ele = (Element) element3.elements().get(0);
        ele.element("stringProp").setText(dir + sid + ".jtl");
        System.out.println(ele.element("stringProp").getText());
    }

 

private static void getElement2(Element e1, String s, Integer t) {
        // TODO Auto-generated method stub

        // TODO Auto-generated method stub
        Iterator<Element> iterator = e1.elementIterator();
        while (iterator.hasNext()) {
            Element next = iterator.next();
            if ("ThreadGroup.num_threads".equals(next.attributeValue("name"))) {
                next.setText(s);
            }
            if ("ThreadGroup.ramp_time".equals(next.attributeValue("name"))) {
                next.setText(t+"");
            }
            if ("ThreadGroup.start_time".equals(next.attributeValue("name"))) {
                next.setText(TIME_STAMP + "");
            }
            if ("ThreadGroup.end_time".equals(next.attributeValue("name"))) {
                next.setText(TIME_STAMP + "");
            }
        }

    }

 

    private static void writeFile(Document document, Element element) throws IOException {
        // TODO Auto-generated method stub

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream(new File(fileNewFile)), format);
        writer.write(document);
        writer.close();
        System.out.println(element.elements().size());

    }

 

t.jmx

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="3.1" jmeter="3.1 r1770033">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="test" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">true</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>    
        <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <stringProp name="LoopController.loops">1</stringProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">10</stringProp>
        <stringProp name="ThreadGroup.ramp_time">2</stringProp>
        <longProp name="ThreadGroup.start_time">1532656519000</longProp>
        <longProp name="ThreadGroup.end_time">1532656519000</longProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.duration"></stringProp>
        <stringProp name="ThreadGroup.delay"></stringProp>
      </ThreadGroup>
      <hashTree>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="第一个服务" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
            <collectionProp name="Arguments.arguments">
            </collectionProp>
          </elementProp>
          <stringProp name="HTTPSampler.domain">suggest.taobao.com/sug</stringProp>
          <stringProp name="HTTPSampler.port"></stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
          <stringProp name="HTTPSampler.protocol"></stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path"></stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <boolProp name="HTTPSampler.monitor">false</boolProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
        </HTTPSamplerProxy>
        <hashTree>
          <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
            <boolProp name="ResultCollector.error_logging">false</boolProp>
            <objProp>
              <name>saveConfig</name>
              <value class="SampleSaveConfiguration">
                <time>true</time>
                <latency>true</latency>
                <timestamp>true</timestamp>
                <success>true</success>
                <label>true</label>
                <code>true</code>
                <message>true</message>
                <threadName>true</threadName>
                <dataType>true</dataType>
                <encoding>true</encoding>
                <assertions>true</assertions>
                <subresults>true</subresults>
                <responseData>true</responseData>
                <samplerData>false</samplerData>
                <xml>false</xml>
                <fieldNames>true</fieldNames>
                <responseHeaders>false</responseHeaders>
                <requestHeaders>false</requestHeaders>
                <responseDataOnError>false</responseDataOnError>
                <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
                <assertionsResultsToSave>0</assertionsResultsToSave>
                <bytes>true</bytes>
                <sentBytes>true</sentBytes>
                <url>true</url>
                <hostname>true</hostname>
                <threadCounts>true</threadCounts>
                <sampleCount>true</sampleCount>
                <idleTime>true</idleTime>
                <connectTime>true</connectTime>
              </value>
            </objProp>
            <stringProp name="filename">/usr/local/src/jmeter/aggregate1.jtl</stringProp>
            <boolProp name="useGroupName">true</boolProp>
          </ResultCollector>
          <hashTree/>
        </hashTree>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>

t1.jmx

<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <stringProp name="LoopController.loops">1</stringProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">10</stringProp>
        <stringProp name="ThreadGroup.ramp_time">2</stringProp>
        <longProp name="ThreadGroup.start_time">1532656519000</longProp>
        <longProp name="ThreadGroup.end_time">1532656519000</longProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.duration"></stringProp>
        <stringProp name="ThreadGroup.delay"></stringProp>
      </ThreadGroup>

t2.jmx

<hashTree>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="第一个服务" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
            <collectionProp name="Arguments.arguments">
            </collectionProp>
          </elementProp>
          <stringProp name="HTTPSampler.domain">suggest.taobao.com/sug</stringProp>
          <stringProp name="HTTPSampler.port"></stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
          <stringProp name="HTTPSampler.protocol"></stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path"></stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <boolProp name="HTTPSampler.monitor">false</boolProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
        </HTTPSamplerProxy>
        <hashTree>
          <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
            <boolProp name="ResultCollector.error_logging">false</boolProp>
            <objProp>
              <name>saveConfig</name>
              <value class="SampleSaveConfiguration">
                <time>true</time>
                <latency>true</latency>
                <timestamp>true</timestamp>
                <success>true</success>
                <label>true</label>
                <code>true</code>
                <message>true</message>
                <threadName>true</threadName>
                <dataType>true</dataType>
                <encoding>true</encoding>
                <assertions>true</assertions>
                <subresults>true</subresults>
                <responseData>true</responseData>
                <samplerData>false</samplerData>
                <xml>false</xml>
                <fieldNames>true</fieldNames>
                <responseHeaders>false</responseHeaders>
                <requestHeaders>false</requestHeaders>
                <responseDataOnError>false</responseDataOnError>
                <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
                <assertionsResultsToSave>0</assertionsResultsToSave>
                <bytes>true</bytes>
                <sentBytes>true</sentBytes>
                <url>true</url>
                <hostname>true</hostname>
                <threadCounts>true</threadCounts>
                <sampleCount>true</sampleCount>
                <idleTime>true</idleTime>
                <connectTime>true</connectTime>
              </value>
            </objProp>
            <stringProp name="filename">/usr/local/src/jmeter/aggregate1.jtl</stringProp>
            <boolProp name="useGroupName">true</boolProp>
          </ResultCollector>
          <hashTree/>
        </hashTree>
      </hashTree>

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值