Jmeter 响应断言源码解析
2017-07-05 11:02
267 查看
1、响应断言选项
2、选项对应的检查点类型:Assession.Type
如图,界面上选择了检查点类型,保存后的配置文件中保存的对应编码为:
[code=language-ini]//断言类型对应的编码 private final static int MATCH = 1 << 0; final static int CONTAINS = 1 << 1; private final static int NOT = 1 << 2; private final static int EQUALS = 1 << 3; private final static int SUBSTRING = 1 << 4; 1:表示匹配 2:代表contains 8:代表equals 16:代表substring 6:不包含 5:不匹配 12:不相等 20:非substring
3、断言源码片段讲解
此类位于: org.apache.jmeter.assertions.ResponseAssertion.java[code=language-java] //断言类型的判断就是根据配置文件中保存的编码 boolean contains = isContainsType(); //判断是否是contains断言 boolean equals = isEqualsType(); //判断是否是equals断言 boolean substring = isSubstringType();//判断是否是Substring断言 boolean matches = isMatchType();//判断是否是Match(匹配)断言 boolean debugEnabled = log.isDebugEnabled(); if (debugEnabled){ log.debug("Type:" + (contains?"Contains":"Match") + (notTest? "(not)": "")); } try { // Get the Matcher for this thread Perl5Matcher localMatcher = JMeterUtils.getMatcher(); PropertyIterator iter = getTestStrings().iterator(); while (iter.hasNext()) { String stringPattern = iter.next().getStringValue(); Pattern pattern = null; if (contains || matches) { pattern = JMeterUtils.getPatternCache().getPattern(stringPattern, Perl5Compiler.READ_ONLY_MASK); } boolean found; if (contains) { //可以看到,如果断言为contains,则直接调的为String中的contains方法并且支持正则表达式 found = localMatcher.contains(toCheck, pattern); } else if (equals) {//如果断言为equals,则直接调的String的equals方法,不支持正则 found = toCheck.equals(stringPattern); } else if (substring) { //如果断言为Substring,则调用的是indexOf。如果从源码看,contains使用的也是indexOf做判断的。indexOf会做一定的匹配,然后把匹配的第一个字符的位置返回,返回的是int类型,如果没找到,那么返回-1。之所以有这两个方法存在,个人感觉应该是为了匹配jdk低版本。indexOf从java1.0就有,而contains从java5.0才有。 found = toCheck.indexOf(stringPattern) != -1; } else {//其他类型的判断和contains就没有区别了,匹配走的也是这个分支 found = localMatcher.matches(toCheck, pattern); } pass = notTest ? !found : found; if (!pass) { if (debugEnabled){log.debug("Failed: "+stringPattern);} result.setFailure(true); result.setFailureMessage(getFailText(stringPattern,toCheck)); break; } if (debugEnabled){log.debug("Passed: "+stringPattern);} } } catch (MalformedCachePatternException e) { result.setError(true); result.setFailure(false); result.setFailureMessage("Bad test configuration " + e); } return result;
4、日志输出源码片段
[code=language-java] switch (getTestType()) { case CONTAINS: case SUBSTRING: //可以看出Contains和substring同样都是contain sb.append(" expected to contain "); break; case NOT | CONTAINS: case NOT | SUBSTRING: sb.append(" expected not to contain "); break; case MATCH: sb.append(" expected to match "); break; case NOT | MATCH: sb.append(" expected not to match "); break; case EQUALS: sb.append(" expected to equal "); break; case NOT | EQUALS: sb.append(" expected not to equal "); break; default:// should never happen... sb.append(" expected something using "); }
相关文章推荐
- Jmeter源码之响应断言分析(六)
- JMeter 源码解析之一:JMeter 上传文件时,如何参数化 Content-Disposition 的 filename?
- JMeter源码目录解析
- Jmeter入门实战(二)如何使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比
- jmeter bean shell断言加密的响应信息
- JMeter响应断言(四)
- JMeter 测试过程中的响应断言以及断言结果
- Jmeter断言中判断请求失败的响应代码问题
- Jmeter--响应断言
- jmeter bean shell断言加密的响应信息(加密接口测试二)
- Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)
- OnItemClickListener 没响应的根本原因-源码解析
- Jmeter 快速入门教程(三)--添加响应断言
- <续>jmeter随笔(12)--定制json响应结果断言
- JMeter响应断言心得
- JMeter 源码解析之一:JMeter 上传文件时,如何参数化 Content-Disposition 的 filename?
- Jmeter笔记:响应断言详解
- java微信开发API解析(六)-综合运用(消息处理、自定义菜单响应处理、用户自动分组处理;包含源码)
- JMeter 插件 Json Path 解析 HTTP 响应 JSON 数据(转)