如何在Schemathesis中为每个案例添加随机整数?

问题描述

我正在尝试使用 mid 和 cids 的随机输入来测试 API 端点(下面的代码)。但是,每当我运行测试时,它都会说缺少必需的位置参数。任何人都可以帮忙吗?

@schema.parametrize()
@schema.given(mid=st.integers(),cids=st.lists(st.integers()))
@settings(max_examples=1)
def test_api_customised(mid,cids,case):
    case.headers = case.headers or {}
    case.headers['Authorization'] = "apiKey " + str(base64_composer)
    case.headers['Content-Type'] = "application/json"
    
    # CREATE JOB
    if case.method == "POST":
        if isinstance(case.body,dict):
            case.body['moduleId'] = mid
            case.body['clientIds'] = cids
            print(case.body)

    response = case.call()
    case.validate_response(response)

And I got this error:

    TypeError: test_api_customised() missing 2 required positional arguments: 'mid' and 'cids'

解决方法

这很可能是由于 API 架构中存在显式示例造成的。请参阅此issue

临时解决方案是排除 explicit 阶段:

...  # Skipped for brevity
from hypothesis import settings,Phase

# Used in `@settings`
PHASES = phases=set(Phase) - {Phase.explicit}

@schema.parametrize()
@schema.given(mid=st.integers(),cids=st.lists(st.integers()))
@settings(max_examples=1,phases=PHASES)
def test_api_customised(mid,cids,case):
    ...  # the rest of the test

更全面的解决方案需要更改 Schemathesis(参见 this issue

您可以通过从 API 中删除 examples / example / x-examples / x-example 关键字(取决于您的 API 规范版本)来检查是否适合您架构。如果不是这种情况,我鼓励您to report提供更多详细信息(最好包括您的 API 架构)。