接口自动化

一、基础篇

1、requests常用方法及Response对象属性和方法详解

requests第三方库,主要用于发送http请求,做接口自动化

#请求方法如下:
requests.get(url=,params=)# 发送get请求
requests.post(url=,data=,json=)# 发送post请求
requests.delete()# 发送delete请求
requests.put()# 发送put请求
requests.request()# 最核心的方法:无论是说明请求,最后都是调用request方法

#响应信息的内容处理如下:
response = requests.request()
#返回字符串的数据
print(response.text)
#返回字节格式的数据
print(response.content)
#返回字典格式的数据
print(response.json())
#返回状态码
print(response.status_code)
#返回状态信息
print(response.reason)
#返回cookie信息
print(response.cookies)
#返回编码格式
print(response.encoding)
#返回响应头信息
print(response.headers)

2、get、post方法传参注意点

get请求通过params传递参数。

post请求通过json或者data传参。它们的区别是什么?

  • data传参:
    • 数据报文:dict字典类型,那么默认情况下请求头为:application/x-www-form-urlencoded,表示以form表单的方式传参,格式:a=1&b=2&c=3
    • 数据报文:str类型,那么默认情况下为:text/plain,表示以文本方式传参(如果参数是dict格式需要转换成str格式传参)
  • json传参:
    • 数据报文:不管是dict还是str类型,默认都是application/json,表示以json的方式传参,格式:{“a”:1,“b”:2,“c”:3}
json.dumps(data)# 序列化:把dict格式的数据转换成str格式
json.loads(data)# 反序列化:把str格式的数据转换成dict格式

总结:

  • data传参只能传简单的只有键值对的dict格式或者是str格式,json传参一般只能传dict格式(简单的和嵌套的都可以)

files传参——用于上传文件

涉及文件上传的接口,上传文件之前需要open文件,才能上传成功

#用open()方法找到文件,"rb"表示用二进制的方式打开
data={
    "media":open(r"E:\shu.png","rb")
}
response = requests.post(url=url,files=data)#使用files上传文件

3、requests对于cookie鉴权以及session鉴权的处理

需要带请求头的接口以及需要cookie关联的接口如何测试

#通过正则表达式获取信息	从response.text数据中获取包含字段为'name="csrf_token"的第一个value值
csrf_token = re.search('name="csrf_token" value="(.*?)"',response.text)[1]

#请求需要带请求头的接口
headers={
    "Accept":"",
    "X-Requested-With":"XMLHttpRequest"
}

response  = requests.post(url=rul,data=data,headers=headers,cookies=cookies)

cookie鉴权:网页的接口基本上都要做cookie鉴权

通过session实现cookie鉴权,这种常用

requests.session()

二、升华篇

pytest用例管理框架

pytest默认规则

  1. py文件必须要以test_开头或者 _test结尾
  2. 类名必须以Test开头
  3. 测试用例(方法名)必须以test_开头

pytest用例管理框架的作用

  1. 发现测试用例:从多个py文件中通过默认的规则去找测试用例
  2. 执行测试用例:顺序和条件
  3. 判断测试结果:断言
  4. 生成测试报告:html、allure

用例管理框架有哪些?

python:unittest、pytest

java:junit、testng

pytest全局观

  1. 它可以和所有的自动化测试工具selenium、requests、appium结合实现web自动化,接口自动化以及app自动化
  2. 可以跳过用例以及失败用例重跑
  3. 结合allure生成美观的测试报告
  4. 和jenkins持续集成
  5. 拥有强大的插件库:
    • pytest-html——生成html测试报告
    • pytest-xdist——多线程运行
    • pytest-ordering——改变测试用例的执行顺序
    • pytest-rerunfailures——失败用例重跑
    • allure-pytest——生成allure测试报告

pytest运行方式

1、主函数运行(命令行的方式运行)

-v 输出更加详细的运行信息

-s 输出调试信息

-n 多线程运行

–reruns 失败用例重跑

–html 生成html测试报告

-m “分组名” 执行对应分组的用例

#运行pytest用例
if__name__ == '__main__':
    pytest.main(['-vs','-n=2','--reruns=2','--html=./report.html'])#输出详细运行、调试信息,以2个线程运行,失败用例最多重跑2次,生成名为report.html的测试报告

2、实际工作中使用pytest.ini的配置文件来配置运行

pytest.ini如下:

[pytest]
addopts = -vs#addopts 用于配置执行命令
testpaths = ./testcase# testpaths 用于配置用例位置
python_files= Test_*.py #用于改变文件名的默认规则
python_classes = Test* #用于改变类名的默认规则
python_functions = test_* #用于改变用例名的默认规则
markers = ababa:maoyan #对用例进行分组 配合标记@pytest.mark.ababa 使用

前后置夹具,conftest.py

setup/teardown 在每个用例之前和之后执行一次

setup_class/teardown_class 在每个类之前和之后执行一次

实现部分前置:

@pytest.fixtrue

@pytest.fixtrue(scope=“作用域”,params=“数据驱动”,autouse=“自动执行”,ids=“自定义参数名”,name=“重命名”)

作用域:function、class、module、package/session

yield前为前置,yield后为后置

@pytest.fixtrue()通常和conftest.py文件一起使用

conftest.py名称是固定的,功能如下:

  1. conftest.py文件能够单独存放@pytest.fixtrue()的一些方法,用处是可以在多个py文件之间共享前置后置
  2. conftest.py里面的方法在调用时不需要导入,可以直接使用
  3. conftest.py可以有多个,也可以有多个不同层级

接口自动化框架封装

  1. 统一请求方式——使用request()方法统一代替post、get等方法

  2. 接口关联的封装——通过一个关联的yaml文件(.yml)来实现

    1. 在根目录下新建extract.yml

    2. 在common文件夹下新建yaml_util.py,见下:

    3. import os
      class YamlUtil:
          #读取extract.yml文件
          def read_exxtract_yaml(self,key):
              with open(os.getcwd()+"/extract.yml",mode='r',encoding='uft-8') as f:
                  value = yaml.load(strean=f,Loader=yaml.FullLoader)
                  return value[key]
              
          #写入extract.yml文件
          def write_extract_yaml(self,data):
              with open(os.getcwd()+"/extract.yml",mode='a',encoding='uft-8') as f:
                  yaml.dump(data=data,stream=f,allow_unicode=True)
                  
           #写入extract.yml文件
          def clear_extract_yaml(self):
              with open(os.getcwd()+"/extract.yml",mode='a',encoding='uft-8') as f:
                  f.truncate()	
      
    4. pytest接口断言——assert

    5. pytest结合allure-pytest生成allure测试报告

      1. 官网下载allure——放到没有中文的路径下,然后把bin目录配置到环境变量的path里面
      2. 重启pycharm——通过allure --version验证是否能够正常使用
      3. 执行命令
        1. 在temp文件夹下生成son格式的临时文件报告—— --alluredir ./temp
        2. 通过临时的json格式文件在reports文件夹下生成allure报告——os.system(“allure generate temp -o reports --clean”)
      4. allure报告的定制化

三、集成篇

接口自动化测试框架YAML数据驱动的封装

@pytest.mark.parametrize(args_name,args_value)

args_name:参数名

args_value:参数值(可以是list、tuple、字典列表、字典元组等)在数据中有多少个值,那么接口用例就会执行多少次

import pytest

class TestApi:
    #基础用法
    @pytest.mark.parametrize('args',['baili','xuance','ali'])
    def test_api1(self,args):
        print(args)
        
    #解包用法    
    @pytest.mark.parametrize('name,age',[['baili',13],['xuance',12],['ali',14]])
    def test_api2(self,name,age):
        print(name,age)
        
if __name__ == '__main__':
    pytest.main(['test_api.py'])

YAML详解

YAML也是一种数据格式,主要作用如下:

  • 用于全局配置文件:环境、数据库信息、账号信息、日志格式、报告名称
  • 用于接口自动化里面的多一些复杂的多接口串联
  • 用于编写接口测试用例

YAML语法规则:

  • 区分大小写
  • 和python一样也是通过缩进的方式表示层级关系(不同的是不能使用tab缩进,只能使用空格)
  • 和缩进多少层无关,只和左边是否对齐有关系
  • #表示注释

数据组成方式:

  • map对象:键值对

    name: xie
    
  • 列表,用-开头的格式

    - name1: xie
    - name2: yang
    - name3: yi
    
  • 二者结合

    -
    	name:获得统一的鉴权码token
    	request:
    		method:get
    		url:https://
    		data:
    			grant_type:client_credential
    			appid:wx21321321
    			secret:e339adk234123
    	validate:None
    

统一接口请求封装

将get、post方法等全部封装成同一方法,由传参决定请求方法

多种断言方式

多接口的场景串联

日志监控

包括日志文件生成 、控制台调试日志、邮件日志


版权声明:本文为qq_45055351原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>