解析拼接思路:把一个完整的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>