Skip to content

diff restful api result #26

Description

@davideuler

Case:
Need to compare different version of restful api to check if the result are identical.

-*- coding: utf-8
import os
import json
import requests
import traceback

try:
    from urlparse import urlparse
except:
    # Python 3x:
    from urllib.parse import urlparse

test_api_host="xxx-test.com"

expected_api_host="xxx.com"


def generat_output_json_path(imageUrl, apiName, fileNamePostfix):
    # it should not occur
    if not imageUrl:
        return "null_image_url.json"
    path = urlparse(imageUrl).path
    relative_url =  path.lstrip("/").replace("/","_") + fileNamePostfix + ".json"
    
    output_folder = "output/" + apiName.lower()
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
        
    return output_folder + "/" + relative_url

def request_url_with_json(http_path, json):
    headers = {"Content-Type": "application/json", "x-sdk-invoke-type":"common", "Accept":"application/json", "PK":"123456789"}
    response = requests.post(http_path, data=json, headers=headers)
    return response.json()

def submit_request_to_url(serviceUrl, serviceUrlPostfix, imageUrl, jsonTemplateFile):

    if serviceUrl and not serviceUrl.startswith("http"):
        serviceUrl = "http://" + serviceUrl

    request_image_url = imageUrl
    request_json_template = open(jsonTemplateFile).read()
    request_json =  request_json_template.replace("$IMAGE_URL", request_image_url)
    
    response = None
    httpCode = None
    status = ""
    message = ""
        
    try:
        response =  request_url_with_json(serviceUrl + serviceUrlPostfix, request_json)
        if not response:
            print("Error request url: %s" % serviceUrl + serviceUrlPostfix)
            return None
        
        ## ignore fields:
        if "request_id" in response:
            del response["request_id"]
        
    except:
        # printing stack trace
        traceback.print_exc()

    return response


def diff_api_service_resullt(serviceUrlPostfix, imageUrl, jsonTemplateFile):
    
    test_api_response   = submit_request_to_url(test_api_host, serviceUrlPostfix, imageUrl, jsonTemplateFile)
    expected_api_response = submit_request_to_url(expected_api_host,  serviceUrlPostfix, imageUrl, jsonTemplateFile)
    
    test_json_file = generat_output_json_path(url, "detect", "_test")
    expected_json_file = generat_output_json_path(url, "detect", "_expected")
    diff_output_file = generat_output_json_path(url, "detect", "_diff")
    
    outfile = open(test_json_file,"w")
    output_json = json.dumps(test_api_response, indent=4, sort_keys=True, ensure_ascii=False)
    outfile.write(output_json)
    outfile.close()
    
    outfile = open(expected_json_file,"w")
    expected_json = json.dumps(expected_api_response, indent=4, sort_keys=True, ensure_ascii=False)
    outfile.write(expected_json)
    outfile.close()
    
    if not expected_json == output_json:
        # 保存差异到 diff 文件
        cmd = "python3 ./diff2html %s %s" % (test_json_file, expected_json_file)
        print("executing: %s" % cmd)
        diff_stdout = os.popen(cmd, "r")
        diff_output = diff_stdout.readlines()
    
        diff_outputfile_path = "./report/" + diff_output_file.replace("/","_") + ".html"
        dirname = os.path.dirname(diff_outputfile_path)

        if not os.path.exists(dirname):
            os.makedirs(dirname)
        
        diff_outfile = open(diff_outputfile_path,"w")
        diff_outfile.write("".join(diff_output))
        diff_outfile.close()
        
        diff_stdout.close()
        
        
if __name__ == "__main__":
    url = "https://www.demo.com/a.jpeg"
    diff_api_service_resullt("/api/face/detect", url, "./input/detect.json")

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions