接口自动化测试之实际项目做接口测试(六)

301 阅读8分钟

1.从实际项目出发分析测试结果处理方法

假设我们已经获取了JSON数据

# user_data.json
{
	"/api3/getbanneradvertver2": {
		"status": 0,
		"data": {
			"banner": [{
				"id": 2262,
				"type": 6,
				"type_id": 330,
				"name": "\u524d\u7aef\u4e0b\u4e00\u4ee3\u5f00\u53d1\u8bed\u8a00TypeScript  \u4ece\u57fa\u7840\u5230axios\u5b9e\u6218",
				"pic": "http:\/\/szimg.caichenwang.com\/5cf721df09fc2be500000000.jpg",
				"links": ""
			}, {
				"id": 1648,
				"type": 6,
				"type_id": 169,
				"name": "Python3\u5165\u95e8\u673a\u5668\u5b66\u4e60 \u7ecf\u5178\u7b97\u6cd5\u4e0e\u5e94\u7528",
				"pic": "http:\/\/szimg.caichenwang.com\/5d0ed2d9085bd6ed09000300.jpg",
				"links": ""
			}, {
				"id": 1875,
				"type": 6,
				"type_id": 316,
				"name": "\u4ece\u57fa\u7840\u5230\u5b9e\u6218 \u624b\u628a\u624b\u5e26\u4f60\u638c\u63e1\u65b0\u7248Webpack4.0",
				"pic": "http:\/\/szimg.caichenwang.com\/5d0ed2ca086a9e6f09000300.jpg",
				"links": ""
			}, {
				"id": 1999,
				"type": 6,
				"type_id": 342,
				"name": "\u7eaf\u6b63\u5546\u4e1a\u7ea7\u5e94\u7528 Node.js Koa2\u5f00\u53d1\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u670d\u52a1\u7aef",
				"pic": "http:\/\/szimg.caichenwang.com\/5ceb5d370955f30f09000300.jpg",
				"links": ""
			}, {
				"id": 2158,
				"type": 99,
				"type_id": 0,
				"name": "Spring Cloud\u5fae\u670d\u52a1\u5f00\u53d1\u5b9e\u8df5",
				"pic": "http:\/\/img2.caichenwang.com\/5d088c4009bbebc009000300.jpg",
				"links": "https:\/\/www.caichen.com\/read\/37"
			}, {
				"id": 1709,
				"type": 6,
				"type_id": 354,
				"name": "Node.js\u5f00\u53d1\u4eff\u77e5\u4e4e\u670d\u52a1\u7aef \u6df1\u5165\u7406\u89e3RESTful API",
				"pic": "http:\/\/szimg.caichenwang.com\/5d0ed27508f7d96909000300.jpg",
				"links": ""
			}],
			"pic": [{
				"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/actual_day@3x.png",
				"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/actual_night@3x.png",
				"type": 2
			}, {
				"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/path_day@3x.png",
				"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/path_night@3x.png",
				"type": 6
			}, {
				"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/question_day@3x.png",
				"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/question_night@3x.png",
				"type": 3
			}, {
				"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/note_day@3x.png",
				"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/note_night@3x.png",
				"type": 4
			}, {
				"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/discover_day@3x.png",
				"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/discover_night@3x.png",
				"type": 5
			}]
		},
		"errorCode": 1001,
		"errorDesc": "\u6210\u529f",
		"timestamp": 1561269343507
	}
    
  • 处理JSON结果

    1.有些接口不是单一的请求接口,比如我们商品进行评价,我需要判断这个用户是否完成订单,支付等。

    2.在上边的格式中我们发现格式基本是字段固定

    
    {
    "/api3/.....": {
    	"status": 0, # 状态代表成功失败,根据项目决定
    	"data": {
    		"banner": [{
    			"id": ....,
    			"type": ....,
    			"type_id": .....,
    			"name": "...",
    			"pic": "....",
    			"links": "..."
    		}
    		.....
    		]
    	},
    	"errorCode": ...,
    	"errorDesc": "....",
    	"timestamp": ....
    }
    

    3.编写excel测试用例

2.通过接口获取对应得code和message

需求:通过message和errorcode获取匹配的消息,根据url获取结果

# code_message.json
# 假设我访问每个端口,返回状态码与匹配信息如下,前期工作量较大
{
"api3/getbanneradvertver2":[
    {"1006":"token error"},
    {"1006":"用户名错误"},
    {"1006":"密码错误"}
],
"api3/beta4":[
    {"1006":"登陆成功"},
    {"1006":"用户名错误"},
    {"1006":"密码错误"}
],
"api3/getcourseintro":[
    {"1006":"token error"},
    {"10001":"用户名错误"},
    {"10002":"密码错误"}
]
}

3.封装获取message的值

#handle_result.py
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import json
from deepdiff import DeepDiff
from Util.handle_json import get_value
#print(get_value('api3/getbanneradvertver2',"/Config/code_message.json"))
'''[
        {"1006,":"token error"},
        {"10001":"用户名错误"},
        {"10002":"密码错误"}
    ]'''

def handle_result(url,code):
    data = get_value(url,"/Config/code_message.json")
    if data !=None:
        for i in data:
            message = i.get(str(code))
            if message:
                return message
    return None

def get_result_json(url,status):
    data = get_value(url,"/Config/result.json")
    if data !=None:
        for i in data:
            message = i.get(status)
            if message:
                return message
    return None



def handle_result_json(dict1,dict2):
    '''
    校验格式
    '''
    if isinstance(dict1,dict) and isinstance(dict2,dict):
    #dict1={"aaa":"AAA","bbb":"BBBB","CC":[{"11":"22"},{"11":"44"}]}
    #dict2={"aaa":"123","bbb":"456","CC":[{"11":"111"},{"11":"44"}]}
        cmp_dict = DeepDiff(dict1,dict2,ignore_order=True).to_dict()
        if cmp_dict.get("dictionary_item_added"):
            return False
        else:
            return True
    return False
    
    
if __name__ == "__main__":
    dict2 = {"aaa":"ddd","aaa1":"A1A","bbb":"BBBB","CC":[{"11":"22"},{"11":"44"}]}
    dict1={"aaa":"AAA","bbb":"BBBB","aaa3":"A1A","CC":[{"11":"22"},{"11":"44"}]}
    
    #print(handle_result('api3/getbanneradvertver2',"10002"))
    #print(handle_result_json(dict1,dict2))
    print(get_result_json("api3/newcourseskill","error"))

4.操作cookie

  • 操作cookie文件设计
#cookie.json
{
    "app": {
        "aosid":"LKJALKSJDKAHH1K2JH3J12V3HJ123HASBVABNSD"
    },
    "web": {
        "cookie":"123123123123123123123"
    }
}
#handle_json.py
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import json
from jsonpath_rw import jsonpath,parse

def read_json(file_name=None):
    if file_name == None:
        file_path = base_path+"/Config/user_data.json"
    else:
        file_path = base_path+file_name
    with open(file_path,encoding='UTF-8') as f:
        data = json.load(f)
    return data

def get_value(key,file_name=None):
    data = read_json(file_name)
    return data.get(key)
    #return data[key]



def write_value(data,file_name=None):
    '''
    {
        url:{
            
        }
    }
    '''
    data_value  = json.dumps(data)
    if file_name == None:
        path  = base_path+"/Config/cookie.json"
    else:
        path = base_path+file_name
    with open(path,"w") as f:
        f.write(data_value)


    
if __name__ == "__main__":
    data = {
        "app":{
            "aaaa":"bbbbbb"
        }    
    }
  • 更新cookie文件
#coding=utf-8
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import json
from Util.handle_json import get_value,read_json,write_value

def get_cookie_value(cookie_key):
    '''
    获取cookie
    '''
    data = read_json("/Config/cookie.json")
    return data[cookie_key]


def write_cookie(data,cookie_key):
    '''
    写入cookie
    '''
    data1 = read_json("/Config/cookie.json")
    data1[cookie_key] = data
    write_value(data1)


if __name__ == "__main__":
    data = {
        "aaaa":"1111111111111111"
    }
    print(write_cookie(data,'web'))


5.检查case是否通过

# handle_excel
#coding=utf8
import openpyxl
from openpyxl import workbook
import sys
from collections.abc import Iterable
import os
base_path = os.getcwd()
sys.path.append(base_path)

class HandExcel:
    def load_excel(self):
        '''
        加载excel
        '''

        open_excel = openpyxl.load_workbook(base_path+"/Case/imooc.xlsx")
        return open_excel

    def get_sheet_data(self,index=None):
        '''
        加载所有sheet的内容
        '''
        sheet_name = self.load_excel().sheetnames
        if index == None:
            index = 0
        data = self.load_excel()[sheet_name[index]]
        return data
    
    def get_cell_value(self,row,cols):
        '''
        获取某一个单元格内容
        '''
        data = self.get_sheet_data().cell(row=row,column=cols).value
        return data
    
    def get_rows(self):
        '''
        获取行数
        '''
        row = self.get_sheet_data().max_row
        return row
    
    def get_rows_value(self,row):
        '''
        获取某一行的内容
        '''
        row_list = []
        for i in self.get_sheet_data()[row]:
            row_list.append(i.value)
        return row_list


    def excel_write_data(self,row,cols,value):
        '''
        写入数据
        '''
        wb = self.load_excel()
        wr = wb.active
        wr.cell(row,cols,value)
        wb.save(base_path+"/Case/imooc.xlsx")


    def get_columns_value(self,key=None):
        '''
        获取某一列得数据
        '''
        columns_list = []
        if key==None:
            key = 'A'
        columns_list_data = self.get_sheet_data()[key]
        for i in columns_list_data:
            columns_list.append(i.value)
        return columns_list

    def get_rows_number(self,case_id):
        '''
        获取行号
        '''
        num = 1
        cols_data = self.get_columns_value()
        for col_data in cols_data:
            if case_id == col_data:
                return num
            num = num+1
        return num
    
    def get_excel_data(self):
        '''
        获取excel里面所有的数据
        '''
        data_list = []
        for i in range(self.get_rows()):
            data_list.append(self.get_rows_value(i+2))
        
        return data_list
    
excel_data = HandExcel()

if __name__ == "__main__":
    handle = HandExcel()
    ##print(handle.get_rows_number('imooc_001'))
    print(handle.get_excel_data())
#run_main.py
#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
from collections.abc import Iterable
from Util.handle_excel import excel_data
import json
from Util.handle_header import get_header
from Util.handle_result import handle_result,handle_result_json,get_result_json
from Util.handle_cookie import write_cookie,get_cookie_value
from Util.codition_data import get_data
from Base.base_request import request
#['imooc_001', '登陆', 'yes', None, 'login', 'post', '{"username":"111111"}', 'yes', 'message', None]
class RunMain:
    def run_case(self):
        rows = excel_data.get_rows()
        for i in range(rows):
            cookie=None
            get_cookie = None
            header = None
            depend_data = None
            data = excel_data.get_rows_value(i+2)
            is_run = data[2]
            if is_run == 'yes':
                is_depend = data[3]
                data1 = json.loads(data[7])
                if is_depend:
                    '''
                    获取依赖数据
                    '''
                    depend_key = data[4]
                    depend_data = get_data(is_depend)
                    #print(depend_data)
                    data1[depend_key] = depend_data

                method = data[6]
                url = data[5]
                
                is_header = data[9]
                excepect_method = data[10]
                excepect_result = data[11]
                cookie_method = data[8]
                if cookie_method == 'yes':
                    cookie = get_cookie_value('app')
                if cookie_method == 'write':
                    '''
                    必须是获取到cookie
                    '''
                    get_cookie={"is_cookie":"app"}
                if is_header == 'yes':
                    header = get_header()
                res = request.run_main(method,url,data1,cookie,get_cookie,header)
                #print(res)
                code = str(res['errorCode'])
                message = res['errorDesc']
                if excepect_method == 'mec': 
                    config_message = handle_result(url,code)
                    if message == config_message:
                        excel_data.excel_write_data(i+2,13,"通过")
                    else:
                        excel_data.excel_write_data(i+2,13,"失败")
                        excel_data.excel_write_data(i+2,14,json.dumps(res))
                if excepect_method == 'errorcode':
                    if excepect_result == code:
                        excel_data.excel_write_data(i+2,14,"通过")
                    else:
                        excel_data.excel_write_data(i+2,13,"失败")
                        excel_data.excel_write_data(i+2,14,json.dumps(res))
                if excepect_method == 'json':
                    if code == 1000:
                        status_str='sucess'
                    else:
                        status_str='error'
                    excepect_result = get_result_json(url,status_str)
                    result = handle_result_json(res,excepect_result)
                    if result:
                        excel_data.excel_write_data(i+2,13,"通过")
                    else:
                        excel_data.excel_write_data(i+2,13,"失败")
                        excel_data.excel_write_data(i+2,14,json.dumps(res))   
                
if __name__ == "__main__":
    run = RunMain()
    run.run_case()

6.发起请求更新cookie代码

#base_request.py
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import requests
import json
from Util.handle_cookie import write_cookie
from Util.handle_json import get_value
from Util.handle_init import handle_ini

class BaseRequest:
    def send_post(self,url,data,cookie=None,get_cookie=None,header=None):
        '''
        发送post请求
        '''
        response = requests.post(url=url,data=data,cookies=cookie,headers=header)
        if get_cookie !=None:
            '''
            {"is_cookie":"app"}
            '''
            cookie_value_jar =  response.cookies
            cookie_value = requests.utils.dict_from_cookiejar(cookie_value_jar)
            write_cookie(cookie_value,get_cookie['is_cookie'])
        res = response.text
        return res
    
    def send_get(self,url,data,cookie=None,get_cookie=None,header=None):
        '''
        发视get请求
        '''
        response = requests.get(url=url,params=data,cookies=cookie,headers=header)
        if get_cookie !=None:
            cookie_value_jar = response.cookie
            cookie_value = requests.utils.dict_from_cookiejar(cookie_value_jar)
            write_cookie(cookie_value,get_cookie['is_cookie'])

        res = response.text
        return res
    
    def run_main(self,method,url,data,cookie=None,get_cookie=None,header=None):
        '''
        执行方法,传递method、url、data参数
        '''
        #return get_value(url)
        base_url = handle_ini.get_value('host')
        if 'http' not in url:
            url = base_url+url
        
        if method == 'get':
            res = self.send_get(url,data,cookie,get_cookie,header)
        else:
            res = self.send_post(url,data,cookie,get_cookie,header)
        try:
            res = json.loads(res)
        except:
            print("这个结果是一个text")
        print("--->",res)
        return res

    
    
request = BaseRequest() 
if __name__ == "__main__":
    request = BaseRequest() 
    request.run_main('get','http://www.baidu.com/login',"{'username':'11111'}")

7.项目依赖数据

项目中通过Fiddler请求数据,查看哪些接口需要依赖数据,在excel中写明

#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
from Util.handle_excel import excel_data
from jsonpath_rw import parse
import json

def split_data(data):
    '''
    拆分单元格数据
    '''
    #imooc_005>data:banner:id
    case_id = data.split(">")[0]
    rule_data = data.split(">")[1]
    return case_id,rule_data

def depend_data(data):
    '''
    获取依赖结果集
    '''
    case_id = split_data(data)[0]
    row_number = excel_data.get_rows_number(case_id)
    data = excel_data.get_cell_value(row_number,14)
    return data


def get_depend_data(res_data,key):
    '''
    获取依赖字段
    '''
    res_data = json.loads(res_data)
    json_exe = parse(key)
    madle = json_exe.find(res_data)
    return [math.value for math in madle][0]

def get_data(data):
    '''
    获取依赖数据
    '''
    res_data = depend_data(data)
    rule_data = split_data(data)[1]
    return get_depend_data(res_data,rule_data)



if __name__ == "__main__":
    #print(depend_data("imooc_007>data:banner:id"))
    data = {
        "a":"a1",
        "b":"b1",
        "c":[
            {
                "d":"d1"
            },
            {
                "d":"d2"
            }
        ]
    }
    key = 'c.[1].d'
    print(get_depend_data(data,key))

8.最终数据验证

9.数据驱动和生成报告

#案例
#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
import ddt
import unittest
from Util.handle_excel import excel_data
data = excel_data.get_excel_data()
#data = [[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]]

@ddt.ddt
class TestCase01(unittest.TestCase):
    def setUp(self):
        print("case开始执行")
    
    def tearDown(self):
        print("case执行结束")
    @ddt.data(*data)
    def test_01(self,data1):
        #case编号	作用	是否执行	前置条件	依赖key	url	method	data	cookie操作	header操作	预期结果方式	预期结果	result	数据
        function,is_run,condition,depend_key,url,method,request_data,cookie,header,execpet_method,execpet,result,result_data =data
        #casename,casenum,isrun,method,cookie = data1
        print("this is test case",function,is_run,condition,depend_key,url,method,request_data,cookie,header,execpet_method,execpet,result,result_data)

if __name__ == "__main__":
    unittest.main()
#run_case_ddt.py
#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
from collections.abc import Iterable
from Util.handle_excel import excel_data
import json
import unittest
#from ddt import ddt,data,file_data,unpack
import ddt
import HTMLTestRunner
from Util.handle_header import get_header
from Util.handle_result import handle_result,handle_result_json,get_result_json
from Util.handle_cookie import write_cookie,get_cookie_value
from Base.base_request import request
#['imooc_001', '登陆', 'yes', None, 'login', 'post', '{"username":"111111"}', 'yes', 'message', None]

data = excel_data.get_excel_data()
@ddt.ddt
class TestRunMain(unittest.TestCase):

    @ddt.data(*data)
    def testrun_case(self,data):
        #rows = excel_data.get_rows()
        #for i in range(rows):
        cookie=None
        get_cookie = None
        header = None
        #data = excel_data.get_rows_value(i+2)
        is_run = data[2]
        if is_run == 'yes':
            method = data[5]
            url = data[4]
            data1 = data[6]
            is_header = data[8]
            excepect_method = data[9]
            excepect_result = data[10]
            codition = data[3]
            if codition:
                pass
            cookie_method = data[7]
            if cookie_method == 'yes':
                cookie = get_cookie_value('app')
            if cookie_method == 'write':
                '''
                必须是获取到cookie
                '''
                get_cookie={"is_cookie":"app"}
            if is_header == 'yes':
                header = get_header()
            res = request.run_main(method,url,data1,cookie,get_cookie,header)
            #print(res)
            code = str(res['errorCode'])
            message = res['errorDesc']
            if excepect_method == 'mec': 
                config_message = handle_result(url,code)
                self.assertEqual(message,config_message)
                '''
                if message == config_message:
                    excel_data.excel_write_data(i+2,12,"通过")
                else:
                    excel_data.excel_write_data(i+2,12,"失败")
                    excel_data.excel_write_data(i+2,13,json.dumps(res))
                '''
            if excepect_method == 'errorcode':
                self.assertEqual(excepect_result,code)
                '''
                if excepect_result == code:
                
                    excel_data.excel_write_data(i+2,12,"通过")
                else:
                    excel_data.excel_write_data(i+2,12,"失败")
                    excel_data.excel_write_data(i+2,13,json.dumps(res))
                '''
            if excepect_method == 'json':
                if code == 1000:
                    status_str='sucess'
                else:
                    status_str='error'
                excepect_result = get_result_json(url,status_str)
                result = handle_result_json(res,excepect_result)
                self.assertTrue(result)
                '''
                if result:
                    excel_data.excel_write_data(i+2,12,"通过")
                else:
                    excel_data.excel_write_data(i+2,12,"失败")
                    excel_data.excel_write_data(i+2,13,json.dumps(res)) 
                '''  
            
def add_case():
    case_path = os.path.join(base_path, "Run")
    discover = unittest.defaultTestLoader.discover(case_path,pattern='test_run_*.py')
    return discover
                
if __name__ == "__main__":
    file_path = base_path+'/Report/report.html'
    with open(file_path,'wb') as f:
        runner = HTMLTestRunner.HTMLTestRunner(stream=f,title="this is test",description="Mushishi test")
        runner.run(add_case())
    f.close()

好了各位,以上就是这篇文章的全部内容了,能看到这里人啊,都是人才。

如果这个文章写得还不错,觉得「王采臣」我有点东西的话 求点赞👍求关注❤️求分享👥 对耿男我来说真的非常有用!!!

白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

王采臣 | 文  【原创】

如果本篇博客有任何错误,请批评指教,不胜感激 !

更多精彩关注微信公众号,第一时间更新~