来都来了,那就把Vitest
也学了~
是一个由vite
提供的快速的单元测试框架
没了~简洁明了
另外,vitest
需要vite
版本3.0
以上以及node
版本14
以上。
目前bug
还是挺多的(小声bibi
~)
其实官方有直接提供线上调试工具,如果你不想一步一步的配置的话,你可以直接通过线上链接选择自己想学习的配置,点击play online
一步到位。
Vitestvitest.dev/guide/#examples
不过学习嘛,还是得一步一步的来
老规矩先创建环境
然后直接安装vitest
以及vite
[1]
然后创建下配置文件
这里一定要配置的文件是vite.config.js
,不然你的项目跑不起来。而vitest
的配置信息是可以配置到vite
的配置文件中的。
让我们来创建vite.config.js
文件, 你也可以直接npm create vite@lastest
直接安装vite app
。
这里就没必要了,因为现在还不需要引入框架。
然后新增两个文件__tests__/index.spec.js
以及src/index.js
。
其中index.js
随便写个方法导出去
index.spec.js
中导入并导入vitest
的方法
现在就能直接跑啦~终端输入npm run test
配置起来不要太舒服~简直太傻瓜了
不过我在跑的时候遇到了个奇葩的问题,一直报错乱码,我一看,vscode
居然给我编码为utf-16
,我也是醉了,然后改回utf-8
就正常了。
然后我们将配置改到vitest.config.js
文件中。顺便来试下client
端测试,这需要client
环境模拟的包jsdom
[2]
然后在vitest.config.js
中配置下
这里有一个点需要注意,这里导入的defineConfig
是来自vitest
包里的,别给导错了。
别忘了先移除vite.config.js
中的配置,当然,你也可以合并。
新建src/client.js
和__tests__/client.spec.js
俩文件
然后在client.js
中导出下dom
在client.spec.js
中导入,并写入document
中
然后终端直接运行npm run test
正常运行。
刚测试的时候都是直接vitest
一把梭,把所有的文件都算进去了。有的时候我们只想测试其中一个文件或者一个小测试元,那么就需要改下我们的指令。
但是这里还是得配置在package.json
中然后用npm run
才能跑或者得基于npx
来跑。 很麻烦,尤其是每次要改变测试目标的时候就得改来改去,有没有办法直接在终端改呢?
当然有,官方也提供了cli
来方便我们终端直接输入。[4]
全局安装vitest
以及vite
,没了vite
(而且是3.x
),这个vitest
就没法跑
然而装了我也没法跑。。。。。
我遇到了不知名问题,可能是bug
,找得到文件夹,找得到文件,就是找不到测试元。。。
如果你跑成功了,麻烦评论里和我说下啥问题。。。。
补:我终于跑成功了,当我用in-source test
也就是在代码里面写测试代码import.meta.vitest
(目录里的第八点)这种写法就可以正常被侦测到
但是这样每次在终端输入还是有些麻烦了,我们还有没有其他方式呢?
当然有,往下看。
Vitest
会检测你的测试文件,发现后会在你的测试元左侧出现一个小按钮,点击就能直接运行
和jest
拓展一样,Vitest Runner
都是左上角多出一个小run | debug
的按钮,所以就不演示了。不过你一定要确定这个工作区中没有安装jest
的拓展(工作区禁用),不然会有冲突。
一直在终端看会不会看的脖子疼?
vitest
提供了ui
界面,专治终端界面小且字小难看的问题。(专治颜值癌~)
我们先安装对应的包@vitest/ui
然后package.json
文件中新增个script
我们直接在终端跑下
是不是很好看doge?如果嫌亮还能切夜晚模式,真得劲。
你是否有需求在你的代码中写测试代码而不是每次都要导出测试?
官方也提供了这种方式。
我们先改动vitest.config.js
中的配置,支持in-source
接着直接新开一个文件src/in-source.js
然后直接npm run ui
运行成功!
真实开发过程中是很难做到测试内容都在同一个模块中,基本是多个测试元共同测试,而这些测试元之间又需要数据共享,但是这些测试元的上下文环境又是独立的,这时就需要有一个地方存储共同的数据以及将数据传入测试元的地方。又或者你有一大段相同逻辑,你就可以都放到beforeEach
或者afterEach
中。
我们先来看下测试元自己的context
,是通过回调参数传入的
存放的是一些测试元自己的信息。
他们提供了两个hook
和jest
一样:beforeEach
和afterEach
会在测试元执行前、执行后执行。
我们放个cat
对象,然后在这个beforeEach
中加上cat
对象,然后新建cat.js
文件新增setName
和setAge
的方法
这样就拿到了。
这里为什么不直接在test
中直接ctx.cat = cat
呢?试想一下如果这是一段上百行的代码你就会发现很有用了,将相同的代码合并到一起,减少每个测试元自身的逻辑。
client
端测试这个【上手】中有说到了,这里就不多说了。
matcher
官方提供的matcher
实际上已经够很多场景用了,但是如果你还是觉得不满意,官方也提供了拓展入口。
我们新增一个文件src/is-jack.js
这个也正常,不多说。
没想到吧,测试元也需要调试,鬼知道测试元里的代码对不对,有代码的地方那就会有bug
,这是“真理”doge。
官方提供了两种方式,一种基于IDE
另一种自然是不依赖于IDE
。
我们先来看下不依赖IDE
的。
我们安装下一个包ndb
[10] 。这个包依赖于一个谷歌提供的包puppeteer
[11] 。这是一个无头浏览器,基于chrome
的内核,感兴趣的可自行查阅。后面我也会写个文章。 (拉的时候记得那啥,不然包可能拉不下来。。。又或者你去找别人的独立包)。另外注意这个包需要全局安装才行。
安装完之后直接ndb npm run test
然后会弹出一个chrome dev-tools
,然后就是熟悉的debug
了,你也可以在你的代码中写debugger
来调试。
别忘了用正确的方式关闭这个进程,不然等着后台疯狂偷吃资源吧。。。要不是笔记本的风扇开始告诉转起来我还不知道呢。。。
然后我们再来看下依赖IDE
的方式。这个咱们熟~。
而我个人只熟vscode
,idea
真不熟,doge。
老规矩直接创建项目内的launch.json
,然后将下面的代码复制到文件中。
配置信息还是那几样,如果不清楚可以去看下我之前的文章。
然后直接F5
就是这么简单~
就说几个我个人觉得比较有用的,其他自行看文档即可。
test
别名it
,老朋友了,不多说。test.skipIf
: 带条件过滤,根据条件判断是否执行。test.runif
: 不多说,用法如上test.only
: 只测试这个测试元儿~test.concurrent
[13]并行另外需要注意的是,这里的expect
需要从ctx
里拿才行,这样才能确保你的表达式被侦测到。
test.todo
: 就像你在写代码的时候未完成的地方会写个注释TODO
一样,如果这个测试元并没有写完,可以加个todo
,到时候跑的时候会被收集并且展示给你看目前还有多少个测试元未完成。test.each
[14]: 如果你有多组数据需要测试,那么你就得跑N次测试元,官方这里提供了一个修饰符用来测试多组数据,很有用。这些数据将会被传入到回调中作为参数。bench
[15]: 目前还是体验版,如果你需要可以配置下,默认会找.{bench,benchmark}.{js,mjs,cjs等}
的文件,如果你不想写这样的格式可以在配置文件中配置[16]。 这个api
是用来测试性能的,通知vitest
要运行多少次测试,然后会输出性能总结而它相关的api
就都跳过了,感兴趣的大佬可自行查看文档。
describe
[17]: 如果你有需要将某个文件中的某几个测试元一并执行,那么这个将很有用。用describe
接收两个参数,第一个是id
,第二个是回调,回调中包裹你想要一起执行的测试元,这里就不多说。 vitest bench -t test-describe
expect
[18]: 默认用的chai
[19],也可以使用jest
的, 这个就不多说了,用法和之前讲jest
的差不多。vi
[20]:vitest
暴露的一个工具类,提供了一些方法,感兴趣的大佬可以看下。前面都有提到了,所以这里就不在重复,来看下这里面的一个配置deps
[22],这个还是蛮重要的。
这是用来处理内联或者外部依赖的。
deps.external
[23] : 哪些是外部依赖,默认是node_modules、/dist/
,用过webpack
等打包工具的大佬都清楚,这些是不参与打包编译处理的。deps.inline
[24]: 和上边的相反,会被vite
加工处理(只能是ESM
)。其他都是和jest
类似的配置就不多说了。
差不多学完了,我们来起一个vite
的vue
项目。你也可以用官网的这个例子
如果你没有全局安装vite
,建议安装一个,直接创建一个vite-vue
的app
,
然后跑下npm run dev
看下是否正常。
然后创建vitest.config.js
然后配置下,当然你可以直接配置到vite
的配置文件中,这样就不用写一些重复代码比如导入vue
。
我们测试的是vue
组件,自然是client
环境,所以environment
得是jsdom
。既然要用到jsdom
,那就得下jsdom
这个包。 然后vue
的话我们用@vue/test-utils
[25]这个包来测试组件,之前我们学jest
的时候就用的这个包,感兴趣的大佬可以去翻看下。
安装完之后我们来创建测试文件
然后导入测试包和组件HelloWorld
,测试prop.msg
传递是否正常
然后在package.json
中配置下测试指令: "test": "vitest --run"
这样就能直接运行啦npm run test
正常运行。
那么到这就学完啦,如果觉得对你有用麻烦点个赞!谢谢~
发布于 2022-10-29 22:27