通过单元测试为API自动生成文档
作者:单元测试 发布时间:[ 2017/1/9 10:22:42 ] 推荐标签:API接口 单元测试
在测试文件中,测试用例的代码调用到了 utils.js 中的 test 方法,该方法的主要作用是接收单元测试的输入和输出并生成相应的文档,其中需要向 test 方法传入一个对象作为参数,对象中的字段解读如下:
agent:调用 API 的代理。
file:生成的文档的文件名称。
group:某一组文档的名称。
title:接口的名称。
method:接口的方法。
params:接口的参数,即输入。
headers: 添加到请求头中的信息。
expect:supertest 的expect。
callback:supertest 方法的 end 的回调函数。
utils.js代码如下:
// utils.js
const path = require('path');
const fs = require('fs');
const mdStr = {};
exports.test = function(obj){
if (!mdStr[obj.group]) {
mdStr[obj.group] = '';
mdStr[obj.group] += '## ' + obj.group + ' ';
}
const fields = {};
mdStr[obj.group] += `###${ obj.title }`${ obj.method }`${ obj.url } #### 参数 `;
mdStr[obj.group] += ' 参数名 | 类型 | 是否必填 | 说明 -----|-----|-----|----- ';
Object.keys(obj.params).forEach(function(param){
const paramVal = obj.params[param];
fields[param] = paramVal['value'];
mdStr[obj.group] += `${ param }|${ paramVal['type'] }|${ paramVal['required'] ?'是':'否'}|${ paramVal['desc'] } `;
});
mdStr[obj.group] += ' #### 使用示例 请求参数: ';
mdStr[obj.group] += '```json ' + JSON.stringify(fields, null, 2) + ' ``` ';
mdStr[obj.group] += ' 返回结果: ';
if (obj.url.indexOf(':') > -1) {
obj.url = obj.url.replace(/:w*/g, function(word){
return fields[word.substr(1)];
});
}
obj.agent[obj.method](obj.url)
.set(obj.header || {})
.query(fields)
.send(fields)
.expect(obj.expect)
.end(function(err, res){
mdStr[obj.group] += '```json ' + JSON.stringify(res.body, null, 2) + ' ``` ';
mdStr[obj.group] += ' ';
if (process.env['GEN_DOC'] > 0) {
fs.writeFileSync(path.resolve(__dirname, './docs/', obj.file + '.md'), mdStr[obj.group]);
}
obj.callback(err, res);
});
}
这样,在根目录创建一个 docs 目录,运行 npm run test:doc 命令,会在 docs 目录下生成文档。如果运行单元测试不想生成文档,直接用 npm test 可以了,相应的package.json配置如下:
"scripts": {
"test": "export NODE_ENV='test' && mocha",
"test:doc": "export NODE_ENV='test' && export GEN_DOC=1 && mocha"
}
如果不想为某个 API 生成文档,不要调用 utils 的 test,直接按原生的写法可以了。
若需要对参数进行签名,可在调用 test 方法时,增加形如 sign: true 的配置,然后在 test 方法中做相应的判断和实现相应的签名。
生成的文档内容形式如下:
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
iOS单元测试mocha、chai、sinon和istanbul实现百分之百的单元测试覆盖率关于单元测试的总结及思考编写更好的Java单元测试的7个技巧Android单元测试框架Robolectric3.0介绍(一)使用Kiwi单元测试总结单元测试如此重要,为什么你不知道Python单元测试??使用装饰器实现测试跳过和预期故障对Controller的单元测试写好单元测试的10个技巧单元测试的重要性Angular单元测试系列??Component、Directive、Pipe 以及ServiceAndroid单元测试的整理提升单元测试体验的利器--Mockito使用总结iOS UnitTest单元测试Vue的单元测试探索(二)
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南