Skip to main content

Unmock Python 客户端

项目描述

取消模拟(Python SDK)

圈子CI 编解码器 PyPI 版本

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:

  1. 如果您使用 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
  1. 您可以使用上下文管理器以范围方式控制使用 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/")
  1. 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() 将从凭证文件中读取令牌。

贡献

感谢您愿意贡献!我们很快就会有一个贡献页面,详细说明如何贡献。同时,为这个存储库加注星标,打开问题并寻求更多功能和支持!

请注意,这个项目是随 贡献者行为准则一起发布的。参与本项目即表示您同意遵守其条款。

执照

麻省理工学院

版权所有 (c) 2018–2019 Meeshkan和其他 贡献者

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

unmock-0.1.2.tar.gz (21.4 kB 查看哈希)

已上传 source

内置分布

unmock-0.1.2-py2.py3-none-any.whl (20.9 kB 查看哈希

已上传 py2 py3