Python请求:断言状态\代码未失败

Python请求:断言状态\代码未失败,python,python-requests,Python,Python Requests,如果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 add

如果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\u code是code.ok
。但是,api调用响应的状态代码为403。我已经尝试过确保类型相同等等,但不确定还能去哪里

如何测试状态代码是否不是特定值?

是测试身份。状态代码实际上与
403
code.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
引发一个
requests.exceptions.HTTPError
exception(一个
requests.exceptions.RequestException
的子类,依次是
OSError
子类)

请注意,有时
is
将处理整数或任何数量的其他类型。但是,除非有可以使用标识测试的特定文档,否则您会发现一个实现细节,其中Python会因为性能原因重用对象。小整数(从-5到256)以及某些情况下的字符串和许多其他角点情况就是这样。所以
address.status\u代码是200
正好在当前的CPython口译员中工作,但这不是给定的,不应该依赖。

是身份测试。状态代码实际上与
403
code.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
引发一个
requests.exceptions.HTTPError
exception(一个
requests.exceptions.RequestException
的子类,依次是
OSError
子类)


请注意,有时
is
将处理整数或任何数量的其他类型。但是,除非有可以使用标识测试的特定文档,否则您会发现一个实现细节,其中Python会因为性能原因重用对象。小整数(从-5到256)以及某些情况下的字符串和许多其他角点情况就是这样。因此,
address.status\u code is 200恰好适用于当前的CPython解释器,但这不是给定的,不应该依赖。

您使用的是检查两个对象身份的
is
。要比较
int
s,应使用
=
。事实上,始终使用
=
,除非在检查单例(即
)或实际需要时使用。

您使用的
,它检查两个对象的标识。要比较
int
s,应使用
=
。事实上,除非在检查单例(即
)或实际需要时,否则始终使用
==

更糟糕的是,状态代码可能与
403
是同一个对象,因此您不能真正依赖
在这里是真还是假。当然(默认配置的)CPython 3.6只在编译单元中“实习”整数,最多只有这个大小的一半,所以它总是会说false,但这只是(默认配置的)CPython 3.6的一个实现细节,而不是您希望在代码中依赖的东西。@abarnert:是的,200是这样一个实习数字,因此,
address.status\u代码是200
非常有效。更糟糕的是,状态代码可能是与
403
相同的对象,因此您不能真正依赖
is
在这里是真是假。当然(默认配置的)CPython 3.6只在编译单元中“实习”整数,最多只有这个大小的一半,所以它总是会说false,但这只是(默认配置的)CPython 3.6的一个实现细节,而不是您希望在代码中依赖的东西。@abarnert:是的,200是这样一个实习数字,所以
address.status\u代码是200
神奇地工作。