本文共 2774 字,大约阅读时间需要 9 分钟。
在PyTest框架中,Fixture参数化是一种强大的功能,可以帮助我们重复使用相同的测试前置条件,从而提高测试效率。然而,如何在不同的测试用例之间共享或参数化Fixture数据是一个常见的问题。以下是一些实际案例,展示了如何在PyTest中使用Fixture参数化来实现复用性和灵活性。
当 Fixture 需要传递单个参数时,可以使用 request.param 来获取当前参数值。这种方法适用于简单的参数传递场景。
@pytest.fixture()def login(request): name = request.param print(f"== 账号是:{name} ==") return namedata = ["pyy1", "polo"]ids = [f"login_test_name is:{name}" for name in data]@pytest.mark.parametrize("login", data, ids=ids, indirect=True)def test_name(login): print(f" 测试用例的登录账号是:{login} ") request.param 提供了灵活的参数传递方式。indirect=True 参数允许 Fixture 作为函数调用,而不是直接作为参数。当需要传递多个参数时,可以使用字典数据结构来包装多个参数值。这种方法适用于需要同时传递多个相关参数的场景。
@pytest.fixture()def logins(request): param = request.param print(f"账号是:{param['username']},密码是:{param['pwd']}") return paramdata = [ {"username": "name1", "pwd": "pwd1"}, {"username": "name2", "pwd": "pwd2"}]@pytest.mark.parametrize("logins", data, indirect=True)def test_name_pwd(logins): print(f"账号是:{logins['username']},密码是:{logins['pwd']}") indirect=True 参数确保 Fixture 作为函数调用。当需要同时获取多个Fixture值时,可以通过 @pytest.mark.parametrize 一次性传递多个Fixture参数。
@pytest.fixture(scope="module")def input_user(request): user = request.param print("登录账户:%s" % user) return user@pytest.fixture(scope="module")def input_psw(request): psw = request.param print("登录密码:%s" % psw) return pswdata = [ ("name1", "pwd1"), ("name2", "pwd2")]@pytest.mark.parametrize("input_user,input_psw", data, indirect=True)def test_more_fixture(input_user, input_psw): print("fixture返回的内容:", input_user, input_psw) scope="module" 确保Fixture在模块范围内重复使用。@pytest.mark.parametrize 支持同时传递多个Fixture参数。当需要在不同的Fixture之间共享参数时,可以使用多个 @pytest.mark.parametrize 装饰器。
@pytest.fixture(scope="function")def input_user(request): user = request.param print("登录账户:%s" % user) return user@pytest.fixture(scope="function")def input_psw(request): psw = request.param print("登录密码:%s" % psw) return pswname = ["name1", "name2"]pwd = ["pwd1", "pwd2"]@pytest.mark.parametrize("input_user", name, indirect=True)@pytest.mark.parametrize("input_psw", pwd, indirect=True)def test_more_fixture(input_user, input_psw): print("fixture返回的内容:", input_user, input_psw) @pytest.mark.parametrize 装饰器实现多Fixture参数化。scope="function" 确保Fixture在函数级别重复使用。通过上述案例,我们可以看到:
request.param 时,确保测试数据的完整性和一致性。scope 参数合理控制Fixture的生命周期,避免资源浪费。通过以上方法,我们可以在PyTest中灵活地实现Fixture参数化,从而提高测试用例的复用性和维护性。
转载地址:http://xnafk.baihongyu.com/