pytest_fixture通过参数request获取测试数据,并在fixture方法里面使用

pytest fixture传参request的使用

获取request对pytest插件的版本有要求,如果找不到request报错的话, 建议先升级pytest的版本

 

要实现的效果

执行测试用例,调用到只执行一次的fixture方法(scope=session/class/module),可以获取请求参数里面的用户名和密码,用于登录

 

问题

定义了一个session或module范围的fixture方法,直接将测试数据作为参数传入到方法,会报错,大概意思是执行一次的方法,不能接受所有符合要求的测试数据,导致获取不到登录的用户和密码,结合应用场景,不想通过将数据写死的方式来实现

“ScopeMismatch: You tried to access the function scoped fixture test_data wit”

@pytest.fixture(scope="module")  # 当前.py文件下只执行一次;
def session_login_success(pytestconfig, test_data): // test_data是测试用例里面传递的数据
    username = test_data["username"]
test_data是测试用例里面传递的数据
    @pytest.mark.usefixtures("session_login_success")
    @pytest.mark.parametrize("test_data", data)
    def test_smoke(self, session_login_success, test_data):
       print("test")

 

解决方法:使用fixture的request

Request用于接受传参,正在执行的测试用例的数据,都在request里面,可以debug模式查看这个对象返回的数据

使用request.param取值报错:'SubRequest' object has no attribute 'param'

@pytest.fixture(scope="module")  # 当前.py文件下只执行一次;
def session_login_success(pytestconfig, request):
    res1 = request.param

Debug模式,查看request返回的数据,里面没有param,所以会报错

获取到这个request,然后逐层查看返回的对象里面包含的数据,哪些数据才是想要的,然后进行取值

开启debug模式,加断点,查看返回的request对象的数据

逐层往下找,找到存放测试用例数据的地方,如下图找到在受保护的属性值里面,有需要的用户和密码

最后通过逐层取值,和字典取值方式,取到用户名和密码

最终实现的结果:

@pytest.fixture(scope="module") 
def session_login_success(pytestconfig, request):
    req_data = request._pyfuncitem.callspec.params["test_data"]
    username = req_data["username"]
    pwd = req_data["password"]
    driver = open_browse(pytestconfig)
    LoginPage(driver).Login(username=username, pwd=pwd)
    LoginPage(driver).wait_page_load_finish()
    yield driver
    driver.quit()

 

posted on 2022-07-20 16:51  刚刚好1  阅读(1192)  评论(0编辑  收藏  举报

导航