如果 api 调用返回 403 代码,我会尝试使测试失败并显示特定错误消息。我尝试了几种选择:
if int(addresses.status_code) is 403:
fail("Auth Error: Missing Role {}".format(response.json()))
assert addresses.status_code is not 403
assert addresses.status_code is not codes.forbidden
assert addresses.status_code is codes.ok
其中唯一失败的是最后一个,
assert addresses.status_code is codes.ok
。然而,api 调用响应的状态代码为 is 403。我已经尝试过确保类型相同等,但不确定还能去哪里。
如何测试 status_code 是否不是特定值?
is
测试身份。状态码确实与 403
或 codes.forbidden
不是同一个对象。状态值是一个整数,而不是单例枚举对象。
使用
==
测试值是否相同:
if addresses.status_code == 403:
# ...
assert addresses.status_code != 403
assert addresses.status_code != codes.forbidden
assert addresses.status_code == codes.ok
或者直接使用
addresses.raise_for_status() # raises an exception if not 1xx, 2xx or 3xx
Response.raise_for_status()
方法引发requests.exceptions.HTTPError
异常(requests.exceptions.RequestException
的子类,又是OSError
子类)。
请注意,有时
is
适用于整数或任意数量的其他类型。但是,除非有可以使用身份测试的特定文档,否则您会发现一个实现细节,其中 Python 出于性能原因将重用对象。小整数(从 -5 到 256)、某些情况下的字符串以及许多其他极端情况就是这种情况。所以 address.status_code is 200
恰好适用于当前的 CPython 解释器,但这不是 不是给定的,不应该依赖。
您正在使用
is
,它检查两个对象的身份。为了比较 int
,您应该使用 ==
。事实上,除非检查单例(即 ==
)或实际需要时,否则始终使用 None
。
您可以在调用请求时添加 expected_status 参数,然后
assertion = str(addresses.status_code).find(str(expected_status))
if assertion == -1:
raise AssertionError(f'expected {addresses.status_code} \
to be {expected_status} \n body:{addresses.json()}')