全csdn最全最详细的Pytest自动化测试框架实战,封神级讲解_pytest资料(4)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

def add(a,b):
return a+b

@pytest.mark.parametrize(‘a,b,expect’,[
[1,1,2],
[2,2,4],
[3,3,6],
[4,4,8],
[5,5,10]
])
def test_add_list(a,b,expect):
assert add(a,b)==expect

@pytest.mark.parametrize(‘a,b,expect’,[
(1,1,2),
(2,2,4),
(3,3,6),
(4,4,8),
(5,5,10)
])
def test_add_tuple(a,b,expect):
assert add(a,b)==expect

@pytest.mark.parametrize(‘data’,[
{‘a’:1,‘b’:1,‘expect’:2},
{‘a’:5,‘b’:5,‘expect’:10}
])
def test_add_dict(data):
assert add(data[‘a’],data[‘b’])==data[‘expect’]

if name == ‘main’:
pytest.main([“-s”,“-v”,“test_one.py”])


执行后的结果信息如下:


![图片](https://img-blog.csdnimg.cn/img_convert/b45a16ac632aad881cc0e09559e41b6a.png)


在如上的结果信息中,可以看到真正实现测试用例的代码是很少的,而且把参数化使用到的数据分离到不同的数据类型中。


## 2.APL


      下面结合API的测试场景来考虑,被测试的API的代码如下:



#!/usr/bin/env python
#!coding:utf-8
from flask import Flask,jsonify
from flask_restful import Api,Resource,reqparse

app=Flask(name)
api=Api(app)

class LoginView(Resource):
def get(self):
return {‘status’:0,‘msg’:‘ok’,‘data’:‘this is a login page’}

def post(self):
parser=reqparse.RequestParser()
parser.add_argument(‘username’, type=str, required=True, help=‘用户名不能为空’)
parser.add_argument(‘password’,type=str,required=True,help=‘账户密码不能为空’)
parser.add_argument(‘age’,type=int,help=‘年龄必须为正正数’)
parser.add_argument(‘sex’,type=str,help=‘性别只能是男或者女’,choices=[‘女’,‘男’])
args=parser.parse_args()
return jsonify(args)

api.add_resource(LoginView,‘/login’,endpoint=‘login’)

if name == ‘main’:
app.run(debug=True)


在基于[API测试维度]( )的思想,针对该接口测试我们不考虑接口的安全性,高并发以及它的稳定性方面,单纯的只是从功能层面来考虑进行测试,那么需要针对每个参数是否缺少都得需要进行验证,就会涉及到五个测试用例的设计,我们把数据分别分离到主流的文件中,文件的格式主要为JSON,Yaml,Excel和CSV的文件,先来看分离到JSON的文件内容:



{
“item”:
[
{
“request”:
{
“url”: “http://localhost:5000/login”,
“body”:
{
“password”:“admin”,
“sex”:“男”,
“age”:18
}
},
“response”:
[
{
“message”:
{
“username”: “用户名不能为空”
}
}
]
},
{
“request”:
{
“url”: “http://localhost:5000/login”,
“body”:
{
“username”:“wuya”,
“sex”:“男”,
“age”:18
}
},
“response”:
[
{
“message”:
{
“password”: “账户密码不能为空”
}
}
]
},
{
“request”:
{
“url”: “http://localhost:5000/login”,
“body”:
{
“username”:“wuya”,
“password”:“admin”,
“sex”:“asdf”,
“age”:18
}
},
“response”:
[
{
“message”:
{
“sex”: “性别只能是男或者女”
}
}
]
},
{
“request”:
{
“url”: “http://localhost:5000/login”,
“body”:
{
“username”:“wuya”,
“password”:“admin”,
“sex”:“男”,
“age”:“rrest”
}
},
“response”:
[
{
“message”:
{
“age”: “年龄必须为正正数”
}
}
]
},
{
“request”:
{
“url”: “http://localhost:5000/login”,
“body”:
{
“username”:“wuya”,
“password”:“admin”,
“sex”:“男”,
“age”:“18”
}
},
“response”:
[
{
“age”: 18,
“password”: “admin”,
“sex”: “男”,
“username”: “wuya”
}
]
}
]
}


涉及到的测试代码为:



#!/usr/bin/env python
#!coding:utf-8
import pytest
import requests
import json

def readJson():
return json.load(open(‘login.json’,‘r’))[‘item’]

@pytest.mark.parametrize(‘data’,readJson())
def test_json_login(data):
r=requests.post(
url=data[‘request’][‘url’],
json=data[‘request’][‘body’])
assert r.json()==data[‘response’][0]

if name == ‘main’:
pytest.main([“-s”,“-v”,“test_json_login.py”])


## 3.yaml文件


再来看分离到Yaml文件的数据:




#用户名请求为空
“url”: “http://localhost:5000/login”
“body”: ‘{
“password”:“admin”,
“sex”:“男”,
“age”:18
}’
“expect”: ‘{
“message”: {
“username”: “用户名不能为空”
}
}’

#密码参数为空
“url”: “http://localhost:5000/login”
“body”: ‘{
“username”:“admin”,
“sex”:“男”,
“age”:18
}’
“expect”: ‘{
“message”: {
“password”: “账户密码不能为空”
}
}’

#校验性别参数的验证
“url”: “http://localhost:5000/login”
“body”: ‘{
“username”:“wuya”,
“password”:“admin”,
“sex”:“asdf”,
“age”:18
}’
expect: ‘{
“message”: {
“sex”: “性别只能是男或者女”
}
}’

#校验年龄是否是正整数
“url”: “http://localhost:5000/login”
“body”: ‘{
“username”:“wuya”,
“password”:“admin”,
“sex”:“男”,
“age”:“rrest”
}’
“expect”: ‘{
“message”: {
“age”: “年龄必须为正正数”
}
}’

#登录成功
“url”: “http://localhost:5000/login”
“body”: ‘{
“username”:“wuya”,
“password”:“admin”,
“sex”:“男”,
“age”:“18”
}’
“expect”: ‘{
“age”: 18,
“password”: “admin”,
“sex”: “男”,
“username”: “wuya”
}’


涉及到的测试代码为:



#!/usr/bin/env python
#!coding:utf-8
import pytest
import requests
import yaml

def readYaml():
with open(‘login.yaml’,‘r’) as f:
return list(yaml.safe_load_all(f))

@pytest.mark.parametrize(‘data’,readYaml())
def test_login(data):
r=requests.post(
url=data[‘url’],
json=json.loads(data[‘body’]))
assert r.json()==json.loads(data[‘expect’])


## 4.CSV


分离到CSV的文件内容为:


![图片](https://img-blog.csdnimg.cn/img_convert/584ef550726c86f39ee91d952ddab317.png)


涉及到的测试代码为:



#!/usr/bin/env python
#!coding:utf-8
import pytest
import requests
import csv

def readCsv():
data=list()
with open(‘login.csv’,‘r’) as f:
reader=csv.reader(f)
next(reader)
for item in reader:
data.append(item)
return data

@pytest.mark.parametrize(‘data’,readCsv())
def test_csv_login(data):
r=requests.post(
url=data[0],
json=json.loads(data[1]))
assert r.json()==json.loads(data[2])

最后来看分离到Excel的文件内容:


![图片](https://img-blog.csdnimg.cn/img_convert/ac9a32ba5d001a3d5d927cd974f7e293.png)


涉及到的测试代码为:



#!/usr/bin/env python
#!coding:utf-8
import pytest
import requests
import xlrd

def readExcel():
data=list()
book=xlrd.open_workbook(‘login.xls’)
sheet=book.sheet_by_index(0)
for item in range(1,sheet.nrows):
data.append(sheet.row_values(item))
return data

@pytest.mark.parametrize(‘data’,readExcel())
def test_excel_login(data):
r=requests.post(
url=data[0],
json=json.loads(data[1]))
assert r.json()==json.loads(data[2])


其实我们发现套路都是一样的,不管把数据分离到什么样的数据格式下,都得符合它的本质思想,也就是参数化的本质是对列表中的对象进行循环赋值,把握住这样的一个思想就可以了。整合上面的所有代码,完整代码为:



#!/usr/bin/env python
#!coding:utf-8
import pytest
import requests
import json
import yaml
import csv
import xlrd

def readJson():
return json.load(open(‘login.json’,‘r’))[‘item’]

def readYaml():
with open(‘login.yaml’,‘r’) as f:
return list(yaml.safe_load_all(f))

def readCsv():
data=list()
with open(‘login.csv’,‘r’) as f:
reader=csv.reader(f)
next(reader)
for item in reader:
data.append(item)
return data

def readExcel():
data=list()
book=xlrd.open_workbook(‘login.xls’)
sheet=book.sheet_by_index(0)
for item in range(1,sheet.nrows):
data.append(sheet.row_values(item))
return data

@pytest.mark.parametrize(‘data’,readJson())
def test_json_login(data):
r=requests.post(
url=data[‘request’][‘url’],
json=data[‘request’][‘body’])
assert r.json()==data[‘response’][0]

@pytest.mark.parametrize(‘data’,readYaml())
def test_yaml_login(data):
r=requests.post(

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

r.json()==data[‘response’][0]

@pytest.mark.parametrize(‘data’,readYaml())
def test_yaml_login(data):
r=requests.post(

[外链图片转存中…(img-FPeQFK6w-1715304085898)]
[外链图片转存中…(img-LbSrxFGH-1715304085898)]
[外链图片转存中…(img-rVXLGZS3-1715304085899)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值