测试相关
自动化测试 —— E2E test

单元测试框架——Unit Test

Jasmine:Behavior-Drive development(BDD) 风格的测试框架,在业内较为流行,功能很全面,自带 assert、mock 功能
Qunit:该框架诞生之初是为了 jquery 的单元测试,后来独立出来不再依赖于 jquery 本身,但是其身上还是脱离不开 jquery 的影子
Mocha:node 社区大神 tj 的作品,可以在 node 和 browser 端使用,具有很强的灵活性,可以选择自己喜欢的断言库,选择测试结果的 report
Jest:来自于 facebook 出品的通用测试框架,Jest 是一个令人愉快的 JavaScript 测试框架,专注于简洁明快。他适用但不局限于使用以下技术的项目:Babel, TypeScript, Node, React, Angular, Vue
karma
是运来跑测试的驱动,可以跑各种各样的测试 单侧或者 endtoend 测试
Karma 是一个基于 Node.js 的 JavaScript 测试执行过程管理工具 ( Test Runner ).。该工具可用于测试所有主流 Web 浏览器, 也可集成到 CI ( Continuous integration ) 工具, 也可和其他代码编辑器一起使用.。这个测试工具的一个强大特性就是, 它可以监控 (Watch) 文件的变化, 然后自行执行。
chain
第三方工具,断言库
环境相关
inquirer
交互式命令行美化工具
常见参数
type:表示提问的类型,包括:input、confirm、 list、rawlist、expand、checkbox、password、editor。
name: 存储当前输入的值。
message:问题的描述。
default:默认值。
choices:列表选项,在某些type下可用,并且包含一个分隔符(separator);
validate:对用户的回答进行校验。
filter:对用户的回答进行过滤处理,返回处理后的值。
when:根据前面问题的回答,判断当前问题是否需要被回答。
pageSize:修改某些type类型下的渲染行数。
prefix:修改message默认前缀。
suffix:修改message默认后缀。示例
const inquirer = require("inquirer");
inquirer.prompt([
{
type:"input",
message:"请输入你的姓名:",
name:"name",
default:"大傻子"
}
]).then(answer=>{
// 用户输入的结果最终会在这里输出
console.log(answer);
});运行测试结果:
? 请输入你的姓名: Condoe Hero
{ name: 'Condoe Hero' }portfinder
自动获取可用端口
背景
使用各种基于 nodeJs 环境下开发的 server 服务下,如何获取可用端口?
往往端口都固定并且被占用,如果想设计一个自动获取的端口工具函数,一般可能会这么写
// 通过net的中间件去进行尝试链接,直到找到不存在的端口号并能注册使用为止
const net = require('net');
var server = net.createServer(() => { })
function nextPort(port: number): number{
// 端口自动+1
return port + 1;
}
function getPort(port: number, callback){
function onListen(data: object) {
// 链接成功,关闭端口并注销事件
callback(null, port);
server.removeListener("error", onError);
server.close();
}
function onError(err) {
// 链接失败,端口重新尝试+1
getPort(nextPort(port));
}
server.once('error', onError);
server.once('listening', onListen);
server.listen(port);
}
getPort(1024, (err,port) => {
console.log(port);
})而 portfinder 正是类似这样的一个中间件
使用
var portfinder = require('portfinder');
portfinder.getPort(function (err, port) {
//
// `port` 说明可以在此作用域使用
//
});
// promise方式
const portfinder = require('portfinder');
portfinder.getPortPromise()
.then((port) => {
//
// `port` 说明可以在此作用域使用
//
})
.catch((err) => {
//
// 不能使用,肯定会返回具体错误信息`err`,比如`Error: listen EACCES: permission denied 127.0.0.1:80`等信息
//
});
portfinder.basePort = 3000; // 默认值: 8000
portfinder.highestPort = 3333; // 默认值: 65535chalk
中文译名:粉笔
可以修改终端输出字符样式
文档相关
jsdoc
根据 JavaScript 文件中注释信息,生成 JavaScript 应用程序、库或模块的 API文档 的工具
/**@function dateAgoFormat
* @description 将时间戳格式化为: xx秒前、xx分前、xx小时前、xx天前、xx周前、xx天前、xx月前、xx年前
* @param {number} t 单位是秒
* @returns {timeUnit}
* {
* time: 3,
* key: 'second'
* } // 3秒前
* @see {@link module:utils/bizdate~timeUnit|函数返回值timeUnit}
* @example
* const timeUnit = dateAgoFormat(new Date().getTime()/1000 - 1)
* const unitToZh = {
* second: '秒前',
* minute: '分钟前'
* }
* console.log(timeUnit.time + unitToZh[timeUnit.key])
* // 1秒前
*/
function dateAgoFormat(t) {
const now = Math.floor(Date.parse(new Date()) / 1000)
const difftime = now - t
const difftimeArrayLen = difftimeArray.length
let timeUnit = {}
let i
for (i = 0; i < difftimeArrayLen; i++) {
if (difftime < difftimeArray[i].time) {
break
}
}
if (i > 0) {
timeUnit.time = Math.floor(difftime / difftimeArray[i - 1].time)
timeUnit.key = difftimeArray[i - 1].key
} else {
// 处理秒
timeUnit.time = difftime
timeUnit.key = 'second'
}
/**
* @typedef timeUnit
* @type {Object}
* @property {number} time 时间值
* @property {string} key 时间粒度: second,minute,hour,day,week,month,year
*/
return timeUnit
}示例
使用命令
./node_modules/bin/jsdoc[tatget] 生成 html 文件

依赖说明
