我正面临一个小问题与热测试装置,将感谢您的帮助。
我有几个功能装置,如下所述。为了简单起见,我没有展示实现。
@pytest.fixture()
def get_driver():
pass
@pytest.fixture()
def login(get_driver):
pass
@pytest.fixture()
def settings(login):
pass问题是,在运行第一个测试用例之前,我还需要一个(会话级)夹具来完成设置。(实际上开始测试)。即转到“设置”页面,创建几个设置。(登录后)
现在的问题是,我不能使用会话级别的这样做,因为我不能在会话级别使用函数级的夹具。,我可以吗?
@pytest.fixture(scope="session")
def setup(settings):
settings.create_settings()
pass发布于 2017-08-23 10:03:36
你需要一个解决办法。此操作需要在function作用域夹具中完成,autouse设置为True。
您需要在基于session的夹具中初始化一个变量,这将检查settings是否已经完成。如果未完成,则执行设置并将标志更改为False。
下面是一个有用的例子
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")输出如下:
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所以您可以看到设置只发生一次。
发布于 2017-08-23 15:50:30
此解决方案试图在不创建会话级夹具的情况下实现相同的结果。它满足了您对设置为called only once before first test case的需求,正如您在上面的评论中提到的那样。
创建一个conftest.py并放置以下内容:
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()然后,您可以在您的测试中使用如下所示:
def test_one(settings):
print("Test one...")
def test_two(settings):
print("Test two...")执行测试应该会产生接近您想要的效果(基于到目前为止我可以从您给定的信息中推断出什么)。
(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>发布于 2020-04-02 11:42:18
我认为最简单的方法是添加一些标志,然后使用自动设置,如下所示:
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
passhttps://stackoverflow.com/questions/45817153
复制相似问题