pytest--fixture使用

1、pytest的fixture介绍

假设有一个场景,有些用例需要登陆方法,另一些则不需要用到登陆方法,那么setup和teardown就没法满足此需求,所以pytest提供了fixture来补充这方面的需求,可以让指定的测试用例执行前后置操作。fixture是在测试用例运行前后执行的,对命名规范没有特别要求。fixture中的代码以yield为分割,测试用例执行前会先执行fixture中yield前面的代码(setup),测试用例执行后再执行fixture中yield后的代码(teardown)

:fixture的yield不是必须有的,只有前置代码,没有yield(没有后置代码),那测试用例执行完成后就结束了。没有前置代码,开头yield(只有后置代码),无论测试过程中发送什么错误,yield后续的代码都会被执行

 

2、fixture的使用

2.1、fixture的简单例子

复制代码
import pytest

#添加fixture修饰器 @pytest.fixture()
def add(): print('---测试执行---') yield print('---测试结束---') class Test_add():
#传参为测试用例添加fixture
def test_01(self, add): print('用例一') def test_02(self): print('用例二') if __name__ == '__main__': #命令行参数--setup-show可以来查看详细的fixture信息 pytest.main()
复制代码

 

输出结果:

 

 从上面的打印可以看到,只有test_01测试用例执行了前后置的打印,符合我们只在test_01传参设置了fixture(add)的情况

 

2.2、同一个测试用例也可以设置多个fixture,执行顺序:前置部分,先传入的参数先执行,后传入的参数后执行,后置部分则相反

复制代码
import pytest

@pytest.fixture()
def add():
    print('---测试执行---')
    yield
    print('---测试结束---')

@pytest.fixture()
def log():
    print('开始记录log')
    yield
    print('记录log结束')

class Test_add():
    def test_01(self,add,log):
        print('用例一')
    def test_02(self):
        print('用例二')
    def test_03(self,log,add):
        print('用例三')

if __name__ == '__main__':
    #命令行参数--setup-show可以来查看详细的fixture信息
    pytest.main()
复制代码

 

输出结果:

 

 

2.3、fixture执行过程中,无论遇到什么异常,都会继续执行yield后的后置代码部分(teardown)

复制代码
import pytest

@pytest.fixture()
def add():
    print('---测试执行---')
    yield
    print('---测试结束---')

class Test_add():
    #fixture执行过程中,无论遇到什么异常,都会继续执行yield后的后置代码部分(teardown)
    def test_error(self,add):
        print('错误用例')
        assert 1 == 2
        print('测试用例结束')

if __name__ == '__main__':
    #命令行参数--setup-show可以来查看详细的fixture信息
    pytest.main()
复制代码

 

输出结果:

 

 可以看到test_error测试用例中出现错误,后置teardown的打印仍旧执行,且同时将测试用例中错误原因和行数也打印出来

 

2.4、当一个fixture调用函数名称因为命名习惯,重复比较多的时候,可以使用name参数进行别名来区分,传参时候将自己所定义的name参数传入即可调用对应的fixture

代码如下:

复制代码
import pytest
#当一个fixture调用函数名称因为命名习惯,重复比较多的时候,可以使用name参数进行别名来区分
@pytest.fixture(name='p1')
def login():
    print('请输入账号密码')
    yield
    print('登陆成功')

def test_01(login):
    print('test_01执行')
复制代码

 

 输出结果:

 

 注意:定义name别名后,再使用fixture函数名进行传参的话,会提示找不到对应的fixture

 

posted @   测试-13  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示