接口测试,是一种灰盒测试。
在进行接口测试过程中,我们经常需要通过数据库对比检查来判断接口执行的结果是否正确。
但是 Postman 并没有提供数据库的查询。就无法通过 Postman 去连接数据库验证数据的正确性。
好在,有一款基于 node.js 的工具 Xmysql可以将数据库的表数据转换成 Restful API 接口,返回 JOSN 格式的数据结果。
重度声明:此款工具仅能用于测试环境,因为这款工具会造成严重的数据安全问题。
不过测试本来就在测试环境,所以测试使用在一定的安全性意识前提下,是没有太大问题的。
接下来,我们就来看看这款工具如何使用。
1. 安装部署
1.1 安装 Node.js
Xmysql 是基于 Node.js 开发的,需要安装 Node.js 环境。Node.js 的安装直接从 [node.js 中文网] 下载无脑安装即可。
建议:不要随便更改其安装目录。
安装完成后,在命令行窗口输入npm --version
npm是 Node.js 的包管理工具,用来安装基于 Node.js 相关的软件。
1.2 安装Xmysql
在 Node.js 安装好后,执行如下命令;
npm install -g xmyql
-g 参数是指全局安装,对当前操作系统所有用户有效。
安装好以后,输入如下命令检查是否安装成功。
xmysql --version
2. Xmysql 基本使用
xmysql 安装好以后,就可以直接在命令行启动 xmysql 服务。启动命令如下:
xmysql -h localhost -u root -p root -r 172.31.18.163 -d ecshop2
参数说明:
-h localhost:指定数据库服务器所在的 IP 地址;
-u root:指定访问数据库的账号(注意,直接使用 root 账号极度危险);
-p root:指定访问数据库的密码,与上面的账号配套;
-r 172.31.18.163:指定访问的 API 的 IP,这样可以跨服务器访问,否则只能使用 localhost 和 127.0.0.1 进行本机访问;
-d ecshop2:指定具体的数据库,这里的数据库名为 ecshop2。
服务启动后的界面如下,如果没有启动成功,请根据上面的参数逐一检查。我们可以看到 ecshop2 库一共有 88 张表,生成了 1681 个 API 接口。
服务器启动成功后,我们就可以通过 http://172.31.18.163:3000 访问,会展示所有的 1681 个 API 接口的地址:
如果启动服务后,数据库的 Number of Tables数量为0,那么就是数据库没有连接成功:
xmsql 服务启动失败
遇到上图的情况就根据提示信息检查参数值,可通过 Ctrl+C 结束服务,修改参数后再重新启动。
3. Xmysql API 介绍
3.1 常见 API
由 xmysql 提供最常用的一些 API。包括获取整张表,获取表中某行数据,修改某行数据,删除某行数据等,也就是常见的增删改查。这些操作的执行都通过指定主键ID来完成。
3.1.1 获取整张表所有数据
通过 GET 请求某一个表名,获取整张表的数据。
GET /api/表名
GET http://172.31.18.163:3000/api/ecs_users
这里查询整张 ecs_users 表。
3.1.2 查询某一行数据
通过在 URL 中指定某一行的主键,查询改行的数据。这里的 ecs_users 表的主键为 user_id。
注:这个方法和后面的方法 ID 都是直接使用该表的主键。比如 ecs_users 表的主键为 user_id, 那么这里的 ID 就是指 user_id, 比如 ecs_goods_type 表的主键为 cat_id ,那么这里的 ID 就是指 cat_id。
GET /api/表名/id
GET http://172.31.18.163:3000/api/ecs_users/2
3.1.3 创建一条数据
通过 POST 方法在对应的表中增加一条数据。
POST /api/表名(PUT也是创建)
这里使用 ecs_goods_type 表演示。该表结构如下:
构造请求如下:
POST http://172.31.18.163:3000/api/ecs_goods_type
PUT http://172.31.18.163:3000/api/ecs_goods_type
参数名与表字段名一致
检查数据库结果,新增了一条 ID 为 25 的数据。
3.1.4 修改某行数据
依然以 ecs_goods_type 表为例,修改我们刚才添加的 ID 为 25 的数据。
PATCH /api/表名/id
PATCH http://172.31.18.163:3000/api/ecs_goods_type/25
3.1.5 统计表的行数
返回表的所有行的计数,也就是表有多少记录。
GET /api/表名/count
GET http://172.31.18.163:3000/api/ecs_goods_type/count
3.1.6 删除行
删除指定的行。
DELETE /api/表名/id
删除ecs_goods_type表中 ID 为 25 的行。
DELETE http://172.31.18.163:3000/api/ecs_goods_type/25
3.1.7 根据外键查询
根据父表中的 ID 查询关联的子表中的数据。
GET /api/parentTable/id/childTable
比如电商系统中,ecs_order_info 为主表,ecs_order_goods为辅表。
通过订单信息表 ecs_order_info 中的订单 ID 查询ecs_order_goods订单详情表中的订单商品数据。
GET http://172.31.18.163:3000/api/ecs_order_info/5/ecs_order_goods
查询订单 ID 为 5 的订单商品数据。
由于我暂时没有找到有关联的表,所以无法贴上结果,请各位自行尝试。
3.1.8 分组查询
可以通过 groupby 接口进行分组查询,通过内置的参数_fields指定分组的字段。
GET /api/表名/groupby?_fields=分组的字段
如下示例查询ecs_goods表,指定通过 goods_name进行分组查询。
GET http://172.31.18.163:3000/api/ecs_goods/groupby?_fields=goods_name
还有一种 ugroupby 接口,同样是分组统计,只是返回的结果格式不一样,对比一下。
GET http://172.31.18.163:3000/api/ecs_goods/groupby?_fields=goods_name