简介
- pytest是一个非常成熟的单元框架
- pytest可以和其他框架整合,例如requests,httprunner
- pytest可以实现测试用例跳过、失败重跑
- pytest可以和allure生成非常美观的测试报告
- pytest可以和jenkins持续集成
- pytest有非常强大的插件,并且你这些插件能实现很多的实用的操作
安装
pip install pytest
pytest-xdist 测试用例分布式执行,多cpu并发
pytest-ordering 用于改变测试用例的执行顺序
pytest-rerunfailures 用于失败重跑
allure-pytest 用于生成美观的测试报告
断言
assert True # 为true
assert not 1 != 1 # 为 False
assert 1 != 2
assert not False
a = [1, 2, 3, 4]
assert 1 in a # 是否包含
assert "1" in "2313"
前后置处理之setup/teardowm,setup_class/teardown_class
import pytest
class Test1:
def setup(self):
print("每个用例前执行一次")
def teardown(self):
print("每个用例后执行一次")
def setup_class(self):
print("每个类前执行一次")
def teardown_class(self):
print("每个类后执行一次")
def test_001(self):
print("用例1")
fixture特性
pytest fixture是Pytest测试框架中的一个特性,它可以在测试函数执行前或执行后自动执行一段代码,
并将其返回值传递给测试函数。pytest fixture的主要特性包括:
- 自动执行:pytest fixture可以自动执行一段代码,无需手动调用。
- 作用域:pytest fixture可以定义不同的作用域,包括函数级别、模块级别、类级别和会话级别。不
同作用域的fixture在不同的测试函数中的执行次数和执行时间也不同。
@pytest.fixture(scope="session") # 只执行一次
@pytest.fixture(scope="module") # 只执行一次
注解
跳过单元测试
@pytest.mark.skip # 跳过某个单元测试
参数化
@pytest.mark.parametrize("username",['admin','张三','admin'])
def test1(username):
print(username)
#多参数 集合(元组/集合/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'
}]
@pytest.mark.parametrize('param', test_data, ids=[data.get('case') for data in test_data]) #ids为测试用例名称
def test4(param):
usr = param.get('usr')
psw = param.get('psw')
print(f'usr: {usr} , psw: {psw}')
失败重试
pip install pytest-rerunfailures
@pytest.mark.flaky(reruns=3) #失败最大试3次
@pytest.mark.flaky(reruns=3,reruns_delay=2) #失败最大3次 ,每次延迟2秒执行
conftest.py 配置
pytest会默认读取conftest.py里面的所有fixture
conftest.py 文件名称是固定的,不能改动
不同目录可以有自己的conftest.py,一个项目中可以有多个conftest.py
测试用例文件中不需要手动import conftest.py,pytest会自动查找
def pytest_collection_modifyitems(items):
"""
该方法解决
"""
# 解决运行结果乱码问题
for item in items:
item.name = item.name.encode('UTF-8').decode('unicode-escape')
item._nodeid = item.nodeid.encode('UTF-8').decode('unicode-escape')