2022年 11月 4日

Python接口自动化

4 接口自动化
4.1 使用python实现接口自动化
如果不了解接口测试可参考https://ke.qq.com/course/4092904
使用Python的request库实现接口测试:

import json
import  requests
#使用session管理:
#1.可以自动关联set-cookie里面的内容
#2.可以加快与服务器的连接速度
session=requests.session()
#auth接口
#发包和收包
#这里一般是要放参数,使用data入参还是json入参,根据请求头中  Content-Type的参数,可以用alt+左键查看这个方法,看说明。
result=session.post(url="url")
#解码
text_result=result.content.decode("utf-8")
print(text_result)
try:
    #将结果转化为字典
    json_result=json.loads(text_result)
except  Exception as e:
    json_result={}
token=json_result.get('token')
print(token)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

4.2 Python接口自动化关键字驱动封装思路
提供一下思路:
设计思路
1.接口地址前缀都是一样的话,我们可以在post请求中传入接口后缀进行拼接

就要有一个seturl方法 也需要一个实例属性self.url 对地址进行处理

2.使用requests.session()进行请求,那么也需要一个实例属性self.session

3.在做post请求时,需要有一个dopost的方法
requests库中对于post请求有两种传参方式
request post 参数选择 data = 还是json= 取决于请求的content-type
需要对参数进行处理:
根据自己的入参习惯对参数进行处理 如果是json 就可以用json.loads转化为字典
字符串拆解成字典 有个私有方法处理参数
get请求:doget方法
参数直接拼接在url中即可

4.需要一个添加头的方法 :设置请求头 addheader 对应的就还有移除请求头removeheader
5.对接口结果进行断言,需要一个断言方法 assertmethod,我们也需要实例属性保存请求结果
使用self.json_result = {}结果保存json结果
使用self.text_result 结果保存文本结果

6.关联关系处理 需要使用一个字典保存参数 self.relations = {}

何为关联关系?上一步的请求的返回结果  用于下一次请求

那么就是需要保存动作(savaparams)保存到字典(键和值)

替换(私有方法,在入参时使用{ 保存的参数名} 处理) 在下一次请求时带上这个参数  
     使用字符串的替换的方法: 遍历字典的键。如果能匹配到则说明这个参数需要替换成该键的值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

还有一些增加的可以 比如说日志、集成excel、allure我这里不介绍,自行添加
4.3 接口关键字代码

import json
import traceback
import requests
class Inter:

    def __init__(self):
        self.url=None
        self.session=requests.session()
        self.json_result = {}
        self.text_result:str=''
        self.relation={} 
    def seturl(self,url:str=''):
        """
        设置接口地址前缀
        :param url:
        :return:
        """
        self.url=url
        return self.url


    def addheader(self,key='',value=''):
        """
        添加请求头
        """
        value=self.__get_ralation(value)
        self.session.headers[key]=value

    def removeheader(self, key):
        """
        删除请求头
        """
        try:
            self.session.headers.pop(key)
        except Exception as e:
            pass
        return self.session.headers

    def dopost(self,url:str="",params: str = ''):
        """
        post请求
        """
        if url.startswith('http'):
            name=url
        else:
            name=self.url+url
        params=self.__get_ralation(params)
        params=self.__get_data(params)
        try:
            result=self.session.post(url=name,data=params)
            self.text_result=result.content.decode("utf8")
            self.text_result = result.text
            try:
                self.json_result=json.loads(self.text_result)
            except Exception as e:
                print("json处理异常")
                self.json_result = {"error":"json处理异常"}
        except Exception as e:
            print("请求异常")
            self.text_result= str(traceback.format_exc())

    def doget(self,url,params:str=""):
        """
        get请求
        """

        if url.startswith('http'):
            name=url
        else:
            name=self.url+url
        params=self.__get_ralation(params)
        try:
            result=self.session.get(url=name+'?'+params)
            self.text_result=result.content.decode("utf8")
            self.text_result = result.text
            try:
                self.json_result=json.loads(self.text_result)
            except Exception as e:
                print("json处理异常")
                self.json_result = {"error":"json处理异常"}
        except Exception as e:
            print("请求异常")
            self.text_result= str(traceback.format_exc())
    def assertresult(self,result_key: str = '', expect_result: str = ''):
        """
        断言结果
        """
        try:
            actual_result = str(self.json_result.get(result_key))
        except Exception as e:
            actual_result = 'None'

        if actual_result == expect_result:
            print("PASS")
            print(actual_result)
        else:
            print("FAIL")

    def savaparams(self,param_name: str, json_key: str):
        """
        把上一次请求的结果保存
        """
        json_value=str(self.json_result.get(json_key))

        self.relation[param_name]=json_value

    def __get_ralation(self,params:str):
        """
        获取参数值
        """
        if params:
            for key in self.relation:
                params=params.replace('{'+key+'}',self.relation.get(key))

            # for key in self.json_result.keys():
            #     params = params.replace('{' + key + '}', str(self.json_result.get(key)))
            return params
        else:

            return params


    def __get_data(self,params:str=""):
        """
        处理参数
        """
        params_dict = {}
        if params:
            params=params.split('&')
            for key_value in params:
                key = key_value[:key_value.find('=')]
                value = key_value[key_value.find('=') + 1:]
                params_dict[key] = value
            return params_dict
        else:
            return params_dict
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136