Python接口自动化学习

接口自动化

基于代码的接口自动化,持续整理中

需要了解掌握的技能如下:

Pytho+Requests+Yaml+Pytest+-Allure+Logging+热加载+Jenkins持续集成接口自动化

Requests模块

用于发送Http请求以及接口http响应的python的第三方库

安装命令如下: pip install requests

解析requests底层原理:

requests一般常见使用方法如下:

def get(url, params=None,**kwargs ):
def post(url, data=None,json=None,**kwargs ):
def put(url,data=None,**kwargs ):
def delete(url,**kwargs ):
  
def request(method,url,**kwargs):  是get,post,put,delete统一调用的方法
def session():会话,登陆和退出就是一个会话
session对象的request方法   session对象能够自动关联Cookie

具体解析def request()方法

def request(self, method, url,
            params=None, data=None, headers=None, cookies=None, files=None,
            auth=None, timeout=None, allow_redirects=True, proxies=None,
            hooks=None, stream=None, verify=None, cert=None, json=None):
参数具体如下:
method         请求方式
url            请求路径
params=None    get请求传参
data=None      post或put请求传参
json=None      post请求传参
headers=None   请求头
cookies=None   Cookie信息
files=None     文件上传
auth=None      鉴权
timeout=None   超时处理
allow_redirects=True  是否允许重定向
proxies=None   代理
hooks=None     钩子
stream=None    文件下载
verify=None    证书验证
cert=None      CA证书

调用request()方法后,输出结果有如下几类:

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

以下代码举例简单应用:

import pytest
import requests

class TestApi:
    access_token = ""   #类变量,也可理解类似为全局变量

def test_get_token(self):    #获取鉴权码
  url = "请求地址"
  datas = {"请求数据"}
  res=requests.get(url=url,params=datas)  #get请求
  result = res.json()
  TestApi.access_token = result[ "access_token"]  #此处获取access_token方便后面调用
  print(res.json())

def test_edit_flag(self):  
  url="请求地址" + TestApi.access_token  #此处需要用到access_token,因此需调用类变量access_token = "" 数据
  datas = {"请求数据"}
  res = requests.post(url=url,json=datas)  #post请求
  print (res.json())

def test_file_upload(self): #文件上传
  url="请求地址"+TestApi.access_token
  datas ={"media" : open("文件路径" , mode="rb")}
  res = requests.post(url=url,files=datas)
  print(res.json())

if __name__ == '__main__':  
    pytest.main([ '-vs'])  #入口,执行所有用例,并打印

Pytest模块

pytest是一个非常成熟的python用例测试框架(单元测试框架),它可以和很多的工具或框架,selenlum,requests,applum实现多种自动化测试。

它可以和allure结合生成美观的报告以及和jenkins实现持续集成.

默认测试用例的规则:

1.模块名(py文件)必须以test_开头或_test结尾。

2类名必须Test开头

3.用例名必须以test_开头

json是字典的字符串的格式,两种可以相互转换

作用:

1.发现用例:根据每个框架默认的规则去发现并且加载测试用例

2.执行用例:将测试用例按照一定的顺序和条件执行,并生成结果

3.判断结果:通过断言来判断实际结果和预期结果是否相同

4.生成报告:统计测试进度,耗时,通过率,生成报告。

1.插件安装

pytest最重要的是它有很多插件:

pytest
pytest-html          生成html测试报告
pytest-xdist          多线程运行
pytest-ordering      改变测试用例的执行顺序
pytest-rerunfailures  失败用例重跑
pytest-base-url      管理基础路径
allure-pytest        生成allure测试报告

一般实际项目开发当中都会使用requrements.txt文件保存插件名称,并通过: pip install -r requrements.txt安装所有插件

2.测试用例前后置-fixture固件

@pytest.fixtrue()一般会和conftest.py文件一起使用,conftest.py名称是固定的,功能很强大

1.conftest.py文件是单独存放@pytest.fixtrue()的方法。用处是可以在多个py文件之间共享前置配置

2.conftest.py里面的方法在调用时不需要导入,可以直接使用

3.conftest.py可以有多个。也可以有多个不同层级

装饰器:
@pytest.fixture(scope="",params=""autouse="",ids="",name="")
scope:作用域
           function(函数。用例,默认)
           class   类
           module  模块
           package/session   会话
           params: 数据驱动
autouse:自动作用还是手动作用
ids:当数据驱动时更改参数名
name:fixture的别名

scope表示的是被@pytest.fixture标记的方法的作用域。function(默认),class,module,package/session
如果生效范围:scope=“session”,那么,在该目录下的所有的测试用例只会执行一次
如果生效范围:scope=“module”那么,在该目录下的每个py文件会执行一次
如果生效范围:scope=“class”那么,在该目录下的每个类会执行一次
如果生效范围:scope=“function”那么,在该目录下的每个测试函数会执行一次

案例

import pytest
@pytest.fixture(scope="function" ,autouse=True)  #可将部分用例前置,那个需要前置就放那个函数中
def assert_exe():
  print('测试用例执行前')
  yield 
  print('测试用例执行后')

@pytest.fixture(scope="session",autouse=True)  #用于会话
def clear_yaml():
    YamlUtil().clear_extract_yaml()

3.Yaml模块

yaml简介

yaml是一种数据类型,它可以和json之间灵活的切换,支持:注释,换行,字符串,裸字符串等

用途:

1.配置文件

2.编写测试用例数据结构:

1.Map对象 (dict) (键:(空格)值) 如: name: 3

⒉.数组(Ilist) 用一组横线"-" 开头来表示如:

- name1: 哈哈

- name2: 嘿嘿

- name3: 呵呵

3.1yaml文件动态参数

在接口自动化中,也可以使用 YAML 文件的动态参数来实现变量化配置。具体实现方法如下:

1. 在 YAML 文件中定义动态参数。如config.yaml中动态参数如下

# 定义动态参数
base_url: ${BASE_URL}
username: ${USERNAME}
password: ${PASSWORD}

2. 在代码中读取 YAML 文件并解析动态参数。

import yaml

# 读取 YAML 文件
with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

# 解析动态参数
base_url = config['base_url'].format(BASE_URL=input_base_url)
username = config['username'].format(USERNAME=input_username)
password = config['password'].format(PASSWORD=input_password)

#其中,`input_base_url`、`input_username` 和 `input_password` 是根据实际情况设置的变量,代表要请求的基础 URL、用户名和密码。

3. 在测试用例中使用解析后的参数。在测试用例test.py中举例如下

import requests 

# 发送请求
response = requests.post(
    url=base_url + '/login',
    data={
        'username': username,
        'password': password
    }
)

# 断言响应结果
assert response.status_code == 200
assert '登录成功' in response.text


通过上述方法,就可以方便地在接口自动化中使用 YAML 文件的动态参数来进行变量化配置。这样可以让测试用例更加灵活、可维护。

Pytest框架封装

举一个案例说明:

Ⅰ一个测试案例用Test开头,如截图中的TestYhzx

Ⅱ一个案例中用如下文件搭配结合组成一个框架,框架中的内容介绍如下:

api: 这是一个package,用来各个接口的类封装,按照你的业务可以将其分为多个package

common: 这是一个package,用来封装底层公共方法,比如requests库封装、文件操作封

装、加解密封装、redis封装、数据库封装、随机数据封装、日志封装

testcases: 这是一个package,用来编写封装我们的测试用例

confifig: 这是一个目录,用来存放基本的配置信息,比如数据库、redis、各个服务域名、各个

环境的配置

data:这是一个目录,用来存放测试用例数据

logs: 这是一个目录,用来存放收集到的日志文件

report: 这是一个目录,用来存放测试结果数据以及生成的测试报告

conftest.py: 用来重写pytest自带的一些钩子函数以及自定义的fifixture

pytest.ini: pytest的基本配置文件

run.py: 框架整体的统一执行入口

全部评论
求源码
点赞 回复 分享
发布于 2023-06-10 13:50 甘肃

相关推荐

MGlory:我当初有一个老师告诉我简历要写的简单,最好只一面,项目可以写核心的,进面了自然会问你的
点赞 评论 收藏
分享
刘湘_passion:出国旅游?那就小心你的腰子咯
点赞 评论 收藏
分享
求面试求offer啊啊啊啊:1600一个月?
点赞 评论 收藏
分享
评论
3
12
分享

创作者周榜

更多
牛客网
牛客企业服务