Jest实战:单元测试与服务测试
需求与思路一名好的大前端开发人员,一定是一名好的“配置工程师”(滑稽脸)。被安排给 vemoJS 和 cloudbase-cli 写测试用例,并且要保证覆盖率!
这里主要以 vemojs 下的测试用例为主来讲解 Jest 要注意的地方。测试代码在:https://github.com/vemoteam/vemo/tree/master/test
观察 vemojs 这个项目,如果想进行全面测试,需要解决以下问题:
以 utils.js errror.js 等文件,对应的是单元功能测试
以 cloudbase.js 文件为代表的,需要请求远程 API,模拟不同的情况
以 index.js 中的 http 和静态服务器为代表的,测试服务是否正常启动
以 index.js 中的 websocket 服务为代表的,模拟用户使用环境,测试 ws 是否正常
提供测试覆盖率
针对以上问题,解决思路总结如下:
函数功能测试:断言匹配功能
请求 API:mock 模块和函数,例如测试用例中的 axios 就是被 mock 的
http 和静态服务:测试代码中启动服务后,利用 axios 等第 ...
Jest进阶:接入ts、集成测试与覆盖率统计
接入 TypeScript在给 vemojs 做完各种测试之后,很快又有了新的要求,给 clousebase-cli 编写测试用例。有个问题摆在眼前:它是用 typescript 编写,所以需要配置相关环境。
好吧,不说废话了,直接上干货。
jest.config.js 配置内容如下,解释在注释里面:
123456789101112131415module.exports = { roots: [ '<rootDir>/test', // 测试目录 ], transform: { '^.+\\.tsx?$': 'ts-jest', // 匹配 .ts 或者 .tsx 结尾的文件 }, collectCoverage: true, // 统计覆盖率 testEnvironment: 'node', // 测试环境 setupFilesAfterEnv: [ '<ro ...
负载均衡:轮询调度算法实现
最近在学习 cluster 的时候,了解到它的负载均衡以及 NGINX 的负载均衡都是基于“轮询调度”算法来实现的。它由 Round Robin 提出,所以又称为“rr 算法”。除此之外,负载均衡使用的是基于权重的“wrr 算法”。为了深入理解,我这里都做了实现。
RR 算法它的实现思路是:每一次把来自用户的请求轮流分配给内部中的服务器,从 1 开始,直到 N(内部服务器个数),然后再从头开始分配。一直重复以上过程。
毫无疑问,它的优点是实现简单,而且不需要统计服务器状态以及连接状态,是无状态调度,所以消耗极低。在配置基本一致的集群上,使用这种算法即可。
在实现过程中,利用了 es6 提供的生成器,方便调用。请看下面的代码:
123456789101112131415161718function* rr(num) { let i = 0 while (1) { yield i++ % num }}/** * 测试代码 */const NUM = 5const reqTimes = 20const cluster = ...
NodeJS实现简易区块链
之前由于课程要求,基于 Nodejs 做了一个实现简易区块链。要求非常简单,结构体记录区块结构,顺便能向链中插入新的区块即可。
但是如果要支持多用户使用,就需要考虑“可信度”的问题。那么按照区块链要求,链上的数据不能被篡改,除非算力超过除了攻击者本身之外其余所以机器的算力。
想了想,就动手做试试咯。
技术调研 🔍在 google 上搜了搜,发现有个项目不错: https://github.com/lhartikk/naivechain 。大概只有 200 行,但是其中几十行都是关于搭建 ws 和 http 服务器,美中不足的是没有实现批量插入区块链和计算可信度。
结合这个项目,基本上可以确定每个区块会封装成一个 class(结构化表示),区块链也封装成一个 class,再对外暴露接口。
区块定义为了方便表示区块,将其封装为一个 class,它没有任何方法:
1234567891011121314151617181920/** * 区块信息的结构化定义 */class Block { /** * 构造函数 * @param {Number ...
ES6重难点整理
👇 内容速览 👇
let 和 const
Set 和 Map
Generator 和 yield
Promise、async/await 介绍
Proxy 代理器
…
let 和 constES6 新增了let和const,它们声明的变量,都处于“块级作用域”。并且不存在“变量提升”,不允许重复声明。
同时,const声明的变量所指向的内存地址保存的数据不得改变:
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),不能保证指向的数据结构不可变。
如果要保证指向的数据结构也不可变,需要自行封装:
1234567891011121314151617181920212223242526272829303132333435363738/** * 冻结对象 * @param {Object} obj * @return {Object} */ ...
谈谈promise-async-await的执行顺序与V8引擎的BUG
1. 题目和答案
故事还是要从下面这道面试题说起:请问下面这段代码的输出是什么?
12345678910111213141516171819202122232425262728console.log("script start");async function async1() { await async2(); console.log("async1 end");}async function async2() { console.log("async2 end");}async1();setTimeout(function() { console.log("setTimeout");}, 0);new Promise(resolve => { console.log("Promise"); resolve();}) .then(function() { console ...
Promise概述
关于Promise
Promise实例一旦被创建就会被执行
Promise过程分为两个分支:pending=>resolved和pending=>rejected
Promise状态改变后,依然会执行之后的代码:
123456789const warnDemo = ctx => { const promise = new Promise(resolve => { resolve(ctx); console.log("After resolved, but Run"); // 依然会执行这个语句 }); return promise;};warnDemo("ctx").then(ctx => console.log(`This is ${ctx}`));
then方法在Console键入以下内容:
12let t = new Promise(() => {});t.__proto__;
可以看到,then方法是 ...
VemoJS源码拆解
主要分析下 src 文件夹下的代码。从简单到难吧:
utils.js按照命名,肯定是封装一些常用的方法。这里只提供了一个 cpuNum 的 getter 接口。
这个是计算当前计算机的 cpu 核心数目,用于决定开启多大的集群进程。为了保证效率,最小的返回值是 4。
error.js主要从 Error 对象上继承并且创建了新对象: VemoError 。对象构造函数上, 设计了一个有关此框架的错误状态码的信息 。
除了 VemoError ,还暴露了一些错误的代号定义。
cluster.js对外暴露了自定义的高并发集群代码,它引用了同级的 ./process.js 封装的管理类,并且初始化了它。它的具体含义请见”process.js”中的讲解。
cloudbase.jsgetLocalSecret 方法是读取本地用户的根目录中的 .tcbrc.json 配置文件,并且将 Id 和 Key 放入 process.env 变量中。
getTempSecret 方法是获取云主机的临时密钥:
正常情况下,访问远程地址,获取 id、key、token 和过期时间,并且放入 proc ...
单元测试
一般而言我们若不借助工具开发者工具做测试的话,会采用以下几种测试方法为了方便我们新建一个文件夹用来存放此次测试的文件:mkdir API-testing。
1.常规测试cd API-testing后新建一个文件。math.js
123456789101112module.exports = { add:(...args) => { return args.reduce((prev, curr)=>{ return prev + curr; }) }, mul:(...args) => { return args.reduce((prev, curr)=>{ return prev * curr; }) },}
上面编写完我们需求测试的函数功能后紧接着我们根据需求来新建另一个文件来进行常规测试,改功能模块是否符合达到自己需求的标准。simple ...
ServiceWorker离线缓存实战
背景介绍最近实战了 Service Worker(以下简称“sw”)来进行网站缓存,以实现离线状态下,网站仍然可以正常使用。
尤其对于个人博客这种以内容为主体的静态网站,离线访问和缓存优化尤其重要;并且 Ajax 交互较少,离线访问和缓存优化的实现壁垒因此较低。
环境准备虽然 sw 要求必须在 https 环境下才可以使用,但是为了方便开发者,通过localhost或者127.0.0.1也可以正常加载和使用。
利用 cnpm 下载http-server:npm install http-server -g
进入存放示例代码的文件目录,启动静态服务器:http-server -p 80
最后,准备下 html 代码:
1234567891011121314151617181920212223<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" c ...