引子
由于 Nebula Graph 在持续研发过程中会频繁地更改返回数据的格式,这样就会造成了上层应用程序无法正确解析数据。
比如在 v2.0.0 发布的时候,改变了 SHOW JOBS 的格式,造成了 Studio 解析的时候页面崩溃。
为了避免再次发生这样的悲剧问题,可以使用 Nebula Graph 提供的测试框架,方便地增加测试用例。
环境准备
按照文档《源码编译安装》 中所示,我们可以参考以下步骤进行操作:
a. 准备一台开发机,这里给出了开发环境的配置要求。
- Python3 要求的最低版本为 Python 3.7.
python3 --version
b. 按照文档中步骤编译源代码。选择 master 版本,并拉一个分支
git checkout -b dev tck
具体步骤可以见 Nebula 文档站中如何贡献中的 GitHub 使用步骤部分 。
c. 安装 case 运行环境
$ cd nebula-graph/tests/
$ make init-all
如果遇到模块版本过低,可以根据提示升级版本,比如:命令 pip3 install --upgrade keyrings.alt
。
d. 运行已有case
make test
开发 case
研究一下已有 case
大多数已有 case 都在 https://github.com/vesoft-inc/nebula-graph/tree/master/tests/tck/features 目录下,根据主要功能放在不同目录下。
例如,以最常用的 MATCH 功能举例。打开 GitHub 目录下的 match/MatchById.feature 文件
Feature: Match By Id
Background:
Given a graph with space named "basketballplayer" # 选择一个已有的单元测试数据集 basketballplayer
Scenario: single node # 给这个 case 取个名字
When executing query: # 以下三引号之间的部分,为发送给 Nebula Graph 的文本。
""" # 这句话的目的,是获vid为James Harden的点
MATCH (n) WHERE id(n) == 'James Harden' RETURN n
""" # Then 表示测试结果匹配
Then the result should be, in any order, with relax comparison:
| n | # 期望获取的文本结果,应该是这样一个格式。列名为 n
| ("James Harden") | # 内容为 "James Harden", 圆括号表示这是一个点
When executing query: # 开始下一个命令。
"""
MATCH (n) WHERE id(n) == 'not_exist_vertex' RETURN n
"""
Then the result should be, in any order, with relax comparison:
| n |
nebula-test 是基于 BDD 思想撰写的,这些 feature 文件基本是自然语言(gherkin文本),BDD 介绍文章可参考:《基于 BDD 理论的 Nebula 集成测试框架重构(上篇)》。
这里简单地解释一下 case 用例模版主要的格式:
- Feature:介绍整个文本是做什么的;
- Background:设置一下公共的运行环境,例子中,选用了一个已经存在的数据集 basketballplayer(建立了schema,index,写入了数据);
- Scenario:一组
When-Then
的组合,是一个最小的并发执行单位; - When executing query:向 Nebula Graph 发送一组命令;
- Then the result should be:从 Nebula Graph 获取结果,和下面的期望结果对比;
这个对比方式可以有以下几种:
- the result should be:需完全一样 (行、列、单元格内容都必须一模一样);
- the result should contain:只包含以下内容即可;
- the result should be, in any order:返回结果的行顺序无关(对于行 1 和行 2 的顺序没有要求);
- the result should be, in any order, with relax comparison:结果集需要是以下形式,行顺序无关,并且至少包括以下内容(例如,每个单元格至少包括"Tiago Splitter",但可以比这个多);
- the execution should be successful:返回码为成功;
- an ExecutionError should be raised at runtime: not existed! 执行失败,抛出异常ExecutionError,且返回错误码为 not existed!;
尝试自己撰写一个 case
假设现在我们的目的是检查一下SHOW JOBS
的返回格式,可以这么操作:在 nebula-graph/tests/tck/features/job/(nebula-graph/tests/tck/features/job at master · vesoft-inc/nebula-graph · GitHub) 下增加一个 JobCommands.feature 的文件
@mintest #用于调试
Feature: Job compact, flush, rebuild_index
Background: # 选择数据集
Given a graph with space named "basketballplayer"
Scenario: submit job
When executing query:
"""
SUBMIT JOB COMPACT;
"""
Then the result should contain:
| New Job Id |
| /\d+/ | # 用正则表达式检查为正数
When executing query:
"""
SUBMIT JOB FLUSH;
"""
When executing query:
"""
SUBMIT JOB STATS;
SHOW JOBS;
"""
Then the result should contain: # 检查返回形式
| Job Id | Command | Status | Start Time | Stop Time |
| /\d+/ | "STATS" | /\w+/ | /\d+-\d+-\d+T\d+:\d+:\d+/ | /\d+-\d+-\d+T\d+:\d+:\d+/ |
调试 case
nebula-graph/tests> make fmt
检查格式错误,并格式化文件。
nebula-graph/tests> pytest -m "mintest"
运行刚撰写的 case,通常要来回更改多次。用#
号注释。也可以用 @skip
标注跳过整个 Scenario。
nebula-graph/tests> pytest -n4
如果内存有限,-n4 控制并发度。
更多说明可以参见这里:nebula-graph/tests at master · vesoft-inc/nebula-graph · GitHub 。
通过 git 向 Nebula Graph repo 增加该 case
如果所有的测试都已经通过,将调试标记 @mintest
去掉,通过 git 指令向 Nebula Graph 仓库提交一个 pull request,参考 如何贡献 。
交流图数据库技术?加入 Nebula 交流群请先填写下你的 Nebula 名片,Nebula 小助手会拉你进群~~