搭建自己的jest+ts刷题算法库

882 阅读3分钟

「这是我参与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写了) image.png
  • 但每次运行都需要node [文件名],感觉还是不爽,要是能自动测试就好了。(ts的话可以用ts-node)

二.需要自动检查

  • 这时候就找到了Jest
  • 首先需要yarn init,生成package.json
  • 安装Jest
yarn add jest -D
  • 生成jest配置文件,因为不想全局安装,也不想加到package.json中的script中。(原因下面讲),所以就直接使用路径的方式创建
./node_modules/.bin/jest --init
  • 根据询问生成配置文件

image.png

  • 创建一个目录test,专门用来装测试用例,结构如下

image.png

  • 测试用例文件特别简单,文件结尾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脚本
  • 首先有两条命令

image.png

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,以方便代码补全。

image.png

  • 可以看到一个测试用例就通过了,覆盖率100%
  • 我们直接执行yarn test,会测试所有的测试用例文件,输出结果

image.png

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目录文件

image.png

  • package.json中的命令

image.png

四.待优化

  1. 需要ts的断点调试,方便调试代码
  2. 能自动生成jest测试用例的模板

五.总结: