如何阻止pytest_bdd在Gherkin场景大纲迭代后执行清理步骤?
解决方案
有几种可行的方法可以实现你的需求,既保留表格语法,又让该场景大纲的所有例子共享一次登录状态,不重复执行登出/登录:
方法1:通过测试标记跳过指定测试的清理步骤
这种方法无需改动原有fixture核心逻辑,只需给目标测试加标记,在fixture中判断是否执行登出:
- 给目标测试添加标记
修改test.py,给测试函数加上自定义标记(比如no_logout):
import pytest from pytest_bdd import scenario, given, when, then @pytest.mark.no_logout @scenario("test.feature", "Links on main page") def test_links(): pass
- 修改conftest.py中的fixture
在登录管理fixture中,通过request对象检查当前测试是否带有该标记,仅在无标记时执行登出:
import pytest @pytest.fixture(autouse=True, scope="function") def login_management(driver, page_url, logindata, request): login() yield # 仅当测试没有no_logout标记时,执行登出 if not request.node.get_closest_marker("no_logout"): logout()
方法2:为目标测试指定单独的持久化登录fixture
如果希望该场景的所有例子完全共享一次登录(只登录一次,所有链接检查完成后再登出),可以调整fixture作用域,同时避免影响其他测试:
- 调整原有fixture的自动应用逻辑
先把原有的login_management去掉autouse=True,改为手动调用:
@pytest.fixture(scope="function") def login_management(driver, page_url, logindata): login() yield logout()
- 创建全局自动应用的默认fixture
新增一个autouse fixture,让大部分测试自动使用原有登录逻辑:
@pytest.fixture(autouse=True, scope="function") def default_login(request): # 仅当测试没有skip_login_cleanup标记时,应用原有登录管理 if not request.node.get_closest_marker("skip_login_cleanup"): request.getfixturevalue("login_management")
- 为目标测试创建持久化登录fixture
新增一个作用域为module(或class)的fixture,确保该测试的所有例子共享一次登录:
@pytest.fixture(scope="module") def persistent_login(driver, page_url, logindata): login() yield # 所有例子执行完毕后,才执行后续登出 logout()
- 标记目标测试并绑定持久化fixture
修改test.py,标记测试跳过默认登录逻辑,并绑定持久化fixture:
import pytest from pytest_bdd import scenario @pytest.mark.skip_login_cleanup @scenario("test.feature", "Links on main page") def test_links(persistent_login): pass
这种方式下,该场景大纲的所有例子会在同一个登录会话中完成所有链接检查,仅在全部测试结束后执行一次登出,其他测试不受影响。
内容的提问来源于stack exchange,提问作者LokiRagnarok
相关产品推荐
相关产品推荐

