pytest框架 基本使用
基本使⽤
测试函数形式
"""测试函数"""
def test_func(): # 要求函数名以 test 开头
print('我是测试函数')
运行方式(命令)
pytest -s 文件名
测试类方法
class TestDemo(object): # 类名以Test开头
def test_fun1(self): # 方法名test开头
print("测试1")
def test_fun2(self):
print("测试2")
主函数执行方式
说明: 使⽤主函数, 可以实现在代码⽂件内, ⿏标右键菜单执⾏
使用案例
import pytest
def test_fun(): # 函数名以 test开头
print("测试函数")
class TestDemo(object): # 类名以Test开头
def test_fun1(self): # 方法名test开头
print("测试1")
def test_fun2(self):
print("测试2")
if __name__ == '__main__':
# 第一个为运行参数,第二个参数为文件名
pytest.main(["-s", "03_主函数运行方式.py"])
特殊方法
函数级别
说明: 函数级别特殊⽅法的执⾏逻辑与 UnitTest 中的 Fixture 的⽅法级别的执⾏逻辑⼀致!
import pytest
class TestDemo(object):
def setup(self):
print("函数开始")
def teardown(self):
print("函数结束")
def test_fun1(self):
print("测试函数1")
def test_fun2(self):
print("测试函数1")
if __name__ == '__main__':
# 与测试夹具方法一致 每个函数执行前执行 setup 之后执行teardowm
pytest.main(["-s", "04_特殊方法——函数级别.py"])
类级别
说明: 类级别特殊⽅法的执⾏逻辑与 UnitTest 中的 Fixture 的类级别的执⾏逻辑⼀致!
import pytest
class TestDemo(object):
def setup_class(self):
print("类开始")
def teardown_class(self):
print("类结束")
def test_fun1(self):
print("测试函数1")
def test_fun2(self):
print("测试函数2")
if __name__ == '__main__':
# 与测试夹具方法一致 所有函数之前执行setup_class 所有类函数之后执行tear_down
pytest.main(["-s", "05_特殊方法——类级别.py"])
pytest配置文件
说明: 使⽤配置⽂件后可以快速的使⽤配置的项来选择执⾏哪些测试模块
注意:
1. 在 Windows 系统下, pytest 配置⽂件中, 不允许写注释信息
2. ⼀个⼯程内只需要⼀个 pytest 配置⽂件, 并且需要保证⽂件名正确
3. ⼀般情况, 只需要将 pytest 配置⽂件, 置于⼯程根⽬录下
4. 配置有 pytest 配置⽂件的⼯程, 只需要打开命令⾏, 输⼊ pytest 指令,
即可执⾏测试
选项字段获取
编写步骤
使⽤步骤
说明: 打开命令⾏ -> 输⼊ pytest -> 执⾏即可
默认设置
说明: 测试⽤例⽂件名/测试类名/测试⽅法名均为 Test/test 开头
[pytest]
testpaths = ./case
addopts = -s
python_files = test*.py
python_classes = Test*
python_functions = test*
⾃定义规则
说明: 测试⽤例⽂件名/测试类名/测试⽅法名, 需要根据具体项⽬进⾏设置, 以下以 Hm/hm
为例
[pytest]
testpaths = ./case
addopts = -s
python_files = hm*.py
python_classes = Hm*
python_functions = hm*
扩展: 指定单个⽂件/类/⽅法执⾏
[pytest]
testpaths = ./case
addopts = -s
python_files = demo_case1.py
python_classes = DemoDemo1
python_functions = demo_method1
pytest 常⽤插件
HTML 报告插件
安装
⽅式1 -> 安装: pip install pytest-htm
使用
1. 在 pytest 配置⽂件中, 增加命令选项
选项: --html=./报告路径/报告⽂件名.html --self-contained-html
说明: --self-contained-html 将 CSS ⽂件内嵌到报告⽂件中
2. 执⾏ pytest 指令, 运⾏测试即可
添加命令选项执⾏
控制⽅法执⾏顺序插件
安装
pip install pytest-ordering
使⽤步骤 说明: 直接在测试类或测试⽅法上⽅添加 @pytest.mark.run(order=序号)
扩展: 序号⽀持正数和负数, 以及正负混合
1. 纯正数: 数越⼩, 优先级越⾼[掌握]
2. 纯负数: 数越⼩, 优先级越⾼[了解]
3. 正负混合: 正数先按照顺序执⾏, 负数最后执⾏[了解]
import pytest
#需要安装 pytest-ordering插件
@pytest.mark.run(order=1)
class TestDemo(object):
@pytest.mark.run(order=3)
def test_fun1(self):
print("测试方法1")
@pytest.mark.run(order=2)
def test_fun2(self):
print("测试方法2")
@pytest.mark.run(order=1)
def test_fun3(self):
print("测试方法3")
# 对类也有效果
@pytest.mark.run(order=0.5)
class TestDemo1(object):
def test_fun4(self):
print("测试方法1-1")
if __name__ == '__main__':
# @pytest.mark.run(order=1)
# 正数数字越小越 先执行
# 负数 越小越先执行
# 正负数混合先执行正数后负数
pytest.main(["-s", "07_控制函数执行顺序——orderring.py"])
运行结果
失败重试插件
安装
pip install pytest-rerunfailures
使用
1. 在 pytest 配置⽂件中, 增加命令选项
选项: --reruns 次数
2. 执⾏ pytest 指令, 运⾏测试即可
pytest ⾼级功能
跳过操作
说明: 对于完成的代码或版本不对应的代码, 可以设置跳过使之不参与测试执⾏。
# 语法: @pytest.mark.skipif(符合的条件, reason='跳过的原因')
# 说明: 如果满⾜条件, 以下⽅法或测试类执⾏跳过, 不执⾏!
# 注意: reason= 不能省略, 否则报错
使用
import pytest
version = 12
class TestDemo(object):
# 需要写上参数 (条件,原因)
@pytest.mark.skipif(version >= 12, reason="版本号太高")
def test_fun1(self):
print("测试函数1")
def test_fun2(self):
print("测试函数2")
# 支持跳过类
@pytest.mark.skipif(version >= 12, reason="版本号太高")
class TestDem2(object):
# 需要写上参数 (条件,原因)
def test_fun1(self):
print("测试函数2-1")
if __name__ == '__main__':
pytest.main(["-s", "09_跳过——skip.py"])
运行结果
参数化
说明: 与 UnitTest 框架不同, pytest 框架⾃带参数化功能, 调⽤对应⽅法并
传⼊数据, 即可完成参数化实现
单个参数
import pytest
class TestDemo(object): # 类名以Test开头
def test_fun1(self): # 方法名test开头
print("测试1")
# 语法: @pytest.mark.parametrize('参数变量', ['数值1', '数值2‘ ...])
@pytest.mark.parametrize("name", ["小米", '小红', '小黄'])
def test_fun2(self, name):
print("测试2", name)
if __name__ == '__main__':
# 第一个为运行参数,第二个参数为文件名
pytest.main(["-s", "10_参数化——单个参数.py"])
多个参数
import pytest
class TestDemo(object): # 类名以Test开头
def test_fun1(self): # 方法名test开头
print("测试1")
# 数据格式必须为[(),()]或者[[],[]]
@pytest.mark.parametrize("name,age", [("小米", 23), ('小黄', 56)])
# 另一种写法
# @pytest.mark.parametrize(("name","age"), [("小米", 23), ('小黄', 56)])
def test_fun2(self, name, age):
print(f"测试2{name},{age}")
if __name__ == '__main__':
# 第一个为运行参数,第二个参数为文件名
pytest.main(["-s", "11_参数化——多个参数.py"])
通过方法引用
import pytest
def bulid_data():
return [("小米", 23), ('小黄', 56)]
class TestDemo(object): # 类名以Test开头
def test_fun1(self): # 方法名test开头
print("测试1")
# 数据格式必须为[(),()]或者[[],[]]
@pytest.mark.parametrize("name,age", bulid_data())
# 另一种写法
# @pytest.mark.parametrize(("name","age"), [("小米", 23), ('小黄', 56)])
def test_fun2(self, name, age):
print(f"测试2{name},{age}")
if __name__ == '__main__':
# 第一个为运行参数,第二个参数为文件名
pytest.main(["-s", "12_参数化——通过方法引入数据.py"])
断言
说明: 与 UnitTest 框架不同的是, pytest 框架使⽤ Python ⾃带的断⾔⽅
法实现断⾔操作的
Python ⾃带的断⾔⽅法
# 语法: assert 表达式
# 说明: 断⾔后接的表达式的结果为 Ture(断⾔通过), 为 False(断⾔失败)
# 预期相等:
assert 1 == 1
# 预期包含:
assert 'admin' in '欢迎 admin 归来!'
pytest 框架中使⽤断⾔
import pytest
def add(a, b):
return a + b
class TestDemo():
def test_fun(self):
result = add(1, 2)
# python自带断言 只有成功与失败两种结果成与失败
assert result == 4
print("断言函数")
if __name__ == '__main__':
pytest.main(["-s", "13_断言——assert.py"])