python对比两个域名下的响应结果

(还是不太完善,先记录一下,免得忘了)

一、思路:

1、相同:接口和参数完全相同
2、不同:域名不同
3、要做的:对比响应,对比完产生报告,方便查看

二、需要的:

1、对于相同的最好通过读取配置文件的方式,参数化进行处理,使用的是ddt
2、域名不同(暂未处理,写死了)
3、对比json,自己总是考虑不全,有bug,所以查找第三方库处理(json_tools)
4、报告,使用unittest执行产生报告BeautifulReport

三、具体:

1、配置文件格式:使用的json处理方式

[
  {
    "description": "草稿列表第一页",
    "skip": false,
    "interface":"/article/draft?page=2",
    "method": "GET",
    "contentType": "application/x-www-form-urlencoded",
    "data": {}
  },
  {
    "description": "获取内容列表第一页",
    "skip": false,
    "interface": "/content/contentList?page=1",
    "method": "get",
    "contentType": "application/x-www-form-urlencoded",
    "data": {}
  },
  {
    "description": "视频的realmlist",
    "skip": true,
    "interface":"/video/realmlist",
    "method": "get",
    "contentType": "application/json",
    "data": {}
  }
]

2、具体代码:
【unittest】:https://www.cnblogs.com/daxiong2014/p/10449184.html
自动化测试框架
【ddt】:https://www.cnblogs.com/fukun/p/8671718.html
实现参数化
【BeautifulReport】 :https://blog.csdn.net/yiwenrong/article/details/101781792
报告模板
【json_tools】:https://blog.csdn.net/shuyichao/article/details/88311845
json对比,使用json_tools.diff(json01,json02),对比结果也很直观,放入一个list中,每个元素都是一个map,主要有add,remove和replace三种,add指的是json02比json01多出来的部分,remove则相反,replace是值不相同的地方,具体看博客,关键是如果要过滤的话根据这个结果过滤也很方便

image.png

# -*- coding: utf-8 -*-
import json_tools
import json
import unittest
import requests
import ddt
from BeautifulReport import BeautifulReport as bf
import time

'''代码重构,对比接口'''

filename = 'conf.json'

def get_interface():
    with open(filename, 'r', encoding='utf8') as fp:
        json_data = json.load(fp)
    return json_data


@ddt.ddt
class Diff(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("****start****")

    @classmethod
    def tearDownClass(cls):
        print("***end***")

    @classmethod
    def req(cls, method, host, interface, data={}, headers={}):
        # 处理请求        
        url = host + interface       
        payload = data
        response = requests.request(method, url, headers=headers, data=payload)        
        return json.loads(response.content)

    @ddt.file_data('conf.json')
    def test_diff(self, description, skip, interface, method, contentType, data):
        if not skip:
            test_host = 'host01'
            nomal_host = 'host02'

            header = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
                'Content-Type': 'application/x-www-form-urlencoded'       
            }   
            print(description)
            print("jh_url:" + test_host + interface)
            print("nomal_url:" + nomal_host + interface)
            print("data:" + str(data))

            header['Content-Type'] = contentType

            jh_res = Diff.req(method, test_host, interface, data,headers=header)
            # print(json.dumps(jh_res, indent=4, ensure_ascii=False))
            nomal_res = Diff.req(method, nomal_host, interface, data,headers=header)
            # print(json.dumps(nomal_res, indent=4, ensure_ascii=False))
            diff_res = json_tools.diff(jh_res, nomal_res)
            print(json.dumps(diff_res, indent=4, ensure_ascii=False))
            self.assertEqual(len(diff_res), 0)
        else:
            print(description)
            print("skip")

if __name__ == "__main__":
    suite = unittest.TestLoader().loadTestsFromTestCase(Diff)
    run = bf(suite)
    # run.report(filename='demo'+"_"+str(int(time.time())),description='test_demo_report')
    run.report(filename='diff', description='test_diff_report')

3、运行

python xxxx.py

4、报告展示:


image.png

image.png

三、问题(待优化)

1、host最好也能进行配置
2、处理依赖的接口不够灵活(目前是根据传入的description字段进行判断,然后在写要依赖的接口取值),但是这块最好也能进行配置项
3、如果要过滤某些字段的判断,或忽略list的排序问题
4、简单的平台化:后续想用Django实现,要做的是上传配置文件,返回html报告地址,用户点击地址可查看报告详情
5、还有就是想用python脚本实现代理获能取所有请求,自动获取接口、请求头,请求参数,自动分别请求不同域名进行diff,哎,懂得太少。。。
6、仅仅是diff了,但是原本有的功能可能会被忽略,例如先存数据,再取数据,设计流程化请求diff

你可能感兴趣的:(python对比两个域名下的响应结果)