WEB自动化测试第二讲—pytest

飞翔的小飞象 2024-09-11 15:33:01 阅读 87

一、安装环境

使用命令 pip install pytest进行安装

二、命名规则

使用test_*或*_test来命名文件名称

使用Test*来命名类名称,遵循驼峰命名法,注意:测试类中没有__init__()初始化方法

使用test_*来命名方法名称

三、夹具使用:pytest.fixture()

一、作用域(scope):

作用与主要分为五种:function、class、module、package、session,以下讲解前三个,分别是function、class、module,很常用。

一、function(函数/方法级):

最小的作用域,作用于每个测试用例(包含函数/方法),如果需要函数和方法都需要调用时,需要将函数使用夹具,而不是使用方法。

<code>"""

计算器

"""

import pytest

@pytest.fixture(scope='function')code>

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,所有测试方法都可以使用。代码如下:

<code>"""

计算器

"""

import pytest

@pytest.fixture(scope='class')code>

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后面的代码。代码如下:

<code>"""

计算器

"""

import pytest

@pytest.fixture(scope='module')code>

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时,测试用例就不需要进行声明也可以使用。代码如下:

<code>"""

计算器

"""

import pytest

@pytest.fixture(scope='class',autouse=True)code>

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进行调用。

<code>"""

计算器

"""

import pytest

@pytest.fixture(scope='class', autouse=True, params=[[1, 2, 3], ['a', 2, 3]])code>

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",code>

help="my env: test or pre or formal"code>

)

# 使用夹具之时候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)

代码输出为 

二、多个参数

当需要使用多个参数的时候需要进行嵌套。代码如下:

<code>"""

计算器

"""

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)

代码输出为

 

三、参数组合

支持参数组合,获得多个参数化参数的所有组合,可以堆叠使用参数化装饰器:【每一个参数化装饰器代表参数化测试方法中的一组测试数据】

代码如下

<code>"""

计算器

"""

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标识符

要有用例个数相一致,也是要写入列表,元素必须为字符串,代码如下

<code>"""

计算器

"""

import pytest

class TestCalculator:

@pytest.mark.parametrize('a', [1, 2],ids=['test1','test2'])

def test_add(self, a):

print(a)

输出如下:

五、indirect

<code>当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, 只执行添加标记的用例



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。