pytest+yaml接口自动化参数替换

求指教pytest+yaml接口自动化参数提取并替换参数问题:
如图所示,接口返回的json数据是多层嵌套

img

图片中的参数已经提取成功,在下个接口中进行替换时不知该如何使用这个参数
提取表达式:$.data.settlementData[0].settlementDetailWorkIds[0],可以成功提取到参数

img

在使用的时候如何替换

img

该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据您的描述,提取表达式 $.data.settlementData[0].settlementDetailWorkIds[0] 已经成功提取了 settlementDetailWorkIds 的值,该值为 132。

接下来,在接口请求中使用该值进行参数替换,可以按照以下步骤进行:

1.在 Pytest 测试用例中,先使用 PyYAML 库读取 YAML 文件中的参数,并将提取的值添加到参数池中,例如:

import yaml

def test_my_api():
    with open("data.yaml", "r") as f:
        data = yaml.safe_load(f)

    extracted_value = 132
    data["detailworkIds"] = extracted_value
    # 将提取的值添加到参数池中

    # 发送接口请求并进行断言


2.在接口请求的数据部分,使用字符串格式化或 f-string 等方式,将参数池中的值进行替换,例如:

import requests

def test_my_api():
    with open("data.yaml", "r") as f:
        data = yaml.safe_load(f)

    extracted_value = 132
    data["detailworkIds"] = extracted_value

    response = requests.post(
        url="http://example.com/my_api",
        json={
            "mobile": data["mobile"],
            "settlementData": {
                "settlementDetailId": data["detailId"],
                "settlementDetailWorkIds": [data["detailworkIds"]],
                "settlementDetailIds": data["detailIds"],
                "settlementId": data["settlementId"],
                "smsCode": data["smsCode"]
            }
        }
    )

    assert response.status_code == 200


在上述代码中,使用 data["detailworkIds"] 来代表提取的值,将它添加到请求数据的 settlementDetailWorkIds 字段中,这样就完成了参数的替换。

希望这些代码可以帮助您解决问题!

您好,pytest和yaml结合进行接口自动化测试是一个不错的选择,可以帮助您提高测试效率和可维护性。关于参数提取并替换参数的问题,可以通过以下步骤来实现:

在yaml文件中定义接口的请求参数和预期结果,如下所示:


yaml
Copy code
# 请求参数
request:
  url: https://api.example.com/user
  method: POST
  headers:
    Content-Type: application/json
  body:
    name: test
    age: 18

# 预期结果
expected_response:
  status_code: 200
  body:
    message: success
    data:
      name: test
      age: 18

在pytest中编写测试用例,使用PyYAML库读取yaml文件中的请求参数和预期结果,如下所示:

python
Copy code
import yaml

def test_user():
    with open("user.yaml", encoding="utf-8") as f:
        data = yaml.safe_load(f)

    # 发送请求
    response = requests.request(**data["request"])

    # 验证响应结果
    assert response.status_code == data["expected_response"]["status_code"]
    assert response.json() == data["expected_response"]["body"]

如果需要替换参数,可以在yaml文件中使用占位符,如下所示:

yaml
Copy code
# 请求参数
request:
  url: https://api.example.com/user/${user_id}
  method: POST
  headers:
    Content-Type: application/json
  body:
    name: ${user_name}
    age: ${user_age}

# 预期结果
expected_response:
  status_code: 200
  body:
    message: success
    data:
      name: ${user_name}
      age: ${user_age}

在pytest中,可以使用pytest的fixture机制和pytest的config对象来动态替换占位符,如下所示:

python
Copy code
@pytest.fixture(params=[{"user_id": "1", "user_name": "test1", "user_age": 18},
                        {"user_id": "2", "user_name": "test2", "user_age": 20}])
def user_info(request):
    return request.param

def test_user(user_info, config):
    with open("user.yaml", encoding="utf-8") as f:
        data = yaml.safe_load(f)

    # 替换占位符
    data["request"]["url"] = data["request"]["url"].format(**user_info)
    data["request"]["body"]["name"] = data["request"]["body"]["name"].format(**user_info)
    data["request"]["body"]["age"] = data["request"]["body"]["age"].format(**user_info)
    data["expected_response"]["body"]["name"] = data["expected_response"]["body"]["name"].format(**user_info)
    data["expected_response"]["body"]["age"] = data["expected_response"]["body"]["age"].format(**user_info)

    # 发送请求
    response = requests.request(**data["request"])

    # 验证响应结果
    assert response.status_code == data["expected_response"]["status_code"]
    assert response.json() == data["expected_response"]["body"]

在上述代码中,使用pytest