51Testing软件测试论坛

标题: Jmeter 响应断言源码解析 [打印本页]

作者: 测试积点老人    时间: 2018-12-28 13:49
标题: Jmeter 响应断言源码解析
本帖最后由 测试积点老人 于 2018-12-28 13:50 编辑

1、响应断言选项
[attach]120525[/attach]

2、选项对应的检查点类型:Assession.Type

[attach]120526[/attach]

如图,界面上选择了检查点类型,保存后的配置文件中保存的对应编码为:
  1. //断言类型对应的编码
  2.     private final static int MATCH = 1 << 0;

  3.     final static int CONTAINS = 1 << 1;

  4.     private final static int NOT = 1 << 2;

  5.     private final static int EQUALS = 1 << 3;

  6.     private final static int SUBSTRING = 1 << 4;

  7. 1:表示匹配
  8. 2:代表contains
  9. 8:代表equals
  10. 16:代表substring
  11. 6:不包含
  12. 5:不匹配
  13. 12:不相等
  14. 20:非substring
复制代码
3、断言源码片段讲解

此类位于: org.apache.jmeter.assertions.ResponseAssertion.java

  1. //断言类型的判断就是根据配置文件中保存的编码
  2.         boolean contains = isContainsType(); //判断是否是contains断言
  3.         boolean equals = isEqualsType(); //判断是否是equals断言
  4.         boolean substring = isSubstringType();//判断是否是Substring断言
  5.         boolean matches = isMatchType();//判断是否是Match(匹配)断言
  6.         boolean debugEnabled = log.isDebugEnabled();
  7.         if (debugEnabled){
  8.             log.debug("Type:" + (contains?"Contains":"Match") + (notTest? "(not)": ""));
  9.         }
  10.         
  11.         try {
  12.             // Get the Matcher for this thread
  13.             Perl5Matcher localMatcher = JMeterUtils.getMatcher();
  14.             PropertyIterator iter = getTestStrings().iterator();
  15.             while (iter.hasNext()) {
  16.                 String stringPattern = iter.next().getStringValue();
  17.                 Pattern pattern = null;
  18.                 if (contains || matches) {
  19.                     pattern = JMeterUtils.getPatternCache().getPattern(stringPattern, Perl5Compiler.READ_ONLY_MASK);
  20.                 }
  21.                 boolean found;
  22.                 if (contains) {  //可以看到,如果断言为contains,则直接调的为String中的contains方法并且支持正则表达式
  23.                     found = localMatcher.contains(toCheck, pattern);
  24.                 } else if (equals) {//如果断言为equals,则直接调的String的equals方法,不支持正则
  25.                     found = toCheck.equals(stringPattern);
  26.                 } else if (substring) {
  27.                    //如果断言为Substring,则调用的是indexOf。如果从源码看,contains使用的也是indexOf做判断的。indexOf会做一定的匹配,然后把匹配的第一个字符的位置返回,返回的是int类型,如果没找到,那么返回-1。之所以有这两个方法存在,个人感觉应该是为了匹配jdk低版本。indexOf从java1.0就有,而contains从java5.0才有。
  28.                     found = toCheck.indexOf(stringPattern) != -1;
  29.                 } else {//其他类型的判断和contains就没有区别了,匹配走的也是这个分支
  30.                     found = localMatcher.matches(toCheck, pattern);
  31.                 }
  32.                 pass = notTest ? !found : found;
  33.                 if (!pass) {
  34.                     if (debugEnabled){log.debug("Failed: "+stringPattern);}
  35.                     result.setFailure(true);
  36.                     result.setFailureMessage(getFailText(stringPattern,toCheck));
  37.                     break;
  38.                 }
  39.                 if (debugEnabled){log.debug("Passed: "+stringPattern);}
  40.             }
  41.         } catch (MalformedCachePatternException e) {
  42.             result.setError(true);
  43.             result.setFailure(false);
  44.             result.setFailureMessage("Bad test configuration " + e);
  45.         }
  46.         return result;
复制代码
4、日志输出源码片段
  1. switch (getTestType()) {
  2.         case CONTAINS:
  3.         case SUBSTRING:   //可以看出Contains和substring同样都是contain
  4.             sb.append(" expected to contain ");
  5.             break;
  6.         case NOT | CONTAINS:
  7.         case NOT | SUBSTRING:
  8.             sb.append(" expected not to contain ");
  9.             break;
  10.         case MATCH:
  11.             sb.append(" expected to match ");
  12.             break;
  13.         case NOT | MATCH:
  14.             sb.append(" expected not to match ");
  15.             break;
  16.         case EQUALS:
  17.             sb.append(" expected to equal ");
  18.             break;
  19.         case NOT | EQUALS:
  20.             sb.append(" expected not to equal ");
  21.             break;
  22.         default:// should never happen...
  23.             sb.append(" expected something using ");
  24.         }
复制代码





作者: Miss_love    时间: 2020-12-28 09:13
学习了




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2