[SoapUI] 比较JSON Response

比较两个JSON, ID是数字时,处理成统一的格式:只保留小数点后5位

package direct;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.skyscreamer.jsonassert.JSONCompareMode;
import org.skyscreamer.jsonassert.JSONCompareResult;
import org.skyscreamer.jsonassert.comparator.DefaultComparator;
import org.skyscreamer.jsonassert.JSONCompare;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;

import static org.skyscreamer.jsonassert.comparator.JSONCompareUtil.*;

/**
 * Created by jenny zhang on 2017/9/19.
 */
public class LooseyJSONComparator extends DefaultComparator {
    private int scale;
	String extraInfo;
	def log;

    public LooseyJSONComparator(JSONCompareMode mode, int scale,String extraInfo,def log) {
        super(mode);
        this.scale = scale;
		this.extraInfo = extraInfo;
		this.log = log;
    }

	public static void assertEquals( String expected, String actual, int scale, String extraInfo, def log) throws JSONException {
        JSONCompareResult result = JSONCompare.compareJSON(expected, actual, new LooseyJSONComparator(JSONCompareMode.LENIENT,scale,extraInfo,log));
        if (result.failed()) {
			def failMessage = result.getMessage();
            throw new AssertionError(extraInfo + failMessage);
        }
		else{
			log.info "pass";
		}
    }

    @Override
    protected void compareJSONArrayOfJsonObjects(String key, JSONArray expected, JSONArray actual, JSONCompareResult result) throws JSONException {
        String uniqueKey = findUniqueKey(expected);
        if (uniqueKey == null || !isUsableAsUniqueKey(uniqueKey, actual)) {
            // An expensive last resort
            recursivelyCompareJSONArray(key, expected, actual, result);
            return;
        }

		Map<Object, JSONObject> expectedValueMap = arrayOfJsonObjectToMap(expected, uniqueKey, log);
		Map<Object, JSONObject> actualValueMap = arrayOfJsonObjectToMap(actual, uniqueKey, log);

        for (Object id : expectedValueMap.keySet()) {
            if (!actualValueMap.containsKey(id)) {
                result.missing(formatUniqueKey(key, uniqueKey, expectedValueMap.get(id).get(uniqueKey)),
                        expectedValueMap.get(id));
                continue;
            }
            JSONObject expectedValue = expectedValueMap.get(id);
            JSONObject actualValue = actualValueMap.get(id);
            compareValues(formatUniqueKey(key, uniqueKey, id), expectedValue, actualValue, result);
        }
        for (Object id : actualValueMap.keySet()) {
            if (!expectedValueMap.containsKey(id)) {
                result.unexpected(formatUniqueKey(key, uniqueKey, actualValueMap.get(id).get(uniqueKey)), actualValueMap.get(id));
            }
        }
    }

    private String getCompareValue(String value) {
		try{
			return new BigDecimal(value).setScale(scale, RoundingMode.HALF_UP).toString();
		} catch (NumberFormatException e) {
			return value;   //value may = NaN, in this case, return value directly.
		}
    }

    private boolean isNumeric(Object value) {
        try {
            Double.parseDouble(value.toString());
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    public Map<Object, JSONObject> arrayOfJsonObjectToMap(JSONArray array, String uniqueKey,def log) throws JSONException {
        Map<Object, JSONObject> valueMap = new HashMap<Object, JSONObject>();
        for (int i = 0; i < array.length(); ++i) {
            JSONObject jsonObject = (JSONObject) array.get(i);
            Object id = jsonObject.get(uniqueKey);
            id = isNumeric(id) ? getCompareValue(id.toString()) : id;
            valueMap.put(id, jsonObject);
        }
        return valueMap;
    }

    @Override
    public void compareValues(String prefix, Object expectedValue, Object actualValue, JSONCompareResult result) throws JSONException {
        if (areLeaf(expectedValue, actualValue)) {
            if (isNumeric(expectedValue) && isNumeric(actualValue)) {
                if (getCompareValue(expectedValue.toString()).equals(getCompareValue(actualValue.toString()))) {
                    result.passed();
                } else {
                    result.fail(prefix, expectedValue, actualValue);
                }
                return;
            }
        }
        super.compareValues(prefix, expectedValue, actualValue, result);
    }

    private boolean areLeaf(Object expectedValue, Object actualValue) {
		boolean isLeafExpectedValue = !(expectedValue instanceof JSONArray)&&!(expectedValue instanceof JSONObject);
		boolean isLeafActualValue = !(actualValue instanceof JSONArray)&&!(actualValue instanceof JSONObject);
		return isLeafExpectedValue&&isLeafActualValue;
    }
}

  

时间: 2024-08-03 16:25:25

[SoapUI] 比较JSON Response的相关文章

使用Groovy处理SoapUI中Json response

最近工作中,处理最多的就是xml和json类型response,在SoapUI中request里面直接添加assertion处理json response的话,可以采用以下方式: import groovy.json.JsonSlurper def response= testRunner.testCase.testSteps["requestName"].testRequest.response.contentAsString def slurper = new JsonSlurpe

[SoapUI] Compare JSON Response(比较jsonobject)

http://jsonassert.skyscreamer.org/ 从这个网站下载jsonassert-1.5.0.jar ,也可以下载到源代码 JSONObject data = getRESTData("/friends/367.json"); String expected = "{friends:[{id:123,name:\"Corby Page\"},{id:456,name:\"Carter Page\"}]}"

使用Django和Python创建Json response

使用jquery的.post提交,并期望得到多个数据,Python后台要使用json格式. 不指定datatype为json,让jquery自行判断数据类型.(注:跨域名请求数据,则使用 jsonp字符串) 若post指定数据类型json,则python取post数据,我觉着麻烦.让jquery智能判断,python返回字典最方便. 一般使用字典,而不是列表来返回 JSON内容. import json from django.http import HttpResponse response_

SoapUI对于Json数据进行属性值获取与传递

SoapUI的Property Transfer功能可以很好地对接口请求返回的数据进行参数属性获取与传递,但对于Json数据,SoapUI会把数据格式先转换成XML格式,但实际情况却是,转换后的XML格式往往根本没法用Xpath形式获取到指定的数据了.因此只能用Script脚本形式了. {"addUsersToDirectoryResponse":{"addUserToDirectoryResponse":[{"ack":"Succes

[JSON] Validating/Asserting JSON response with Jsonlurper

import groovy.json.JsonSlurper def response = messageExchange.response.responseContent log.info "response : "+ response def slurper = new JsonSlurper() def json = slurper.parseText response log.info "json : "+ json log.info "json

使用soapui验证JSON

JsonPath Assertions TestSteps收到的JSON消息可以通过JSON结构直接断言.你可以做匹配(Match,RegEx Match)和JsonPath验证(Count,Existence). JsonPath Count JsonPath Count使用JsonPath表达式计算元素的出现次数.适用于包含JSON的任何属性. Configuration JsonPath Existence Match 使用JsonPath表达式通过目标属性选择匹配的内容,并将结果与??期

通过FLASK中的RESPONSE返回JSON数据

使用flask的过程中,发现有时需要生成一个Response并返回.网上查了查,看了看源码,找到了两种办法: from flask import Response, json Response(json.dumps({'a': 1, 'b':1}),content_type='application/json') 更简单的方法是: from flask import jsonify jsonify({'a': 1, 'b': 2}) 本质上,两者是一样的.Werkzeug相关说明在这里. 当然,

ajax和json

1.$ ajax({ url:"", data:{username:"admin"},//发送时携带的参数 type:"post/get",//请求类型 dataType:"html/text/json",//返回类型 success:function(data){ }, error:function(){ } }) 2. <script type="text/javascript" src=&quo

python http server handle json

用Python实现一个http server # python2 # coding = utf-8 from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler import json class RequestHandler(BaseHTTPRequestHandler): def _set_headers(self): self.send_response(200) self.send_header('Content-type',