Skip to content
字数
1208 字
阅读时间
6 分钟

测试相关

自动化测试 —— 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

交互式命令行美化工具

常见参数

txt
type:表示提问的类型,包括:input、confirm、 list、rawlist、expand、checkbox、password、editor。
name: 存储当前输入的值。
message:问题的描述。
default:默认值。
choices:列表选项,在某些type下可用,并且包含一个分隔符(separator);
validate:对用户的回答进行校验。
filter:对用户的回答进行过滤处理,返回处理后的值。
when:根据前面问题的回答,判断当前问题是否需要被回答。
pageSize:修改某些type类型下的渲染行数。
prefix:修改message默认前缀。
suffix:修改message默认后缀。

示例

js
const inquirer = require("inquirer");
inquirer.prompt([
    {
        type:"input",
        message:"请输入你的姓名:",
        name:"name",
        default:"大傻子"
    }
]).then(answer=>{
    // 用户输入的结果最终会在这里输出
    console.log(answer);
});

运行测试结果:

js
? 请输入你的姓名Condoe Hero
{ name: 'Condoe Hero' }

portfinder

自动获取可用端口

背景

使用各种基于 nodeJs 环境下开发的 server 服务下,如何获取可用端口?

往往端口都固定并且被占用,如果想设计一个自动获取的端口工具函数,一般可能会这么写

js
// 通过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 正是类似这样的一个中间件

使用

js
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; // 默认值: 65535

chalk

中文译名:粉笔
可以修改终端输出字符样式

文档相关

jsdoc

根据 JavaScript 文件中注释信息,生成 JavaScript 应用程序、库或模块的 API文档 的工具

js
/**@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 文件

依赖说明

64923

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写