51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1974|回复: 1
打印 上一主题 下一主题

Jmeter 响应断言源码解析

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 530 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-28 13:49:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 测试积点老人 于 2018-12-28 13:50 编辑

    1、响应断言选项


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



    如图,界面上选择了检查点类型,保存后的配置文件中保存的对应编码为:
    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.         }
    复制代码




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 09:46 , Processed in 0.065077 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表