fixture为class级别的时候,如果一个class里面有多个用例,都调用了此fixture,那么此fixture只在此class里所有用例开始前执行一次。
示例代码如下:
fixture为module时,在当前.py脚本里面所有用例开始前只执行一次。
示例代码如下:
fixture为session,允许跨.py模块调用,通过conftest.py 共享fixture。
也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture也是可以实现的。
必须以conftest.py命名,才会被pytest自动识别该文件。放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在该package内有效。
文件目录结构如下:
创建公共数据,命名为conftest.py,示例代码如下:
# -*- coding: utf-8 -*- # @Time : 2020/10/24 19:37 # @Author : longrong.lang # @FileName: conftest.py # @Software: PyCharm # @Cnblogs :https://www.cnblogs.com/longronglang import pytest @pytest.fixture(scope='session') def commonData(): str = ' 通过conftest.py 共享fixture' print('获取到%s' % str) return str创建测试脚本test_scope1.py,示例代码如下:
# -*- coding: utf-8 -*- # @Time : 2020/10/24 19:45 # @Author : longrong.lang # @FileName: test_scope1.py # @Software: PyCharm # @Cnblogs :https://www.cnblogs.com/longronglang import pytest def testScope1(commonData): print(commonData) assert commonData == ' 通过conftest.py 共享fixture' if __name__ == '__main__': pytest.main(["-q", "test_scope1.py"])创建测试脚本test_scope2.py,示例代码如下:
# -*- coding: utf-8 -*- # @Time : 2020/10/24 19:45 # @Author : longrong.lang # @FileName: test_scope1.py # @Software: PyCharm # @Cnblogs :https://www.cnblogs.com/longronglang import pytest def testScope2(commonData): print(commonData) assert commonData == ' 通过conftest.py 共享fixture' if __name__ == '__main__': pytest.main(["-q", "test_scope2.py"])然后同时执行两个文件,cmd到脚本所在目录,输入命令
pytest -s test_scope2.py test_scope1.py 输出结果: 知识点:一个工程下可以有多个conftest.py的文件,在工程根目录下设置的conftest文件起到全局作用。在不同子目录下也可以放conftest.py的文件,作用范围只能在改层级以及以下目录生效,另conftest是不能跨模块调用的。
fixture的调用将fixture名作为测试用例函数的输入参数
测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name)
fixture设置autouse=True
示例代码如下:
# -*- coding: utf-8 -*- # @Time : 2020/10/24 20:10 # @Author : longrong.lang # @FileName: test_fixtureCall.py # @Software: PyCharm # @Cnblogs :https://www.cnblogs.com/longronglang ''' fixture调用示例 ''' import pytest # 调用方式一 @pytest.fixture def login1(): print('第一种调用') # 传login def test_case1(login1): print("\n测试用例1") # 不传login def test_case2(): print("\n测试用例2") # 调用方式二 @pytest.fixture def login2(): print("第二种调用") @pytest.mark.usefixtures("login2", "login1") def test_case3(): print("\n测试用例3") # 调用方式三 @pytest.fixture(autouse=True) def login3(): print("\n第三种调用") # 不是test开头,加了装饰器也不会执行fixture @pytest.mark.usefixtures("login2") def loginss(): print(123) if __name__ == '__main__': pytest.main(["-q", "test_fixtureCall.py"]) 输出结果: