跳转至内容

调试和测试连接器

注意

以下信息适用于构建直接集成到 Hummingbot 客户端的 spotperp 连接器的开发者。有关使用 Gateway 开发 gateway 连接器的信息,请参见 构建网关连接器

本节将介绍一些调试和测试代码的方法。在开发过程中,您不需要使用这些选项,但它们将对此过程有很大帮助。

作为 QA 流程的一部分,您需要包含单元测试用例才能开始代码审查流程。请参阅选项 1:单元测试用例来构建您的单元测试。

选项 1. 单元测试用例

您需要提供至少 80% 的单元测试代码覆盖率,才能使您的贡献被 hummingbot 仓库接受。单元测试示例可在 test/integration 文件夹中找到。

提交到代码库进行合并的单元测试不得直接访问任何外部服务器。所有服务器 API 通信必须被模拟 — 请参考您基于的交易所提供的现有示例以获取指导。

警告

在为 PR 提交编写单元测试时,请特别注意不要包含任何 API 身份验证凭据。

选项 2. aiopython 控制台

此选项主要用于测试特定功能。考虑到许多功能都是异步函数,在 aiopython 控制台中测试这些功能会更容易。点击此处查看有关如何使用 aiopython 的一些文档。

编写简短的代码片段来检查 API 响应和/或代码库中某些函数的工作方式将有助于您理解这些函数的预期副作用以及 Hummingbot 客户端的整体逻辑。

发起 API 请求

下面是一个简短示例,说明如何编写一个短的异步函数来模拟 API 请求下单并显示收到的响应。

# Prints the response of a sample LIMIT-BUY Order
# Replace the URL and params accordingly.

>>> import aiohttp
>>> URL="api.test.com/buyOrder"
>>> params = {
...     "symbol": "ZRXETH",
...     "amount": "1000",
...     "price": "0.001",
...     "order_type": "LIMIT"
... }
>>> async with aiohttp.ClientSession() as client:
...    async with client.request("POST",
...                              url=URL,
...                              params=params) as response:
...        if response == 200:
...            print(await response.json())

调用类方法

打印 OrderBookTrackerDataSourceget_active_exchange_markets() 函数的输出。

在此示例中,我们将使用 BittrexAPIOrderBookDataSource:

>>> from hummingbot.market.bittrex.BittrexAPIOrderBookDataSource import BittrexAPIOrderBookDataSource as b
>>> await b.get_active_exchange_markets() 

                 askRate baseAsset        baseVolume  ...             volume     USDVolume old_symbol
symbol                                                ...
BTC-USD    9357.49900000       BTC  2347519.11072768  ...       251.26097386  2.351174e+06    USD-BTC
XRP-BTC       0.00003330       XRP       83.81218622  ...   2563786.10102864  7.976883e+05    BTC-XRP
BTC-USDT   9346.88236735       BTC   538306.04864142  ...        57.59973765  5.379616e+05   USDT-BTC
.
.
.
[339 rows x 18 columns]

选项 3. 自定义脚本

此选项与选项 2 类似,主要用于测试特定功能。这在调试各种函数/类如何相互交互时非常有用。

例如,初始化一个简单的 websocket 连接以监听并输出所有捕获的消息,以检查下订单/取消订单时的用户流消息。这有助于确定要使用的确切响应字段。

例如,一个用于构建请求认证签名的简单函数。这与 POSTMAN 一起使用可检查您是否为相应请求生成了适当的认证签名。

API 请求:POST 订单

以下是在 Bittrex 上 POST 一个 LIMIT-BUY 订单的示例代码。此脚本不仅测试了 BittrexAuth 类,还输出了 API 服务器的响应。

#!/usr/bin/env python3

import asyncio
import aiohttp
from typing import Dict
from hummingbot.connector.exchange.bittrex.bittrex_auth import BittrexAuth

BITTREX_API_ENDPOINT = "https://api.bittrex.com/v3"

async def _api_request(http_method: str,
                       path_url: str = None,
                       params: Dict[str, any] = None,
                       body: Dict[str, any] = None,
                       ):
    url = f"{BITTREX_API_ENDPOINT}{path_url}"

    auth = BittrexAuth(
        "****",
        "****"
    )

    auth_dict = auth.generate_auth_dict(http_method, url, params, body, '')

    headers = auth_dict["headers"]

    if body:
        body = auth_dict["body"]

    client = aiohttp.ClientSession()

    async with client.request(http_method,
                              url=url,
                              headers=headers,
                              params=params,
                              data=body) as response:
        data: Dict[str, any] = await response.json()
        if response.status not in [200,201]:
            print(f"Error occurred. HTTP Status {response.status}: {data}")
        print(data)

# POST order
path_url = "/orders"

body = {
    "marketSymbol": "FXC-BTC",
    "direction": "BUY",
    "type": "LIMIT",
    "quantity": "1800",
    "limit": "3.17E-7",  # Note: This will throw an error
    "timeInForce": "GOOD_TIL_CANCELLED"
}

loop = asyncio.get_event_loop()
loop.run_until_complete(_api_request("POST",path_url=path_url,body=body))
loop.close()

选项 4:使用调试器工具

本节将详细介绍从您选择的 IDE 运行调试器工具所需的配置/设置。

VS Code

将以下调试配置包含到 launch.json 配置文件中

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Hummingbot Application",
      "type": "python",
      "request": "launch",
      "program": "${workspaceRoot}/bin/hummingbot.py",
      "console": "integratedTerminal"
    }
  ]
}

通过执行 Start Debugging 命令,调试器将自动附加到 Hummingbot 进程。Hummingbot 应用将在 integratedTerminal 中出现。您可以根据需要更改此设置。

PyCharm

同样,对于 PyCharm,您需要设置调试配置,如下图所示。

PyCharmDebugConfiguration

调试时必须启用Python 调试器设置中的Gevent 兼容。参见Stackoverflow 问答

注意

截至目前,无法在 VSCode 或 PyCharm 中的任何 Cython 代码中添加断点/日志点。