pytest的fixture/yield以及conftest.py的用法


fixture是pytest框架里做前置后置的功能,可以用于将测试前后进行预备、清理工作的代码处理机制。
fixture和setup/teardown对比有以下优势:

  • fixture命名更加灵活,局限性比较小
  • conftest.py配置里可以实现数据共享,可以方便管理、修改和查看fixture函数,并且不需要import就能自动找到一些配置

一、fixture用法:

fixture的作用范围(运行顺序): session>module>class>function

  1. @pytest.fixture(scope='function', autouse=True),每一个函数或方法都会调用,autouse表示默认所有的方法都会调用。

    @pytest.fixture()  # 默认scope是function
    def func():
    	print("我是前置步骤")
    
    def test_fixture1(func):
    	print("我是方法1")
    
    def test_fixture2():  # 默认不会调用fixture
    	print("我是方法2")
    
  2. @pytest.fixture(scope=‘class’),每一个类调用一次

    @pytest.fixture(scope="class", autouse=True) #autouse如果没写的话,类是不会调用前置步骤
    def func(self):
    	print("我是前置步骤")
    
    
    class TestdClassFixture:
    	def test_fixture1(self):
    		print("我是方法1")
    	
    	def test_fixture2(self):
    		print("我是方法2")
    
  3. @pytest.fixture(scope=‘module’),每一个.py文件调用一次, 即使有多个方法和类也只会执行一次前置步骤。

    @pytest.fixture(scope="module", autouse=True) #autouse如果没写的话,是不会调用前置步骤
    def func(self):
    	print("我是前置步骤")
    
    def test_demo():
    	print("test")
    
    class TestdClassFixture:
    	def test_fixture1(self):
    		print("我是方法1")
    	
    	def test_fixture2(self): 
    		print("我是方法2")
    
  4. @pytest.fixture(scope='session'),多个文件调用一次,.py文件就是module,具体例子结合conftest.py进行配置,详看下面的内容。

二、conftest.py

conftest.py是pytest提供的一个重要的功能,可以把一些通用的方法下载conftest里方便使用和维护,类似工具类,使用时要注意以下要求:

  • conftest.py的命名是固定写法不可以更改。
  • 使用conftest.py里的方法无需导入。
  • conftest的函数作用于当前文件夹以及下属的文件夹。

结合fixture进行使用步骤如下:

  1. 先创建一个conftest.py 文件写入fixture方法。

    import pytest
    
    
    @pytest.fixture(scope="session")
    def test_session():
        print("我是session级别的fixture")
    
    @pytest.fixture(scope="function")
    def test_func1()
    	print("我是func级别的fixture")
    
  2. 在用例里使用conftest的方法

	def test_fixture1(test_func1, test_session):  # 写入要调用的方法名
		print("我是方法1")
	
	def test_fixture2():  # 默认不会调用fixture
		print("我是方法2")

三、pytest 使用conftest返回的数据

实际工作中可能会用到一些前置步骤(数据库)返回的数据,操作如下:

  1. 在conftest.py里加一个返回数据的方法

    def get_params():
    	json={"username": "username", "password": "password"}
    	return json
    
  2. 在用例里使用conftest返回的参数:

    	def test_login(get_params):   #  写入方法名
    		r = requests.post("/login/", json=get_params)
    

四、使用yield做后置处理

yield关键字会在用例和前置步骤完成之后进行迭代。

	@pytest.fixture(scope="function", autouse=True)
	def func():
		print("我是前置步骤")
		yield
		print("我是后置步骤")

五、usefixture的用法

usefixture也是可以用来做前置步骤,不同的是不能接收返回值,调用的时候也不能直接传入方法里,需要用@pytest.mark.userfixtures(“use_fixture”)进行调用,显示上会更加直观。
用法:1. 在conftest.py加入fixture方法

@pytest.fixture(scope="function")
def user_fixture1():
	print("我是一个userfixture1") 

@pytest.fixture(scope="function")
def user_fixture2():
	print("我是一个userfixture2") 

2.在用例里调用

@pytest.mark.userfixtures("use_fixture1")
@pytest.mark.userfixtures("use_fixture2")
def test_usefixture():
	print("这里使用了usefixture")

六、fixture中的params和ids

@pytest.fixture(params=["text1", "text2"], ids=["case1", "case2"])
def params_fixture(request):
	return request.param  # request和param为关键字,不能更改


def test_params(params_fixture):  # 会根据params执行两条用例并带上ids的标识
	 print(params_fixture)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值