如何在不放入conftest.py的情况下用pytest设置测试用例前后置?
解决方案
有两种可行的方式,无需修改conftest.py,所有逻辑都在test.py内实现:
方式一:自动触发前后置(autouse fixture)
在测试类中定义一个autouse=True的function级fixture,它会自动作用于类内的每个测试方法,无需显式引用。同时建议把原test_login和test_logout重命名为非test_开头(避免被pytest识别为独立测试用例):
import pytest class Test_Login(base_test): def _login(self, username, password): # 原test_login的登录逻辑 pass def _logout(self): # 原test_logout的登出逻辑 pass @pytest.fixture(scope="function", autouse=True) def setup_teardown(self, username, password): # 测试前执行登录 self._login(username, password) yield # 此处执行测试用例 # 测试后执行登出 self._logout() # 你的实际测试用例 def test_user_profile(self): # 验证用户信息的测试逻辑 assert True def test_function_menu(self): # 验证功能菜单的测试逻辑 assert 2 + 2 == 4
方式二:显式引用fixture
如果不需要所有测试方法都执行前后置,可以定义普通fixture,让需要的测试方法显式依赖它:
import pytest class Test_Login(base_test): def _login(self, username, password): # 登录逻辑 pass def _logout(self): # 登出逻辑 pass @pytest.fixture(scope="function") def login_logout(self, username, password): self._login(username, password) yield self._logout() # 需要前后置的测试用例,显式传入fixture def test_order_submit(self, login_logout): # 提交订单的测试逻辑 assert True # 不需要前后置的测试用例,不引用fixture即可 def test_guest_access(self): # 游客访问的测试逻辑 assert True
关键说明
scope="function"确保每个测试方法都会单独执行一次登录和登出,避免测试用例间的状态污染。username和password如果是通过其他fixture提供的,直接传入即可,保持和原登录方法的参数一致。- 重命名
test_login/test_logout为_login/_logout是为了避免pytest将它们当作独立测试用例执行,若你确实需要保留这两个独立测试用例,可以跳过重命名,但要注意它们会被单独执行一次。
内容的提问来源于stack exchange,提问作者phat nhat
相关产品推荐
相关产品推荐

