领取资料,咨询答疑,请➕wei: June__Go
上一小节我们学习了pytest fixture的基本使用方法,本小节我们讲解一下fixture的作用域。
fixture前后置区分
控制fixture的前置和后置操作是通过yield关键字进行来区分的,代码在yield前面的属于前置操作,代码在yield后面的属于后置操作。并且fixture也没有强烈的要求必须要前后置同时存在,可以只存在前置也可以只存在后置。fixture如果有后置内容,无论遇到什么问题,都会进行执行后置的代码。
from selenium import webdriver
@pytest.fixture()
def open_browser_init():# 前置chrome浏览器webdriver初始化driver = webdriver.Chrome()driver.get("https://www.baidu.com")yield driver# 后置 chrome浏览器webdriver关闭driver.quit()
fixture作用域
Unittest框架中setup的作用是每条测试用例执行之前都会执行一次,setupclass的作用是每个测试用例类执行之前都会执行一次。
pytest的fixture同样有这样的作用域,且使用更广泛更灵活。
关键代码:@pytest.fixture(scope='作用范围'),参数如下:
- function:默认作用域,每个测试用例都运行一次
- class:每个测试类只执行一次
- module:每个模块只执行一次(模块:一个.py文件)
- package:每个python包只执行一次
- session:整个会话只执行一次,即运行项目时整个过程只执行一次
fixture后面的括号不加任何参数,就代表默认作用域,与function作用一样。
1、function级别范围
每个测试用例之前运行一次
import pytest@pytest.fixture()
def test_fixture():a = "hello"print("每个测试用例之前运行一次")yield a
def test_01(test_fixture):print("这是test_01")assert "e" in test_fixture
def test_02(test_fixture):print("这是test_02")assert "h" in test_fixture
运行结果为:
============================= test session starts ==============================
collecting ... collected 2 itemstest_demo.py::test_01 每个测试用例之前运行一次
PASSED [ 50%]这是test_01test_demo.py::test_02 每个测试用例之前运行一次
PASSED [100%]这是test_02============================== 2 passed in 0.01s ===============================
2、class级别范围
如果一个class里面有多个用例,都调用了此fixture,那么fixture只在此class里所有用例开始前执行一次。
import pytest@pytest.fixture(scope="class")
def test_fixture():a = "hello"print("每个类之前运行一次")yield a@pytest.mark.usefixtures("test_fixture")
class TestDemo:def test_demo01(self, test_fixture):assert "9" in test_fixturedef test_demo02(self, test_fixture):assert "o" in test_fixture
运行结果:
============================= test session starts ==============================
collecting ... collected 2 itemstest_demo.py::TestDemo::test_demo01 每个类之前运行一次
FAILED [ 50%]
test_demo.py:20 (TestDemo.test_demo01)
'9' != 'hello'Expected :'hello'
Actual :'9'
<Click to see difference>self = <test_demo.TestDemo object at 0x10e0a60a0>, test_fixture = 'hello'def test_demo01(self, test_fixture):
> assert "9" in test_fixture
E AssertionError: assert '9' in 'hello'test_demo.py:22: AssertionErrortest_demo.py::TestDemo::test_demo02 PASSED [100%]========================= 1 failed, 1 passed in 0.04s ==========================
3、module级别范围
在当前.py脚本里面所有用例开始前只执行一次。
import pytest
@pytest.fixture(scope="module")
def test_fixture():a = "hello"print("在当前文件下执行一次")yield a
def test_01(test_fixture):print("这是test_01")assert "e" in test_fixture
@pytest.mark.usefixtures("test_fixture")
class TestDemo:def test_demo01(self,test_fixture):print("这是test_demo01")assert "h" in test_fixturedef test_demo02(self,test_fixture):print("这是test_demo02")assert "o" in test_fixture
运行结果:
============================= test session starts ==============================
collecting ... collected 3 itemstest_demo.py::test_01 在当前文件下执行一次
PASSED [ 33%]这是test_01test_demo.py::TestDemo::test_demo01
test_demo.py::TestDemo::test_demo02 ============================== 3 passed in 0.01s ===============================
4、session级别范围
session级别是可以跨模块调用的,多个模块下的用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里。
conftest.py作用域:放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在改package内有效。
conftest.py的fixture调用方式,无需导入,直接使用。
文件目录
conftest.py
import pytest@pytest.fixture(scope="session")
def test_fixture():a = "hello"print("这是session范围的作用域,多个文件共享")yield a
test_demo1.py
import pytestdef test_01(test_fixture):print("这是test_01")assert "e" in test_fixturedef test_02(test_fixture):print("这是test_02")assert "h" in test_fixture
test_demo2.py
import pytestdef test_01(test_fixture):print("这是test_01")assert "e" in test_fixture@pytest.mark.usefixtures("test_fixture")
class TestDemo:def test_demo01(self, test_fixture):print("这是test_demo01")assert "h" in test_fixturedef test_demo02(self, test_fixture):print("这是test_demo02")assert "o" in test_fixture
运行结果:
============================= test session starts ==============================
collecting ... collected 5 itemstest_demo1.py::test_01 这是session范围的作用域,多个文件共享
PASSED [ 20%]这是test_01test_demo1.py::test_02 PASSED [ 40%]这是test_02test_demo2.py::test_01 PASSED [ 60%]这是test_01test_demo2.py::TestDemo::test_demo01 PASSED [ 80%]这是test_demo01test_demo2.py::TestDemo::test_demo02 PASSED [100%]这是test_demo02============================== 5 passed in 0.01s ===============================
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!领取资料,咨询答疑,请➕wei: June__Go