以下主要介绍fixture的介绍、调用方式及作用域。
fixture基本介绍
fixture概念fixture
是 pytest 用于将测试前后进行预备、清理工作的代码处理机制。
fixture优势
fixture相对于unittest
中的setup和teardown来说有以下几点优势:
-
fixure命名更加灵活,局限性比较小;
fixture语法
语法如下:
fixture(callable_or_scope=None, *args, scope="function", params=None, autouse=False, ids=None, name=None)
定义fixture
定义fixture,在函数上添加@pytest.fixture
即可。
@pytest.fixture() def fixture_demo(): print("这是fixture")
如何区分前后置
在pytest中,用yield
区分前后置,即yield前面代码为前置,后面代码为后置。
from selenium import webdriver @pytest.fixture() def open_browser_init(): # 前置 driver = webdriver.Chrome() driver.get("https://www.baidu.com") yield driver # 后置 driver.quit()
fixture调用
调用fixture的三种方式。
在测试用例中直接调用
将fixture名称作为参数传入测试用例,如果fixture有返回值,那么测试用例将会接收返回值。
import pytest from selenium import webdriver @pytest.fixture() def open_browser_init(): driver = webdriver.Chrome() driver.get("https://www.baidu.com") yield driver driver.quit() def test_input(open_browser_init): open_browser_init.find_element_by_id("kw").send_keys("ITester")
pytest装饰器调用fixture
在测试用例或测试类上方加上@pytest.mark.usefixtures("fixture名称")
。
import pytest from selenium import webdriver @pytest.fixture() def open_browser_init(): driver = webdriver.Chrome() driver.get("https://www.baidu.com") yield driver #返回driver driver.quit() @pytest.mark.usefixtures("open_browser_init") def test_input(open_browser_init): # fixture名称作为参数传入 open_browser_init.find_element_by_id("kw").send_keys("ITester")
autouse调用fixture
fixture有个参数autouse,默认为False
。
autouse为True
时,同一个作用域的所有测试用例都会调用这个fixture。
autouse为False时,需要手动调用fixture。
import pytest
@pytest.fixture(autouse=True)
def fixture_auto():
print("这是fixture_auto")
def test_demo01():
print("运行test_demo01")
def test_demo02():
print("运行test_demo02")
运行结果为:
fixture作用域
fixture里面有个scope
参数可以控制fixture的作用范围,scope参数可以是session, module,class,function, 默认为function。
-
module 模块级别:模块里所有的用例执行前执行一次module级别的fixture;
-
class 类级别 :每个类执行前都会执行一次class级别的fixture;
-
function 函数级别:每个测试用例执行前都会执行一次function级别的fixture。
function级别范围
每个测试用例之前运行一次:
@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
运行结果为:
class级别范围
如果一个class里面有多个用例,都调用了此fixture,那么fixture只在此class里所有用例开始前执行一次。
import pytest @pytest.fixture(scope="class") def test_fixture(): a = "hello" yield a @pytest.mark.usefixtures("test_fixture") class TestDemo: def test_demo01(self,test_fixture): assert "h" in test_fixture def test_demo02(self,test_fixture): assert "o" in test_fixture
运行结果为:
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_fixture def test_demo02(self,test_fixture): print("这是test_demo02") assert "o" in test_fixture
运行结果为:
session级别范围
session
级别是可以跨模块调用的,多个模块下的用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里。
conftest.py作用域:放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在改package内有效。
conftest.py的fixture调用方式,无需导入,直接使用。
conftest.py
import pytest @pytest.fixture() def test_fixture(): a = "hello" print("这是conftest") yield a
test_demo01.py
def test_01(test_fixture): print("这是test_01") assert "e" in test_fixture
test_demo02.py
def test_02(test_fixture): print("这是test_02") assert "h" in test_fixture
命令行输入:pytest -v
输出结果如下:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。