0


WEB自动化测试第二讲—pytest

一、安装环境

使用命令 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*

  1. addopts:添加命令行选项。-ra 表示显示所有断言的详细信息,-q 表示减少输出的冗余信息。-s表示禁用输出捕获,输出调试信息,包括print打印的信息。
  2. testpaths:指定测试文件的目录。
  3. python_files:指定测试文件的匹配模式。
  4. python_classes:指定测试类的匹配模式。
  5. python_functions:指定测试函数的匹配模式。

五、conftest.py

  1. 定义共享的fixture
  2. 修改pytest的行为
  3. 作用域管理

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

标签: pytest python

本文转载自: https://blog.csdn.net/weixin_47296253/article/details/140585190
版权归原作者 飞翔的小飞象 所有, 如有侵权,请联系我们删除。

“WEB自动化测试第二讲—pytest”的评论:

还没有评论