API LEAF:基于测试生成API文档

前言

当下的web开发中,前后端分离的体制基本已经成型,这时候一份好的API文档对于前后端沟通来说是十分重要的桥梁。

但现实是,书写API文档对于后端开发人员来说一直是一件十分头疼的事情,虽然有着诸如Java Doc、Api Doc这样的工具,生成API文档依然需要后端人员手动填充大量的内容,而且生成的文档可维护性差,稍有修改就需要重新执行生成新的文件,或是依赖于某种语言和框架,不够通用...

综合长时间书写API文档的痛苦体验,一个全新的思路诞生了,那就是把文档生成这道工序从代码中剥离出来,使用测试来生成文档。

基于这样的思路,不洗碗工作室开发了使用测试来生成和管理API文档的工具一叶(Api Leaf)

基于HTTP的接口测试

后端开发人员不可避免的需要对自己的接口发送模拟的HTTP请求,来测试结果。通常我们会使用POSTMAN这样的工具来进行测试。

实际上,一个成功的测试所包含的请求内容和响应内容,本身就可以作为文档的参考(很多文档里都会附有这样的请求和响应示范)。事实上,在我们团队早期的开发工作中,也经常利用POSTMAN测试后生成的COLLECTION来进行前后端的沟通,它大概是下面这样的:

但实际上这样生成的测试用例集合可读性非常差,而且不好维护和管理,于是我们又需要在测试完之后去手动的书写文档,再把测试用例复制进文档里当做示范...一个复杂的API文档就要书写很久,实在是打击后端开发人员的积极性。

基于测试结果提取API信息

仔细的分析一下,API文档中所包含的内容无非是请求和响应字段有哪些,分别是什么含义,实际上这些内容已经包含在测试的请求和响应体中了。

所以不妨来对这些信息进行一些抽象,请求和响应的数据一般都是JSON数据,前端在阅读文档时,真正关心的有以下的内容:

  • 字段的名称,也就是json的key

  • 字段值的类型,也就是json的valuetype

  • 字段值的描述,这是对字段更详细的一些说明,包括一些表单的验证规则等(并不是每个字段都必要的)

  • 数据的结构,主要是对象或者是数组之间的嵌套关系

那么这些值是否都可以从一个完整的测试数据中提取出来呢,如果可以的话,把这些工作交给代码去生成,可就解放了后端人员的双手和心智。

答案是肯定的,我们把文档中的一项(表格中的一行)抽象成下面这样一个对象:


{

key:...

type:...

description�:...

}

通过按照层级遍历JSON对象的每一个属性很容易得到它,key自然是自动填充的,type可以根据代码推断,只有description需要人手工去填写,而这个字段还不是必要的...

剩下的问题是考虑遍历之后如何去保留对象之间的层级关系,比如下面这个JSON响应:


{

"code": 0,

"data": {

"problems": [

{

"id": 1001,

"title": "A+B(基本输入输出1)",

"difficulty": 2,

"source": "",

"submit": 3403,

"accepted": 1765,

"is_public": 1,

"created_at": "2014-01-17 00:18:19",

"updated_at": null,

"name": "basic",

"tags": [

{

"tag_title": "basic",

"tag_id": 1

}

]

}

],

"total_count": 576

}

}

最外层的对象中包含了codedata两个属性,data中又包含了一个名为problems的数组,problems中的每个对象又拥有诸多属性...

想要记录下结构其实也并不复杂,我们只需要记录下子属性的父属性就可以了。换句话说,你只要知道这个字段是隶属于哪个字段的,总能顺藤摸瓜一路摸清整个JSON的结构,就好像树这种数据结构的遍历一样。

使用代码进行简单的层级遍历和筛选,最终可以得到像下面这样的文档结构:

由于层级遍历的顺序,最终结果的排列顺序也是从最外层向最内层扩充的,具有很高的可读性。

最后我们需要对包含多个同样模型的对象数组做个筛选,只保留它的第一个元素就足以生成文档了。

整个测试的所有部分基本上都可以这样处理,包括请求头、query string、请求体、响应头、响应体,根据需要来进行组合,把所有测试的API集合在一起,最终就是一份完整的API文档了。

使用一叶生成文档

上述的思路已经在我们的测试用工具一叶中实现了。利用这个工具,书写API文档的时间已经被大大压缩,一个API的文档生成平均只需要几秒钟就可以解决了,现在让我们来看看如何使用这套工具。

创建项目

一叶的文档是根据项目生成的,因此在开始生成文档前你需要先创建自己的项目,登录注册后的主面板上可以看到你所创建的项目和参与的项目

进行测试

首先访问一叶的网站: 并注册登录,在右上角的下拉菜单中,选择“发起测试”后会跳转到下面这个页面:

这是使用JS和FETCH技术实现的在线的请求测试工具,使用起来的感觉和POSTMAN几乎一样。由于使用了和前端请求一样的FETCH方式,使用它进行测试你还可以检查到一些其他的bug,比如请求的跨域问题等等。

输入URL进行测试,填写好测试用的body和headers就可以发起请求,进行测试,收到响应后Response中将会显示请求的header和body。

生成文档

确定你测试的请求和响应没有异常之后,就可以立刻生成该API的文档,点击最下方的“生成文档”按钮就可以开始文档的生成了,这时候一叶会根据JSON的内容自动解析好文档项的结构,并以json的方式展示出来。

每个可能需要生成文档的部分都会被自动解析成这样的包含key,type,description三部分的结构,其中只有description字段需要手动填写(如果不需要也可以不填留空),对于不需要生成文档的部分可以在左上角取消勾选来忽略。

填写好必要的description字段后别忘了填写API的基本信息:所属的项目、名称、以及分类(GROUP),最后点击生成文档,该API的文档就完成了,这时候会显示如下的预览界面:

分享项目文档

最终一个项目文档的展示页面如下:

提供了非常多的辅助筛选、定位、排序功能,方便前端人员的查阅

生成文档后你需要把自己的项目文档发送给前端使用,这非常的简单,只要把查看文档的链接复制分享就可以了。

一个项目的文档将随着你的添加和更改自动变化,你不用再担心文档的维护问题,只要做好测试,其他的一切都是自动的了。

其他

文档的生成在较大型的公司中一般会使用根据框架专门编写的自动化测试和生成工具,但是对于中小型开发团队来说,开发这样的工具成本太高,代价太大,手工去书写又耗费时间,这时候就非常适合使用一叶这样的通用工具来生成和共享文档。

本项目目前代码开源在GitHub上,地址:https://github.com/MarkLux/ApiLeaf

基于PHP的Laravel框架开发,如果公司内部对API有保密需要,也完全可以在内部服务器中快速搭建一叶平台进行内部测试交流。

目前本项目已经经过一次内部测试,并且仍在持续开发中,欢迎广大开发者试用并提出宝贵意见。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,047评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • iMac(一体机)、MacBook(笔记本)又分Air和Pro、Mac mini、各代iPhone、iPod To...
    李琪_59dc阅读 2,242评论 0 5
  • 记得曾经好男儿的时候因为你很帅所以很喜欢你,后来你好像出现得不多了,直到《我们相爱吧》,那时候看觉得你好像有点腻,...
    yy日常阅读 582评论 2 3