Jmeter 响应断言源码解析

1、响应断言选项

184925_BG3J_2391658.png

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

185219_EmrN_2391658.png

如图,界面上选择了检查点类型,保存后的配置文件中保存的对应编码为:

//断言类型对应的编码
    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

        //断言类型的判断就是根据配置文件中保存的编码
        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、日志输出源码片段

        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 ");
        }

转载于:https://my.oschina.net/u/2391658/blog/701654

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值