Unmock Python 客户端
项目描述
取消模拟(Python SDK)
Python 的公共 API 模拟。
Unmock 可用于测试向第三方 API(如 Hubspot、SendGrid、Behance 和数百个其他公共 API)执行请求的模块。
Unmock 也可用于在开发环境中模拟这些 API,即本地机器上的快速服务器或暂存环境中。
Unmock Python 包以最少的设置步骤为 Unmock 服务提供直观、无忧的 SDK。
unmock 的最终目标是提供一个语义上和功能上都充分的互联网模拟。
Unmock 还提供通过其他语言的访问,所有这些都具有类似的界面。我们已经公开了unmock-js ,我们正在开发 .Net、PHP 和 Java。我们愿意接受更多请求 - 请告诉我们!
目录
它是如何工作的?
Unmock 通过覆盖 Python 的低级HTTPConnection' 和
HTTPRequest' 函数来工作,从而捕获由流行包(例如requests和)进行的调用urllib3。
Unmock 对于它模拟的大多数 API 都是开箱即用的,不需要任何额外的配置。对于它尚未模拟的 API,或者要调整来自 unmock 服务的返回值,您可以查阅通过 unmock 打印到命令行的 URL。
我们打算很快提供 Python2.7 支持,以及其他常用库,例如aiohttp ,pycurl等。
安装
$ pip install unmock
用法
测试
在您的单元测试中,您可以通过多种方式调用 unmock:
- 如果您使用 pytest 进行测试,您可以使用 unmock 固定装置(您甚至不需要导入 unmock!) -
import pytest
import requests
def test_behance(unmock_local):
response = requests.get("https://www.behance.net/v2/projects/5456?api_key=u_n_m_o_c_k_200")
assert response.json().get("project").get("id") == 5456
...或者您可能希望对所有测试都使用 unmock,在这种情况下,您可以简单地使用--unmockpytest 的标志:
pytest tests --unmock
- 您可以使用上下文管理器以范围方式控制使用 unmock:
# do stuff
with unmock.patch():
response = requests.get("https://www.example.com/")
# do stuff with mocked response
real_response = requests.get("https://www.example.com/") # won't be mocked
# You can also access the returned object to modify certain runtime behaviour:
with unmock.patch() as opts:
# can modify certain behaviour aspects via `opts` object now too
response = requests.get("https://www.example.com/")
init您可以使用和 方法对 unmock 进行细粒度控制reset,并在运行时修改UnmockOptions对象:
import unmock
# do stuff
opts = unmock.init()
res1 = requests.get("https://www.example.com") # will be mocked
opts.save = True
res2 = requests.get("https://www.example.com") # will be mocked and response will be saved
unmock.reset()
res3 = requests.get("https://www.example.com") # will not be mocked
然后,Unmock 将从其数据库中提供 JIT 语义功能正确的模拟,或者为用户可以填写的未模拟 API 提供一个空的 JSON 对象。这些可编辑对象的地址在测试期间打印到命令行。
发展
创建烧瓶、django 或自己的服务器后,调用
unmock_options = unmock.init()
unmock_options.ignore("story")
# equivalent to calling:
unmock.init(ignore="story")
这与在测试中激活 unmock 具有相同的效果。它将拦截 HTTP 流量,并在 unmock 目录中提供语义和功能上足够的 API 模拟。主要区别在于ignore("story")传递给 unmock 选项的结果,它告诉服务忽略模拟请求的顺序。当模拟数据的顺序无关紧要时,即当您处于沙盒或开发模式时,请始终使用此选项。对于unmock.io服务的用户,这将有助于 unmock 在其 Web 仪表板中更好地组织您的模拟。
unmock.io
打印到命令行的 URL 由 unmock.io 托管。您可以在此处查阅有关该服务的文档 。
范围界定
作为初始化和重置 API 调用捕获的便捷快捷方式,我们还通过unmock.patch().
patch接受任何接受的参数作为参数init。
保存模拟
通过向unmock 选项对象.unmock添加一个字段,所有模拟都可以保存到用户主目录中调用的文件夹中,如下所示:save
unmock_options = unmock.init(save=True)
您还可以指定特定位置来保存目录:
unmock_options = unmock.init(save=True, path=".") # Saves in current path
Unmock 通过唯一的哈希引用每个模拟。可以通过将 save 设置为单个哈希或哈希数组来保存单个模拟或模拟组,如下所示:
unmock_options = unmock.init(save=["ahash", "anotherhash", "yetanotherhash"])
忽略模拟的各个方面
有时,您希望 unmock 将两个稍微 API 调用的模拟视为等效。例如,您可能希望GET
为具有不同标头的同一路径的所有调用提供相同的模拟。为此,请使用ignore取消模拟选项对象的字段。您可以在初始化 unmock 时或之后执行此操作(如之前使用 ignoring 所示"story"):
# Option A:
unmock_options = unmock.init()
unmock_options.ignore("headers", "story")
# Option B:
unmock.init(ignore=["headers", "story"])
以下字段可能会被忽略:
headers:请求的标头hostname: 请求的主机名method:请求的方法(即GET、POST、PUT、DELETE)。请注意,这是不区分大小写的!path: 请求的路径story:请求的故事,表示它在一系列请求中的顺序
Ignore 计算正则表达式,因此您也可以通过
"headers|path"而不是["headers", "path"]. 此外,要忽略嵌套的标题,请传递一个字典,例如
{"headers": "Authorization" },或匹配标题的值,{"headers": { Authorization: "Bearer *" }}。当对对象使用忽略方法UnmockOptions时(从对 的调用返回init),您可以传递一个列表 ( *args) 或一个字典 ( **kwargs)。
添加签名
有时,使用唯一签名对模拟进行签名很有用。这很有用,例如,当 AB 测试应该在其他相似条件下为同一端点提供两个不同模拟的代码时。为此,请使用signatureunmock options 对象的字段:
unmock_options = unmock.init()
unmock_options.signature = "signature-for-this-particular-test"
# Equivalent to
unmock.init(signature="signature-for-this-particular-test")
白名单 API
如果您不想模拟特定 API,请将其列入白名单。
unmock_options = unmock.init()
unmock_options.whitelist = ["api.hubspot.com", "api.typeform.com"]
# Equivalent to:
unmock.init(whitelist=["api.hubspot.com", "api.typeform.com"])
unmock.io 代币
如果您订阅了unmock.io服务,您可以将您的 unmock 令牌直接传递给 unmock 对象。
unmock.init(token="my-token")
在某些时候,这变得有点乏味(即使非常易读),此时您将需要创建一个凭证文件。有关凭证文件的更多信息,请参阅
unmock.io/docs。在幕后,我们会自动为您创建一个凭证文件,用于缓存目的。这样,后续调用unmock.init()
将从凭证文件中读取令牌。
贡献
感谢您愿意贡献!我们很快就会有一个贡献页面,详细说明如何贡献。同时,为这个存储库加注星标,打开问题并寻求更多功能和支持!
请注意,这个项目是随 贡献者行为准则一起发布的。参与本项目即表示您同意遵守其条款。
执照
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。