pytest-进阶


官方文档:https://docs.pytest.org/en/latest/how-to/fixtures.html

一、什么是自动化测试 框架?

(1)测试组长针对某一个项目开发的代码框架,这个框架封装了很多的基础模块,报告模块等等
(2)作用降低人工干预、提高测试效率、增加代码重用性

  • 单元测试是自动化测试框架的一部分
  • 自动化框架还包括:
    数据驱动
    关键词驱动
    全局配置文件的封装
    日志监控
    selenium和request二次封装
    断言
    白搞邮件
    更多
    注pytest是unittest的封装与改进,pytest更加强大

二、自动化前置条件

pytest框架实现一些前后置处理(固件,夹具),常用三种,用例执行之前,用例执行之后的操作
setup/teardown,setup_class/teardown_class
为啥需要这些功能,因为需要前置条件呀!
def setup(self):在每个用例之前执行一次
def teardown(self):在每个用例之后执行一次
def setup_class(self):在所有用例之前执行一次
def teardown_class:在所有用例之后执行一次
案例一:

# -*- coding: utf-8 -*-  
# 可可爱爱小七月
import time

import pytest


def test_func():
    time.sleep(2)
    print('hash')


class TestLogin:
    age = 19
    def setup(self):
        print("初始化至新安装状态")
    

    @pytest.mark.run(order=1)
    def test_01_baili5(selfself):
        print('baili5')

    @pytest.mark.skip(reason="用例要调整")
    @pytest.mark.smoke
    def test_01_baili6(selfself):
        print('冒烟baili6')

    @pytest.mark.skipif(age <= 18, reason="未成年")
    @pytest.mark.user
    def test_01_baili9(selfself):
        print('用户分组baili9')
    def teardown(selfself):
        print("执行完关闭应用")

执行结果:

testcase/test_ zhuce.py::TestLogin::test_01_baili5 初始化至新安装状态
baili5
PASSED执行完关闭应用

testcase/test_login.py::TestLogin::test_01_baili2 baili2
PASSED
testcase/test_ zhuce.py::TestLogin::test_01_baili6 SKIPPED (用例要调整)
testcase/test_ zhuce.py::TestLogin::test_01_baili9 初始化至新安装状态
用户分组baili9
PASSED执行完关闭应用

testcase/test_login.py::TestLogin::test_01_baili3 冒烟baili3
PASSED
testcase/test_login.py::TestLogin::test_01_baili4 baili4
PASSED

三、fixture装饰器实现部分用例的前后置

1.它存在的意义?

不想所有用例执行前置和后置,上面方法做不到
fixture装饰器可以执行所有、还有部分的前后置

2.声明方式:

方法前声明该函数为fixture函数: @pytest.fixture(scope=“”, params=“”, ids=“”, autouse=“”)

3.五个参数解析

scope表示被fixture标记的函数的作用域function、class、module(每个py文件)、package/session
params:参数化
autouse:true自动执行,默认false
ids:参数化时,每一个值给予一个变量名
name:给被 @pytest.fixture标记的方法加一个别名

4.五个参数如何使使用?

(1)scope作用范围
scope=“function”

# -*- coding: utf-8 -*-  
# 可可爱爱小七月
import time

import pytest


class Testproduc:

    @pytest.fixture(scope="function")
    def myfixture(self):
        print("这是前置方法,可以实现部分以及全部用例的前后置")
        yield 
        print("这是后置方法,可以实现部分以及全部用例的前后置")

    @pytest.mark.smoke
    def test_01_xinyo(selfself,myfixture):

        print('冒烟妖媚')

    def test_01_haha(self):
        print("haha")

    def test_01_xixi(self,myfixture):
        print("xixi")

运行结果:
在这里插入图片描述
scope=“class”

# -*- coding: utf-8 -*-  
# 可可爱爱小七月
import time

import pytest


class Testproduc:

    @pytest.fixture(scope="class", autouse=True)
    def myfixture(self):
        print("这是前置方法,可以实现部分以及全部用例的前后置")
        yield
        print("这是后置方法,可以实现部分以及全部用例的前后置")

    @pytest.mark.smoke
    def test_01_xinyo(selfself ):

        print('冒烟妖媚')

    def test_01_haha(self):
        print("haha")

    def test_01_xixi(self ):
        print("xixi")

执行结果:
在这里插入图片描述
scope=“moudle”
如果一个模块里面有两个类,scope="class"的时候会执行两次,如果是moudle只会执行一次
(2)autouse自动使用,不用在方法的参数中调用就可以用,默认false

# -*- coding: utf-8 -*-  
# 可可爱爱小七月
import time

import pytest


class Testproduc:

    @pytest.fixture(scope="function", autouse=True)
    def myfixture(self):
        print("这是前置方法,可以实现部分以及全部用例的前后置")
        yield
        print("这是后置方法,可以实现部分以及全部用例的前后置")

    @pytest.mark.smoke
    def test_01_xinyo(selfself ):

        print('冒烟妖媚')

    def test_01_haha(self):
        print("haha")

    def test_01_xixi(self ):
        print("xixi")

执行结果:
在这里插入图片描述
(3)params参数化
支持列表【】 ,元组(),字典列表:列表中有字典【{},{}】,字典元组:元组中有字典({},{})
学习进度p6 19:09

怎么进行传参?
首先要在声明的时候加上params参数,可以是列表、元组、列表字典、元组字典
然后在该装饰器函数中返回参数,注意是固定写法

必须是request
@pytest.fixture(scope="class", params=['成龙', '李小龙'])
def myfixture(request):
    return request.param//这里的return=引用此装饰器的函数的参数,params为参数名  param为属性名 固定写法

在这里插入图片描述
(4)ids

@pytest.fixture(scope="class", params=['成龙', '李小龙'], ids=['cl', 'lxl'])
def myfixture(request):
    return request.param

在这里插入图片描述
(5)name
在这里插入图片描述
起了别名原来的名称就用不了,相当于改名字

在企业当中是如何使用的呢?

四、通过conftest.py和@pytest.fuxture()结合使用实现全局的前置应用,(比如项目的全局登录,模块的全局处理,底层页的所有功能的前置)

1.单独存放: conftest.py是单独存放的夹具配置文件,名称不能更改

  1. 全局使用:用处可以在不同的py文件中使用同一个fixture文件
  2. 位置规则:原则将运行的用例放在同一层,并且不用导入了,不是同一层也可以用
    4.多前置使用:

五、断言

assert

六、阿鲁allure测试报告

  1. 安装allure https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/2.13.7/
  2. 配置到path
  3. 验证是否生效:allure -version 在pycharm,如果此验证不出来重启pycharm
  4. 输入命令生成临时json报告 --alluredir ./temp 报告存储的位置
  5. main方法中os.system('allure generate ./temp -o ./report --clean') : 命令行解释:命令固定的 临时json格式报告位置 输出output 输出allure报告的位置 清空report之前内容

七、pytest_collection_modifyitems

def pytest_collection_modifyitems(config, items):
    for item in items:
        if 'test_' in item.nodeid:
            # 给每个测试用例添加重试装饰器
            item.add_marker(pytest.mark.flaky(reruns=2))
            print(f"Added flaky marker to test: {item.nodeid}")

pytest.mark.flaky是pytest框架提供的一个装饰器,用于处理测试用例中的非确定性失败。它用于标记测试用例,当测试用例失败时,可以重新运行一定次数,以尝试解决测试用例的故障。

reruns参数指定了测试用例重新运行的次数。当测试用例执行失败时,pytest会尝试重新运行这个用例指定次数,直到测试用例通过或者达到指定的重试次数。

举个例子,如果你想要某个测试用例在失败时重新运行两次,可以在相应的测试函数上加上@pytest.mark.flaky(reruns=2)装饰器,如下所示:

import pytest

@pytest.mark.flaky(reruns=2)
def test_example():
    # 测试代码
    # ...

test_example测试函数失败时,pytest将会再次运行该测试函数两次,以尝试解决测试用例的故障。

需要注意的是,pytest.mark.flaky装饰器需要安装pytest-flaky插件,可以通过pip install pytest-flaky来安装。
pytest-rerunfailures是一个pytest插件,用于重新运行测试用例中的失败测试。

当测试用例运行失败时,pytest-rerunfailures可以自动重新运行失败的测试用例,以期望能够通过重新运行来消除一些临时的错误。它可以帮助您更可靠地运行测试,减少因为偶发错误导致的测试失败。插件会记录每个失败测试用例的重新运行次数,并且只有在达到指定的最大重试次数后仍然失败的测试用例才会被标记为失败。

使用pytest-rerunfailures插件,您可以通过在命令行上添加--reruns <num>参数来指定测试用例的最大重试次数。例如,您可以通过以下方式运行测试用例并设置最大重试次数为3:

pytest --reruns 3

插件还提供了一些额外的配置选项,例如设置每次重试之间的延迟时间和重新运行失败的测试用例时应使用的随机种子等。

要使用pytest-rerunfailures插件,您需要首先安装它。可以使用pip命令来安装:

pip install pytest-rerunfailures

安装完成后,插件会自动与pytest集成,您就可以使用它来重新运行失败的测试用例了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值