首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Py.test夹具:在量程夹具中使用功能夹具

Py.test夹具:在量程夹具中使用功能夹具
EN

Stack Overflow用户
提问于 2017-08-22 12:04:29
回答 3查看 4.2K关注 0票数 4

我正面临一个小问题与热测试装置,将感谢您的帮助。

我有几个功能装置,如下所述。为了简单起见,我没有展示实现。

代码语言:javascript
复制
@pytest.fixture()
def get_driver():
    pass

@pytest.fixture()
def login(get_driver):
    pass

@pytest.fixture()
def settings(login):
    pass

问题是,在运行第一个测试用例之前,我还需要一个(会话级)夹具来完成设置。(实际上开始测试)。即转到“设置”页面,创建几个设置。(登录后)

现在的问题是,我不能使用会话级别的这样做,因为我不能在会话级别使用函数级的夹具。,我可以吗?

代码语言:javascript
复制
@pytest.fixture(scope="session")
def setup(settings):
    settings.create_settings()
    pass
EN

回答 3

Stack Overflow用户

发布于 2017-08-23 10:03:36

你需要一个解决办法。此操作需要在function作用域夹具中完成,autouse设置为True

您需要在基于session的夹具中初始化一个变量,这将检查settings是否已经完成。如果未完成,则执行设置并将标志更改为False

下面是一个有用的例子

代码语言:javascript
复制
import pytest


@pytest.fixture(scope="session", autouse=True)
def settings_page():
    config = {"config_done": False}
    return config


@pytest.fixture()
def init(request):
    print("init called")
    return "init"


@pytest.fixture()
def driver():
    print("driver called")

    return "driver"


@pytest.fixture(autouse=True)
def init_settings(settings_page, driver):
    if not settings_page["config_done"]:
        print("Settings being done only the first time")
        settings_page["config_done"] = True


@pytest.fixture()
def login():
    print("login called")
    return "login"


@pytest.fixture()
def logged_in_driver(init, driver, login):
    print("logged in driver is ready")
    return (init, driver, login)


@pytest.fixture()
def non_logged_in_driver(init, driver):
    print("non logged in driver is ready")
    return (init, driver)


def test_1(logged_in_driver):
    print("test_1")


def test_2(non_logged_in_driver):
    print("test_2")

输出如下:

代码语言:javascript
复制
test.py driver called
Settings being done only the first time
init called
login called
logged in driver is ready
.test_1
driver called
init called
non logged in driver is ready
.test_2

所以您可以看到设置只发生一次。

票数 2
EN

Stack Overflow用户

发布于 2017-08-23 15:50:30

此解决方案试图在不创建会话级夹具的情况下实现相同的结果。它满足了您对设置为called only once before first test case的需求,正如您在上面的评论中提到的那样。

创建一个conftest.py并放置以下内容:

代码语言:javascript
复制
import pytest


def pytest_sessionstart(session):
    print("Initialising Session Level Settings")
    login = "A specialized login"
    settings(login).create_settings()


@pytest.fixture()
def get_driver():
    print("Get Driver")


@pytest.fixture()
def login(get_driver):
    print("Login")


@pytest.fixture()
def settings(login):
    print("Settings")

    class Setter:
        def create_settings(self):
            print("[Success] Settings created!")
    return Setter()

然后,您可以在您的测试中使用如下所示:

代码语言:javascript
复制
def test_one(settings):
    print("Test one...")


def test_two(settings):
    print("Test two...")

执行测试应该会产生接近您想要的效果(基于到目前为止我可以从您给定的信息中推断出什么)。

代码语言:javascript
复制
(py362) D:\repo\git\ens_qa>py.test -sv stackoverflow\ScopeWorkaroundTests.py
Initialising Session Level Settings
Settings
[Success] Settings created!
============================= test session starts =============================
platform win32 -- Python 3.6.2, pytest-3.2.1, py-1.4.34, pluggy-0.4.0 -- d:\virtualenv\py362\scripts\python.exe
cachedir: .cache
rootdir: D:\repo\git\ens_qa, inifile:
collected 2 items

stackoverflow/ScopeWorkaroundTests.py::test_one Get Driver
Login
Settings
Test one...
PASSED
stackoverflow/ScopeWorkaroundTests.py::test_two Get Driver
Login
Settings
Test two...
PASSED

========================== 2 passed in 0.05 seconds ===========================

(py362) D:\repo\git\ens_qa>
票数 1
EN

Stack Overflow用户

发布于 2020-04-02 11:42:18

我认为最简单的方法是添加一些标志,然后使用自动设置,如下所示:

代码语言:javascript
复制
import pytest

flag = True

@pytest.fixture()
def get_driver():
    pass

@pytest.fixture()
def login(get_driver):
    pass

@pytest.fixture()
def settings(login):
    pass

@pytest.fixture(autouse = True)
def setup(settings):
    global flag
    if flag:
        settings.create_settings()
        flag = False
    pass
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45817153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档