「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
0.起因
- 因为某些原因,leetcode并不是每时每刻都能打开,去写一写,刷一刷。但vscode可以。
- 因此就萌生了,用vscode写算法。
- 之后就开始了,不断学习加各种配置,以改进使用体验。
- 本文第一句也是原因
一.起步阶段
- 既然是刷算法,那肯定需要测试自己写的代码是否正确。
- 最简单的方式就是
- 准备一个例子:
// 比如写冒泡排序
const arr = [1,4,54,5423,65,7,765,897,43,654,432,3,445,32,5,7,2,4,5,654,7,5]
- 然后书写算法
const bubbleSort = (arr) => {
let size = arr.length
for(let i = 0; i < size; i++){
for(let j = 0; j < size; j++){
if(arr[j] > arr[j+1]){
let a = arr[j+1]
arr[j+1] = arr[j]
arr[j] = a
}
}
}
}
bubbleSort(arr)
console.log(arr)
- 并执行它,看它console.log打印,是否正确。肉眼匹配。
node index.js
- 这样写一题两题还好,写多了。各种文件就不好管理
- 因此,要规范下文件命名,更改下目录结构(顺便还想练习下ts,后来就该用ts写了)
- 但每次运行都需要node [文件名],感觉还是不爽,要是能自动测试就好了。(ts的话可以用ts-node)
二.需要自动检查
- 这时候就找到了Jest
- 首先需要yarn init,生成package.json
- 安装Jest
yarn add jest -D
- 生成jest配置文件,因为不想全局安装,也不想加到package.json中的script中。(原因下面讲),所以就直接使用路径的方式创建
./node_modules/.bin/jest --init
- 根据询问生成配置文件
- 创建一个目录test,专门用来装测试用例,结构如下
- 测试用例文件特别简单,文件结尾ts还是js都可以。拿冒泡排序举例。
// 导入algorithm文件夹里的冒泡排序
import bubbleSort from "../algorithm/sort-bubble";
// 书写测试的描述
describe("Bubble sort", () => {
// test的简写,一个it就是一个测试用例
it("Bubble sort", () => {
// 输入
const arr = [
1, 4, 54, 5423, 65, 7, 765, 897, 43, 654, 432, 3, 445, 32, 5, 7, 2, 4, 5,
654, 7, 5,
];
// 结果
const output = [
1, 2, 3, 4, 4, 5, 5, 5, 7, 7, 7, 32, 43, 54, 65, 432, 445, 654, 654, 765,
897, 5423,
];
// 执行导入的bubbleSort函数,传入参数arr,期望得到的值等于output
expect(bubbleSort(arr)).toEqual(output);
});
});
- 测试:用jest去执行这个文件即可。但执行jest的命令太长,
./node_modules/.bin/jest但又不想全局安装,我们就可以编写一些shell脚本,简化操作。
三.编写script命令
- 建立一个shell脚本的目录,管理shell脚本
- 首先有两条命令
1.test命令
- 我希望可以指定测试具体的文件,比如
yarn test sort-bubble.ts,也可以只执行yarn test,不带参数则测试所有的文件。 - shell中,我们可以用
$1获取命令后的第一个参数,然后拼接字符串,以指定test文件中的测试用例文件
#!/usr/bin/env bash
./node_modules/.bin/jest ${1%.*}".spec.ts"
- 我们执行
yarn test sort-bubble.ts。建议先cd algorithm,以方便代码补全。
- 可以看到一个测试用例就通过了,覆盖率100%
- 我们直接执行yarn test,会测试所有的测试用例文件,输出结果
2.start命令
- 某些情况下,我们希望能直接执行
sort-bubble.ts文件,而不仅仅是只跑测试。 - 这个时候,我们就需要,指定一个文件,去执行它
#!/usr/bin/env bash
// 先编译成js
./node_modules/.bin/tsc ./algorithm/$1
// 获取指定路径
path=./algorithm/${1%.*}".js"
// 执行编译后的js
node $path
// 删除js
rm -f $path
- 虽然了解到ts-node能直接执行,但我尝试没成功。就采用了这种方式
3.clean命令
- 我们希望去删除哪些,tsc编译后的文件
- jest测试后,生成的cover率文件等等
#!/usr/bin/env bash
rm -f ./algorithm/*.js
rm -f ./algorithm/*.js.map
rm -rf coverage
- 目前bin目录文件
- package.json中的命令
四.待优化
- 需要ts的断点调试,方便调试代码
- 能自动生成jest测试用例的模板
五.总结:
-
github地址:github.com/chaxus/algo…
-
折腾中...