百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python之Pytest测试框架

off999 2025-05-21 15:45 39 浏览 0 评论

前言:

和大家简单介绍一下如何利用Python的Pytest测试框架来进行UI、接口测试,更多学习内容和资料可以查看:


https://docs.qq.com/doc/DWmxXaVdLUlVyTkZL

1 pytest安装

pip install pytest
复制

  1. pytest是一个非常成熟的单元框架
  2. pytest可以和其他框架整合,例如requests,httprunner
  3. pytest可以实现测试用例跳过、失败重跑
  4. pytest可以和allure生成非常美观的测试报告
  5. pytest可以和jenkins持续集成
  6. pytest有非常强大的插件,并且你这些插件能实现很多的实用的操作

pytest-xdist 测试用例分布式执行,多cpu并发
pytest-ordering 用于改变测试用例的执行顺序
pytest-rerunfailures 用于失败重跑
allure-pytest 用于生成美观的测试报告
复制

2 规范

用Pytest写用例时候,一定要按照下面的规则去写,否则不符合规则的测试用例是不会执行的
1.测试方法必须以test开头
2.测试类必须以Test开头,并且不能有init方法
复制

class TestClass:
def test_one(self):
x = "this"
assert "h" in x
def test_two(self):
x = "hello"
assert "h" in x
def two(self):
x = "hello"
assert "0" in x
复制

3 断言支持

assert xx :判断 xx 为真
assert not xx :判断 xx 不为真
assert a in b :判断 b 包含 a
assert a == b :判断 a 等于 b
assert a != b :判断 a 不等于 b
复制

assert dict["code"]=='0'
assert response.json()['message']=='success'
复制

@pytest.mark.skip 跳过某个单元测试
复制

4 参数化支持(重点)

@pytest.mark.parametrize("username",['admin','张三','admin'])
def test1(username):
print(username)
复制

参数化中文乱码支持 根目录新建conftest.py

def
pytest_collection_modifyitems(items):

"""
该方法解决
"""
for item in items:
item.name = item.name.encode("utf-8").decode("unicode_escape")
item._nodeid = item.nodeid.split('::')[0] +'::'+ item.nodeid.split('::')[1].encode("utf-8").decode("unicode_escape")
复制

pytest会默认读取conftest.py里面的所有fixture
conftest.py 文件名称是固定的,不能改动
不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py
测试用例文件中不需要手动import conftest.py,pytest会自动查找
复制

#多参数 集合(元组/集合/set)
@pytest.mark.parametrize("username,pwd",[('admin','123456'),('test1','123')])
def test2(username,pwd):
print(username,pwd)
@pytest.mark.parametrize("username,pwd",[['admin', '123456'], ['test1', '123456']])
def test3(username,pwd):
print(username,pwd)

复制

集合(字典)

test_data = [
{
'case': '登入成功',
'usr': 'admin', # 正常登入
'psw': '123456'
},
{
'case': '账号不存在',
'usr': 'admin1', # 账号不存在
'psw': '123456'
},
{
'case': '密码错误',
'usr': 'admin', # 密码错误
'psw': '12345'
},
{
'case': '账号或密码为空',
'usr': '', # 账号或密码为空
'psw': ''
},
]
@pytest.mark.parametrize('param', test_data)
def test4(param):
usr = param.get('usr')
psw = param.get('psw')
print(f'usr: {usr} , psw: {psw}')
复制

ids 优化结果提示

@pytest.mark.parametrize('param', test_data, ids=[data.get('case') for data in test_data])
def test4(param):
usr = param.get('usr')
psw = param.get('psw')
print(f'usr: {usr} , psw: {psw}')
复制

[data.get('case') for data in test_data] 是推导式
复制

推导式是Python的一种独有特性。是Python的可以从一个数据序列构建另一个新的数据序列的结构体

不用推导式

list=[]
for item in test_data:
list.append(item['case'])
复制

多层嵌套结构

# 笛卡尔积,组合数据
data_1 = [1, 2, 3]
data_2 = ['x', 'y']
@pytest.mark.parametrize('a', data_1)
@pytest.mark.parametrize('b', data_2)
def test_parametrize_1(a, b):
print(f'笛卡尔积 测试数据为 : {a},{b}')
复制

5 参数化csv整合

id.csv

id,message
1,success
3,success
4,success
5,success
6,success
7,success
-1,skuId不合法
复制

path =os.path.join(get_project_path(),"files","id.csv")
#list
def get_csv_data1():
list=[]
with open(path, encoding="utf-8") as f:
csv_reader = csv.reader(f)
next(csv_reader)
for line in csv_reader:
list.append(line)
return list
@pytest.mark.parametrize('id,message', get_csv_data1())
def test_Get1(id,message):
url=host+"/pinter/com/getSku?id="+id
@pytest.mark.parametrize('id,message', csv_list,ids=[i[0] for i in csv_list])
#字典类型
def get_csv_data2():
list=[]
with open(path, encoding="utf-8") as f:
csv_reader = csv.DictReader(f)
for line in csv_reader:
list.append(line)
return list
@pytest.mark.parametrize('dic', get_csv_data2())
def test_Get2(dic):
print(dic)
....
assert dict["code"]=='0'
assert response.json()['message']=='success'
复制

6 失败重试

平时在做接口测试的时候,经常会遇到网络抖动或者环境问题导致测试用例运行失败,而这个并不是我们想要的结果,我们想要重新运行失败的测试用例

pip install pytest-rerunfailures
pip show pytest-rerunfailures
复制

@pytest.mark.flaky(reruns=3) #失败最大试3次
@pytest.mark.flaky(reruns=3,reruns_delay=2) #失败最大3次 ,每次延迟2秒执行
复制

7 执行顺序插件

pytest执行顺序一般是按照从上往下的顺序执行的,如果使用过程中想要指定顺序,可以使用order标签

pip install pytest-ordering
pip show pytest-ordering
复制

@pytest.mark.run(order=2)
复制

8 报表插件pytest-allure

pip install allure-pytest
pip show allure-pytest

pytest 脚本名称 --alluredir ./report

解析 report

需要
allure-commandline-2.13.3.zip 工具

mac

https://blog.csdn.net/u014015919/article/details/90292041

allure --version

allure serve report

单独main方法运行 (需要单独建py文件)

pytest.main(['-s','test_allure02.py','--clean-alluredir','--alluredir=allure-results'])
os.system(r"allure generate -c -o allure-report")
复制

-q: 安静模式, 不输出环境信息

-s: 详细打印

-v: 更丰富信息模式, 输出更详细的用例执行信息

8.1 allure扩展注解(了解)

@allure.parent_suite,@allure.suite,@allure.sub_suite对应的是
1,2,3级目录

@allure.parent_suite('我是parent_suite')
@allure.suite('我是suite')
@allure.sub_suite('我是sub_suite')

@allure.feature('测试参数化')
@allure.id('我是id')
@allure.title('我是title')
@allure.link('https://www.baidu.com/', LinkType.LINK, '我是link')
@allure.label('我是label')
@allure.issue('https://www.baidu.com/', '我是issue')
@allure.description('我是description')
@allure.severity('我是severity')

9 并行执行

多进程

pip install pytest-xdis

模拟1000测试用例

data_1 = [x for x in range(10)]
data_2 = [x for x in range(100)]
@pytest.mark.parametrize('a', data_1)
@pytest.mark.parametrize('b', data_2)
def test_parametrize_1(a, b):
#sleep(0.01)
print(f'笛卡尔积 测试数据为 : {a},{b}')
复制

10 fixture特性

@pytest.fixture()
def get_token():
url = host +'/pinter/bank/api/login2'
#表单参数
data = {
'userName':'admin',
'password':'1234'
}
resp = requests.post(url=url,data=data)
resp_json = resp.json()
print(resp_json)
token = jsonpath.jsonpath(resp_json, '$.data')[0] # 使用jsonpath从响应结果中提取
return token
def test_query2(get_token):
url = host + '/pinter/bank/api/query2?userName=admin' # 接口地址
headers = {
'testfan-token':get_token
}
resp = requests.get(url=url,headers=headers)
status_code = resp.status_code #获取响应状态码
print('响应状态码:{}'.format(status_code))
text = resp.text #获取响应内容,结果类型是字符串
print('响应内容:{}'.format(text))
复制

相关推荐

qq找回删除好友(找回qq被删除的好友)
  • qq找回删除好友(找回qq被删除的好友)
  • qq找回删除好友(找回qq被删除的好友)
  • qq找回删除好友(找回qq被删除的好友)
  • qq找回删除好友(找回qq被删除的好友)
win10设置了不休眠仍休眠(win10电脑设置不休眠为什么还是会休眠)

win10设置了永不休眠还是休眠可能是设置错误导致的,解决方法如下1,打开任务计划程序,在操作里选择创建基本任务。2,第一步页面是让你写个你的任务名称,这个随意。3,点下一步后会来到触发器页面,在这里...

电脑底部任务栏卡死(电脑底部任务栏卡死是什么原因)

1、首先,先打开控制面板找到系统和安全点击进入:2、然后,在点击系统和安全中的系统进入:3、之后,在系统中靠左边的菜单中找到高级系统设置点击进入:4、然后在系统属性中找到性能并单击鼠标左键进入设置:5...

随身wifi怎么设置不让别人蹭网

1.设置更复杂的密码加密是防蹭网的主要途径,一定要在配置路由器的无线网络时,在“无线网络安全设置”选项中,开启WPA-PSK/WPA2-PSK加密功能,并设置较复杂的密码(数字字母符号的组合最好),而...

以太网驱动程序下载(以太网驱动下载 win7官网)

请更新以太网驱动!可以安装其原装的驱动程序!或用驱动之家或驱动精灵更新驱动!以太网的驱动名称是EthernetDriver。以太网驱动是计算机操作系统中的一个软件程序,用于控制和管理计算机与以太网之...

新主板怎么装系统(新主板装机设置教程)

我从网上搜的教程,试了下可以装,大家可以试一试可以使用u盘启动盘重装系统的方式来安装新系统,具体的步骤如下:1、先在一台能用的电脑上安装咔咔装机一键重装系统工具,插入一个8GB以上的空白U盘,...

为什么电脑突然少了dll文件(电脑缺失各种dll文件是什么原因)

DLL文件丢失通常是由以下原因引起的:病毒或恶意软件感染:病毒或恶意软件可能会删除系统中的一些DLL文件,导致程序无法正常工作。软件安装或卸载不当:在安装或卸载某些软件时,可能会误删系统中的一些DLL...

win10去掉桌面图标小箭头(win10如何去掉桌面图标的小箭头)

1、首先开始图标右键找到运行或者按快捷键Win+R;   2、打开“运行”窗口后,输入“regedit”,确认会弹出注册表编辑器;  &...

2014版本cad序列号及密码(2014年cad序列号)

序列号:356-72378422,密钥:001F1AutoCAD2014需要本地注册运行,别人无法帮你算出受人以鱼不如受人以渔要关闭杀毒软件和助手(切记:如果是Vista或windows7系统,请务必...

gho文件浏览工具(打开gho文件)

利用GHO文件浏览工具即可在电脑上打开GHO文件,具体操作请参照以下步骤。1、打开浏览器搜索【GHO文件浏览工具】,打开链接下载好软件安装包,安装到电脑上。2、在电脑上打开软件之后,就会出现【Ghos...

三星 官网(三星 官网免费查询)

答:三星官网售后服务官网:http://support-cn.samsung.com/support/ServiceLocations.asp国家工信部电信设备进网管理网站查询移动设备真伪方式:方法一...

win8为什么不流行(为什么没有win8系统)

win8系统好用  1、更美观:  win8比win7以及XP更美观方便,开始界面能直接打开运行App程序。win8系统主要是为了让平板电脑用户使用效果更加友好,更加人性化,所以界面以metro界面为...

装完系统的u盘如何还原(装了系统盘的u盘怎么恢复)

u盘重装系统恢复原样方法如下1、直接把U盘格式化:另外再找一台电脑,插入U盘,电脑能识别就直接格式化。2、如果U盘在别的电脑无法识别,那么解决办法是:把U盘插入电脑,然后运行ultraISO,再点击...

手机如何注册邮箱账号(怎么样手机注册邮箱)
  • 手机如何注册邮箱账号(怎么样手机注册邮箱)
  • 手机如何注册邮箱账号(怎么样手机注册邮箱)
  • 手机如何注册邮箱账号(怎么样手机注册邮箱)
  • 手机如何注册邮箱账号(怎么样手机注册邮箱)
服务器系统安装驱动(服务器系统安装驱动怎么安装)

首先根据网卡的型号到主板的官方或是主板的驱动盘上找一下,应该可以找到对应的linux驱动。1确认系统的内核版本[root@localhost~]#uname-r2.6.18-8.el5PAE我的内核版...

取消回复欢迎 发表评论: