调试与测试连接器
注意
以下信息适用于开发直接集成到 Hummingbot 客户端的 spot 和 perp 连接器的开发者。有关使用 Gateway 开发 gateway 连接器的信息,请参阅 构建 Gateway 连接器。
本节将介绍一些调试和测试代码的方法。在开发过程中,你并非必须使用这些选项,但它们会极大地帮助你完成开发。
作为质量保证(QA)流程的一部分,你必须包含单元测试用例,才能开始代码审查流程。请参考 选项 1:单元测试用例 来编写你的单元测试。
选项 1. 单元测试用例¶
为了使你的贡献被接受进入 hummingbot 仓库,你必须提供至少 80% 的单元测试代码覆盖率。你可以在 test/integration 文件夹中找到单元测试的示例。
提交合并到代码库的单元测试不得直接访问任何外部服务器。所有服务器 API 通信都必须进行模拟(mock)——请参考你所基于的交易所提供的现有示例以获得指导。
警告
在为你的 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())
调用类方法¶
打印 OrderBookTrackerDataSource 中 get_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 一个限价买入订单的示例代码。该脚本不仅测试了 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"
    }
  ]
}
执行 启动调试 命令后,调试器将自动附加到 Hummingbot 进程。Hummingbot 应用程序将显示在 集成终端 中。您可以根据需要进行更改。
PyCharm¶
同样,对于 PyCharm,您需要按照下图所示设置调试配置。

为进行调试,必须在 Python 调试器 设置中启用 Gevent 兼容。参见 Stackoverflow Q&A。
注意
截至本文撰写时,尚无法在 VSCode 或 PyCharm 中为任何 Cython 代码添加断点或日志点。
