js debug and log and test
开篇比较大,后续有新感知再继续完善
一直使用的是console.log()
来打印输出的形式,来debug,如果利用一下chrome的devtool工具来帮助我们debug会带来很大的遍历,如果有后端基础,例如javaweb中常用的log4j
,强大的junit
,这些辅助工具可以在项目的运行中给予我们很多的信息,可以快速的定位bug
chrome js debug
参考:在 Chrome DevTools 中调试 JavaScript 入门(需翻墙)
总结:
重现错误始终是调试的第一步。参考中的例子就是:
输入5,再输入1,点击相加按钮,结果却是51
找到错误后,打断点
- 开发者工具
- 进入 Sources 标签
- 点击 Event Listener Breakpoints(在最右边或者下面,看你拉伸的宽度)
事件监听断点可以对事件进行断点查看,例如我们的错误是点击相加按钮后出现了错误的结果,此时,我们就可以在 Mouse一栏中展开勾选click,注意在已经输好的5和1的情况下
tip:单步调试的几个常用按钮:
Step into next function call
: 步进,遇到函数就进入内部
Step over next function call
: 步进,但遇到函数就跳过(对其求值但不进入)
step out of current function
: 跳出当前函数
打好断点后,可以直接调试,点击相加按钮,此时会跳到一个 document.addEventListener("click", event => ...
,这里与官网讲述的不同,需要跳过这个函数,然后就到了function onClick() {
这样找到大致区域后,可以设置代码行断点,直接在源码上打断点即可,之后点Resume script execution
,可以快速执行到断点行处
function updateLabel() {
var addend1 = getNumber1();
var addend2 = getNumber2();
var sum = addend1 + addend2;
// 在这行打断点即可
label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
}
查看变量值
- Sources 面板上
- 点击 Watch
- Add Expression +
- 输入你想监测的变量或者表达式
例如: typeof sum
,结果是string
利用Console
Console 可帮助您测试刚发现的错误的潜在解决方法,可以:输入变量的名称以在当前函数范围中查看其当前值、输入一个 JavaScript 分配语句以更改此值
- 按 Esc打开
- 直接输入
parseInt(addend1) + parseInt(addend2)
- Enter后,输出6,说明了错误所在
以上就是google的devTool的get started
调试入门部分,接下来,还可以看:
Pause Your Code With Breakpoints-所有的断点类型
vscode debug
vscode vue debug
nodejs log
为什么需要log:
纯粹的在console里打印,不仅找不到应用信息,而且log没有分级,很难定位到问题所在
而且在node中,一般用pm2来跑服务,这样的话除非到pm2的运行log中查看log,不然不可直观的看到
js test
设想一下这样的场景:写了一个计算两个日期中相差几天的函数,但是我们不知道这个函数是不是正常工作啊?
需要给一些值去测一下,在一个项目中测试一个单独的函数不方便,于是我们新建一个单独的测试环境,例如建一个简单的rollup项目,在src目录新建一个index.js
,util.js
,把那个函数拷进util.js
里面,加上export
export const days = (start, end)=> { ... }
然后在index.js
里面就可以这样写:
import { days } from "./util";
console.log(days('2012-05-12', '2021-08-30'));
console.log(days('2007-05-12', '2008-08-30'));
console.log(days('2020-05-13', '2033-07-13'));
console.log(days('2018-01-01', '2018-02-01'));
console.log(days('2018-01-01', '2018-12-31'));
console.log(days('2018-01-01', '2018-01-31'));
当然直接用node也行...,于是现在就得到了我们填入的测试数据的输出(用index.html引用打包后的js接口,在浏览器的控制台),然后我们在去找到正确的数据进行比较....
说到这里...如果有java后端背景的同学想必就跳出来了,哇靠,这么麻烦吗?js里面就没有一个像junit
的测试框架吗?
有的,那就是jest
回过头看一下我们的需求:
- 直接在项目里面测试,最好
npm script
就好,这样一行命令搞定 - 像
junit
一样,给予期望值,如果函数能通过则报ok
于是,jest的安装:直接npm install --save-dev jest
,然后在你的npm scripts
里面新增一个"test": "jest"
即可
使用:像上述例子,我们直接在原本的项目中,新建一个util.test.js
文件,然后写上:
const utils = require('./util.js');
test("from 2020-05-13 to 2033-07-13 is ", () => {
expect(utils.days("2020-05-13", "2033-07-13")).toBe(4809);
});
test("from 2018-07-26 to 2018-09-04 is ", () => {
expect(utils.days("2018-07-26", "2018-09-04")).toBe(40);
});
然后在命令行中敲:npm run test
,于是结果就出来了:
> jest
PASS src/common/utils/util.test.js
√ from 2020-05-13 to 2033-07-13 is (7ms)
√ from 2018-07-26 to 2018-09-04 is
PASS dist/common/utils/util.test.js
√ from 2020-05-13 to 2033-07-13 is (7ms)
√ from 2018-07-26 to 2018-09-04 is (1ms)
Test Suites: 2 passed, 2 total
Tests: 4 passed, 4 total
Snapshots: 0 total
Time: 5.589s
Ran all test suites.
有一个插曲,一开始会报错,SecurityError: localStorage is not available for opaque origins #6769,这时候需要修改配置文件,而jest
的配置项就可以直接写在package.json
里面,新增如下即可:
"jest": {
"verbose": true,
"testURL": "http://localhost/"
},
注意这里因为我的项目已经build过一次,结果就dist目录也跑了测试...
现在足以看出jest
的简捷、强大,应该已经成为非ban必选的包了,哦也!,更多详情看官方文档即可