一、安装环境
使用命令 pip install pytest进行安装
二、命名规则
使用test_或_test来命名文件名称
使用Test*来命名类名称,遵循驼峰命名法,注意:测试类中没有__init__()初始化方法
使用test_*来命名方法名称
三、夹具使用:pytest.fixture()
一、作用域(scope):
作用与主要分为五种:function、class、module、package、session,以下讲解前三个,分别是function、class、module,很常用。
一、function(函数/方法级):
最小的作用域,作用于每个测试用例(包含函数/方法),如果需要函数和方法都需要调用时,需要将函数使用夹具,而不是使用方法。
"""
计算器
"""
import pytest
@pytest.fixture(scope='function')
def func():
print("开始计算")
yield
print("计算结束")
class TestCalculator:
def test_add(self, func):
print(5)
assert 5 == 2 + 3
def test_A(func):
print('A')
assert 6 == 3 + 3
执行结果:
二、class(类级)
作用于整个类,每个测试类执行前都会运行一次fixture,所有测试方法都可以使用。代码如下:
"""
计算器
"""
import pytest
@pytest.fixture(scope='class')
def func():
print("开始计算")
yield
print("计算结束")
class TestCalculator:
# @pytest.mark.parametrize("a,b,c",[[1,2,3]],indirect=)
def test_add(self, func,):
print(5)
assert 5 == 2 + 3
def test_A(self,func):
print('A')
assert 6 == 3 + 3
执行结果如下:
三、modul
作用于整个模块(多个类),每个模块执行前都会运行一次fixture,模块内的所有函数和方法都可以使用,所有模块执行前执行yield前面的代码,结束之后执行yield后面的代码。代码如下:
"""
计算器
"""
import pytest
@pytest.fixture(scope='module')
def func():
print("开始计算")
yield
print("计算结束")
class TestCalculator:
# @pytest.mark.parametrize("a,b,c",[[1,2,3]],indirect=)
def test_add(self, func):
print(5)
assert 5 == 2 + 3
def test_A(self, func):
print('A')
assert 6 == 3 + 3
class TestCA:
def test_b(self,func):
print('B')
assert 6 == 3 + 3
执行结果:
二、自动使用(autouse)
是否为自动使用,默认为false,设置为True时,测试用例就不需要进行声明也可以使用。代码如下:
"""
计算器
"""
import pytest
@pytest.fixture(scope='class',autouse=True)
def func():
print("开始计算")
yield
print("计算结束")
class TestCalculator:
# @pytest.mark.parametrize("a,b,c",[[1,2,3]],indirect=)
def test_add(self):
print(5)
assert 5 == 2 + 3
def test_A(self):
print('A')
assert 6 == 3 + 3
class TestCA:
def test_b(self):
print('B')
assert 6 == 3 + 3
输出结果为:
三、参数化(params)
夹具进行参数化,params进行参数,里面可以传入列表或者元组或者嵌套等,使用request.param进行调用。
"""
计算器
"""
import pytest
@pytest.fixture(scope='class', autouse=True, params=[[1, 2, 3], ['a', 2, 3]])
def func(request):
print("开始计算")
yield request.param
print("计算结束")
class TestCalculator:
def test_add(self, func):
print(func)
print(5)
assert 5 == 2 + 3
四、配置文件pytst.ini
pytest.ini
文件是 pytest 的配置文件,它允许用户自定义 pytest 的行为,比如添加命令行选项、定义测试文件的匹配模式等。这个文件通常放在项目的根目录下,pytest 在运行时会自动识别并应用这些配置。
[pytest]
addopts = -ra -q -s --alluredir report/json
testpaths = tests
python_files = test_*.py
python_classes = Test*
addopts
:添加命令行选项。-ra
表示显示所有断言的详细信息,-q
表示减少输出的冗余信息。-s表示禁用输出捕获,输出调试信息,包括print打印的信息。testpaths
:指定测试文件的目录。python_files
:指定测试文件的匹配模式。python_classes
:指定测试类的匹配模式。python_functions
:指定测试函数的匹配模式。
五、conftest.py
- 定义共享的fixture
- 修改pytest的行为
- 作用域管理
使用conftest.py文件进行自定义参数,使用pytest_addoption钩子函数进行设置,看如下代码:
import pytest
# 定义 --cmdopt 环境参数
def pytest_addoption(parser):
parser.addoption(
"--cmdopt", action="store", default="formal",
help="my env: test or pre or formal"
)
# 使用夹具之时候cmdopt来进行使用
@pytest.fixture()
def cmdopt(request):
return request.config.getoption("--cmdopt")
六、pytest参数化装饰器(pytest.mark.parametrize())
argnames:参数名,是字符串,中间用逗号分隔表示多个参数名
argvalues:参数值,列表中有几个元素,就会生成几条用例
ids:标识符,每一个用例添加标识,不写会自动生成唯一的,但是一定要跟参数值的用例数对应上,否则报错
indirect:
一、单个参数:
使用一个列表或者一个元组或者一个字典写入,代码如下:
"""
计算器
"""
import pytest
class TestCalculator:
@pytest.mark.parametrize('a', [1, 2])
def test_add(self, a):
print(a)
代码输出为
二、多个参数
当需要使用多个参数的时候需要进行嵌套。代码如下:
"""
计算器
"""
import pytest
class TestCalculator:
@pytest.mark.parametrize('a,b', [[1, 2]]) # a =1 b=2,一一对应,将a和b看成一组参数
def test_add(self, a,b):
print(a,b)
代码输出为
三、参数组合
支持参数组合,获得多个参数化参数的所有组合,可以堆叠使用参数化装饰器:【每一个参数化装饰器代表参数化测试方法中的一组测试数据】
代码如下
"""
计算器
"""
import pytest
class TestCalculator:
@pytest.mark.parametrize('a', [1, 2])
@pytest.mark.parametrize('b', [1, 2])
def test_add(self, a,b): # 一共执行2*2次
print(a,b)
输出如下:
四、ids标识符
要有用例个数相一致,也是要写入列表,元素必须为字符串,代码如下
"""
计算器
"""
import pytest
class TestCalculator:
@pytest.mark.parametrize('a', [1, 2],ids=['test1','test2'])
def test_add(self, a):
print(a)
输出如下:
五、indirect
当indirect=True时pytest
会将
@pytest.mark.parametrize
中定义的参数名视为fixture的名称,而不是测试函数的直接参数。这意味着
pytest
会查找与这些参数名相匹配的fixture,并使用参数化的值来调用这些fixture,代码如下:
"""
计算器
"""
import pytest
@pytest.fixture()
def get_a(request):
return request.param
class TestCalculator:
# 使用@pytest.mark.parametrize来参数化fixture
# 注意:indirect=True告诉pytest将'user_info'视为fixture的名称
@pytest.mark.parametrize('get_a', [1, 2],indirect=True)
def test_add(self, get_a): # get_a 为fixture的返回值,即1,2
print(get_a)
七、pytest执行命令
直接使用pytest命令,后面不加py文件,执行当前文件下所有test_开头和_test结尾的所有文件,也可以在pytest后指定py文件
# 运行当前文件所有的py文件
pytest
# 运行指定的py文件
pytest [file]
参数-s, 输出调试信息,包括print打印的信息
参数-v, 输出更详细的信息。
参数-m, 只执行添加标记的用例
版权归原作者 飞翔的小飞象 所有, 如有侵权,请联系我们删除。