测试内核#

注意

这是从旧的 IPython wiki 直接复制过来的,目前正在开发中。开发指南的这一部分中的许多信息已经过时。

IPython 使用其内核框架创建包装内核非常容易。它需要扩展 Kernel 类并实现一组用于核心功能(如执行、历史记录等)的方法。也可以用您选择的语言编写一个完整的内核,实现所有 zmq 端口的监听器。

这些方法实现的任何内核的关键问题是确保它符合消息规范。kerneltest 命令是一种测试已安装内核是否符合消息规范并验证结果的方法。

内核测试工具#

kerneltest 工具是 IPython.testing 的一部分,并且也被包含在类似于 iptest 的脚本中。它需要两个参数 - 要测试的内核名称和测试脚本文件。测试脚本文件应为 json 格式,如下一节所述。

kerneltest python test_script.json

您还可以向命令传递一个可选的消息规范版本。目前仅支持版本5,但随着新版本的发布,这可以用于针对特定版本的内核进行测试。

kerneltest python test_script.json 5

需要安装待测试的内核,并且用户 IPython 目录中可用的 kernelspec。该工具将实例化内核并通过 ZMQ 发送命令。对于在内核上执行的每个命令,该工具将验证回复以确保其符合消息规范。在某些情况下还会检查输出,但回复总是返回并在控制台上打印出来。这可以用来验证除了满足消息规范外,内核还生成了正确的输出。

测试脚本文件#

测试脚本文件是一个简单的json文件,它指定了要执行的命令和为该命令执行的测试代码。

{
    "command":{
           "test_code":<code>
    }
}

对于消息规范中的一些命令,如kernel_info,无需指定test_code参数。工具会验证是否具备执行该命令所需的所有输入,并在发现缺失参数时向控制台输出错误信息。由于验证功能内置,且仅传递必需参数,因此可以在json文件中添加额外的字段用于测试文档。

{
    "command":{
           "test_name":"sample test",
           "test_description":"sample test to show how the test script file is created",
           "test_code":<code>
    }
}

一个用于redis内核的测试脚本示例如下所示

{
  "execute":{
    "test_code":"get a",
    "comments":"test basic code execution"
  },
  "complete":{
    "test_code":"get",
    "comments":"test getting command auto complete"
  },
  "kernel_info":{
    "comments":"simple kernel info check"
  },
  "single_payload":{
    "test_code":"get a",
    "comments":"test one payload"
  },
  "history_tail":{
    "test_code":"get a",
    "comments":"test tail history"
  },
  "history_range":{
    "test_code":"get a",
    "comments":"test range history"
  },
  "history_search":{
    "test_code":"get a",
    "comments":"test search history"
  }
}