ããã«ã¡ã¯ãããã³ãã¨ã³ãã¨ã³ã¸ãã¢ã®ç¸æ¾¤ ( @ttt3pu ) ã§ãã
ã¿ãªãã¾ãNuxt 2 ãã Nuxt 3 ã¸ã®ã¢ããã°ã¬ã¼ãã¯é 調ã§ããããã
ã¡ããã¢ã§ã¯ã2023å¹´æ«ã®Vue 2ã®EOLã¸åãã¦ã
åãããã¯ãã§ç©æ¥µçã«Nuxt 3ã¸ã®ã¢ããã°ã¬ã¼ããé²ãã¦ãã¾ãã
ç¾å¨ç§ã®æ
å½ãã¦ãããããã¯ãã§ã¯ããã¤ã°ã¬ã¼ã·ã§ã³ä½æ¥èªä½ã¯ã»ã¼å®äºãã¦ããã
æ®ãã¯QAãã¹ããªã©ãè¡ãã®ã¿ã¨è¨ã段éã§ãæ¬çªãªãªã¼ã¹ã¾ã§ãã¨ä¸æ©ã¨ããã¨ããã¾ã§é²ãã§ããã¾ãï¼ ð
ãã¤ã°ã¬ã¼ã·ã§ã³ã®äºä¾ãå¾ã
ã«å¢ãå§ãã¦ãã¦ãNuxt 3ã®ãªãªã¼ã¹å½åãããæ®µã
ã¨ç§»è¡ã¯ãããããªã£ã¦ãã¾ãããã
å人çã«çµæ§å¤§å¤ã ã£ãã®ãã¦ããããã¹ãã®ãã¤ã°ã¬ã¼ã·ã§ã³ä½æ¥ã§ããã
å½è¨äºã§ã¯ããã¤ã°ã¬ã¼ã·ã§ã³ã«å½ãã£ã¦ã® Tips ã¨ãã¤ãã§ã« Vitest ãå°å
¥ãããã¨ã«ããã
å®è¡é度ã ç´ 10å -> ç´2å30ç§ ( ç´ 4å ! ) ã¾ã§è·³ãä¸ãã£ã話ããç´¹ä»ãã¾ãã
ç®æ¬¡
- ç®æ¬¡
- 対象ããã¸ã§ã¯ãã®ã¦ããããã¹ãå¨ãã®ã©ã¤ãã©ãªæ§æ
- ç§»è¡å®äºã¾ã§ã®ã¹ããã
- Jest ãã Vitest ã¸ã®ç§»è¡
- nuxt-vitest ã®å°å ¥
- vue-test-utils ã®ãã¤ã°ã¬ã¼ã·ã§ã³ä½æ¥ã宿½
- è½ã¡ã¦ãããã¹ããã¨ã®åå¥ä¿®æ£
- Vitest ã®è¨å®ã調æ´ãé度æ¹å
- æå¾ã«
対象ããã¸ã§ã¯ãã®ã¦ããããã¹ãå¨ãã®ã©ã¤ãã©ãªæ§æ
ã¾ããä»åãã¤ã°ã¬ã¼ã·ã§ã³ä½æ¥ãè¡ãªã£ãããã¸ã§ã¯ãã¯ã以ä¸ã®ãããªã©ã¤ãã©ãªæ§æã§æ§ç¯ããã¦ãã¾ããã
ç§»è¡å¾ã¯ã以ä¸ã®ãããªã©ã¤ãã©ãªæ§æã¨ãªãã¾ããã
Jest ã¯å»æ¢ãã Vitest ã¸ç§»è¡ãã¦ãã¾ãã
vue-test-utilsã«ã¤ãã¦ã¯ãVue 3対å¿ãã¦ããã®ãv2以éã¨ãªãããããã¼ã¸ã§ã³ãä¸ãã£ã¦ãã¾ãã
ä»åèã¨ãªã£ãã®ããnuxt-vitestãã®å°å
¥ã§ããã
Nuxt 3 + Vitest ã®å®è¡ç°å¢ãç¨æãã¦ãããã©ã¤ãã©ãªã§ãã
詳ããå
容ã«ã¤ãã¦ã¯å¾è¿°ããã¦ããã ãã¾ãã
ç§»è¡å®äºã¾ã§ã®ã¹ããã
ãããã¯ãã®å®è£
ç¶æ³ã«ãã£ã¦å¤å°é çªãå¤ãã£ã¦ããã¨ã¯æãã¾ããã
ãã¹ããå
¨ã¦éãã¾ã§ã«ã以ä¸ã®ã¹ãããã§ä½æ¥ãè¡ãã¾ããã
- Jest ãã Vitest ã¸ç§»è¡
- nuxt-vitestãå°å ¥
- vue-test-utils ã® v1 ãã v2 ã¸ã®ãã¤ã°ã¬ã¼ã·ã§ã³ä½æ¥ã宿½
- è½ã¡ã¦ãããã¹ããã¨ã®åå¥ä¿®æ£
- Vitest ã®è¨å®ã調æ´ãé度æ¹å
ããããå ã¯ãããããã®ã¹ãããã§è¡ãªã£ã使¥ã«ã¤ãã¦ã詳ãããç´¹ä»ããã¦ããã ãã¾ãã
Jest ãã Vitest ã¸ã®ç§»è¡
ä¸çªæåã®ã¹ãããã¨ãã¦ãnuxt-vitestãå°å ¥ããåæºåã¨ãã¦ãJestããVitestã¸ã®ç§»è¡ãè¡ãã¾ããã
Jestã¨ã¯äºææ§ãé«ãã®ã§ãå°å ¥ã¯ã»ã¨ãã©è¦ã«ãªãã¾ããã§ããã
ãã£ããã¨ã¾ã¨ããã¨ã以ä¸ã®ä½æ¥ãè¡ãã ãã§ç§»è¡ãå®äºãã¾ããã
jest.config.ts
ã®åè¨å®ãvitest.cofig.ts
ã¸ç§»è¡ããjest
ã¡ã½ãããvi
ã¸ç½®æãã- ä¾:
jest.fn
->vi.fn
ãjest.spyOn
->vi.spyOn
ãªã©
- ä¾:
- npm scriptsçã«CLIã®è¨è¿°ãããã°å¤æ´ãã
詳細ã«ã¤ãã¦ã¯ãå ¬å¼ã® Migration Guide ããåç §ãã ããï¼
nuxt-vitest ã®å°å ¥
ç¶ã㦠nuxt-vitest ãå°å ¥ãã¾ãã
nuxt-vitest ã¯ãNuxt ã®éçºã³ã¢ã¡ã³ãã¼ã§ãã Daniel ããã«ãã£ã¦éçºããã¦ãããNuxt 3 + Vitest ã®å®è¡ç°å¢ãç¨æãã¦ãããã©ã¤ãã©ãªã§ãã
å°å
¥ãããã¨ãããèªåã§å®è£
ãããã¨ããã¨ããªãè¤éã«ãªã£ã¦ãã¾ããããªè¨å®ããããç¨åº¦èªåã§è¡ãªã£ã¦ãããããã«ãªãã¾ãã
ã³ã¢ã¡ã³ãã¼ãéçºãã¦ããã¨ãããã¨ããããã¡ã³ããã³ã¹ãNuxtæ¬ä½ã®ã¢ããã°ã¬ã¼ãã«åããã¦é »ç¹ã«è¡ããã¦ããã®ã§å®å¿ã§ãã
å°å
¥æ¹æ³ãã¨ã¦ãç°¡åã§ãã
nuxt-vitest ãã¤ã³ã¹ãã¼ã«å¾ã nuxt.config.ts
㨠vitest.config.ts
ã«ããããèªã¿è¾¼ã¾ãããå®äºã§ãï¼
â» ãã¼ã¸ã§ã³ã«ãã£ã¦å°å ¥æ¹æ³ãå¤ããå¯è½æ§ãããããã詳細ã¯å ¬å¼ã® README ããåç §ãã ããã
// nuxt.config.ts ã®è¨å®ä¾ export default defineNuxtConfig({ // ... modules: [ 'nuxt-vitest' ] })
// vitest.config.ts ã®è¨å®ä¾ import { defineVitestConfig } from 'nuxt-vitest/config' export default defineVitestConfig({ test: { environment: 'nuxt', }, });
å®ã¯ãã®æç¹ã§ãã®ã©ã¤ãã©ãªã®æ©æµãããªãåãããã¨ãã§ãã¦ããã
vitest.config.ts
å
ã®è¨è¿°ãããªãã¹ãããªããããã¨ãã§ãã¦ãã¾ãã
ãã®æç¹ã§ nuxt-vitest ãªãã§å®è¡ãããã¨ããå ´åã
useNuxtApp ã useRoute çã®ã #importsãã使ç¨ããã¡ã½ããé¡ ã® import å¨ãã ã£ããã»ã»ã»
composables 㨠component ã®Auto Import å¨ãã ã£ããã»ã»ã»
çã®åé¡ãåºã¦ãã¦ã³ã±ã¦ãã¾ãã¾ãã
ãã®åé¡ãæåã§ç´ãã®ã¯ããªãé£æåº¦ãé«ããããèªåã§è£å®ãã¦ãããã®ã¯ããªãå©ããã¾ããã
ã¾ãã nuxt-vitest ã«ã¯ãç°å¢æ§ç¯ç¨ã® module ã ãã§ãªãã
mockNuxtImport
çã®ã¦ããããã¹ãç¨ã®ãã«ãã¼ãç¨æããã¦ãã¾ãã
ãããã®è©³ããä½¿ãæ¹ã«ã¤ãã¦ã¯å¾è¿°ããã¦ããã ãã¾ãã
vue-test-utils ã®ãã¤ã°ã¬ã¼ã·ã§ã³ä½æ¥ã宿½
ã²ã¨ã¾ããã®æç¹ã§ vitest ã³ãã³ããæ£å¸¸ã«å®è¡ã§ããç¶æ
ã«ã¯ãªãã¯ããªã®ã§ã
ããããå
ã¯specãã¡ã¤ã«å
ã®è¨è¿°ã®ä¿®æ£ãè¡ãªã£ã¦ããã¾ãã
å ¬å¼ã§ Migration Guide ãç¨æããã¦ãããããããã«æ²¿ã£ã¦å®æ½ãè¡ãªã£ã¦ããã¾ãã
夿´å 容ã¨ãã¦ã¯ããã¾ã§é£ããã¯ãªãã®ã§ããã夿´éã¯ã©ããã¦ãå¤ããªã£ã¦ãã¾ãæãã§ããã
大ããã¨ããã 㨠stubs
ã plugins
çã®ãªãã·ã§ã³ã global
ã®ä¸ã«å
¥ããå¿
è¦ãåºã¦ãããã¨çã§ããããã
ãããå°å³ã«çµæ§å¤§å¤ã§ããã»ã»ã
// before const wrapper = mount(Component, { stubs: { ... }, }) // after const wrapper = mount(Component, { global: { stubs: { ... }, }, })
è½ã¡ã¦ãããã¹ããã¨ã®åå¥ä¿®æ£
ãã®æç¹ã§ããç¨åº¦ãã¹ãã¯éãããã«ãªã£ãã¨æãã¾ãã
ããããå
ã¯ãã¹ããã¨ã«åå¥ä¿®æ£ããã¦ããã¾ãã
ããããå
ã¯ãããã¯ãã«ãã£ã¦è¨æ©å¿å¤ã«å¯¾å¿ãè¡ãå¿
è¦ãããããã§ããã
å人çã«å¤§å¤ã ã£ãé¨åãããã¤ãããã¯ã¢ãããã¦è¨è¼ããã¦ããã ãã¾ãã
Composition API å ã§ setData ã¡ã½ããã使ç¨ãã¦ããç®æã®ä¿®æ£
vue-test-utils ã§ç¨æããã¦ããã data ã®å¤ã夿´ããã¡ã½ããã¨ã㦠setData ã¨ãããã®ãããã¾ãã
ãã®ã¡ã½ãã㯠v1 ã®æã¯Composition API ã使ç¨ãã¦ããã³ã³ãã¼ãã³ãã§ãåãã¦ãã¦ãããã®ã§ããã v2 ããã¯ãã¾ãåä½ãããªããªã£ã¦ãã¾ãã¾ããã
ãã®ããã以ä¸ã®ãããªå½¢ã§ä»£ç¨ãããã¨ã§å¯¾å¿ãã¾ããã
// before const wrapper = mount(Component); await wrapper.setData({ count: 1 }); expect(wrapper.html()).toContain('Count: 1') // after const wrapper = mount(Component); wrapper.vm.count = 1; await flushPromises(); expect(wrapper.html()).toContain('Count: 1')
useRoute ãªã©ã® #imports ãã使ç¨ããã¡ã½ããã®ã¢ãã¯å
è²ã
ããæ¹ã¯ããã¨æãã¾ããã
ç§ãã¡ã®ãããã¯ãã§ã¯ãuseRoute
ã®ã¢ãã¯åã Nuxt 2 ç°å¢ã§ã¯ä»¥ä¸ã®ãããªå½¢ã§è¡ãªã£ã¦ãã¾ããã
// hoge.vue <script> const useRoute(); ... </script>
// hoge.spec.ts const wrapper = mount(Component, { mocks: { $route: { path: '/hoge', }, }, }) ...
Nuxt 3 ã§ã¯ãã®æ¹æ³ã§ã¯ã¢ãã¯åãã§ããªããªããããä¿®æ£ãè¡ãå¿ è¦ãããã¾ãã
ããã§ nuxt-vitest ã«ç¨æããã¦ãããã«ãã¼ã¡ã½ãããæ´»èºãã¾ãã
mockNuxtImport
ã使ç¨ãããã¨ã«ãã£ã¦ã以ä¸ã®ãããªè¨è¿°ã§ mock åãè¡ããã¨ãã§ãã¾ãã
import { mockNuxtImport } from 'nuxt-vitest/utils' mockNuxtImport('useRoute', () => { return () => { return { path: '/hoge', }, } })
ããã nuxt-vitest ã使ããªãã£ããæ´ã«ã²ã¨å·¥å¤«ãããã§ãããç®æã®ãããããªãã®å©ãããã¤ã³ãã§ããã
useRoute
以å¤ã®ã¡ã½ããã«é¢ãã¦ããåæ§ã®æ¹æ³ã§å¯¾å¿ãè¡ããã¨ãã§ãã¾ãã
Vitest ã®è¨å®ã調æ´ãé度æ¹å
ãªãã¨ããã¹ããå
¨ã¦éãããã«ãªãã¾ãããã
ããã§ãã£ãã Jest ãã Vitest ã«ç§»è¡ããã®ã«ãã¾ãé度ãå¤ãã£ã¦ããªããã¨ã«æ°ã¥ãã¾ãã
詳ãã調ã¹ã¦ã¿ã㨠--single-thread
ã¨è¨ããªãã·ã§ã³ããããã¨ããããã
ãã®ãªãã·ã§ã³ãæå¹ã«ããã¨ããã
åé ã«è¨è¼ããéãé度ã 10å -> 2å30ç§ ( ç´ 4å ! ) ã«ã¾ã§è·³ãä¸ããã¾ããï¼
#ãã³ãã³ãã®å®è¡ä¾ yarn vitest --single-thread --coverage
ãã®ãªãã·ã§ã³ã¯ååã®éããã·ã³ã°ã«ã¹ã¬ããã§ãã¹ããå®è¡ããããªãã·ã§ã³ã§ã
ãã£ããã¨ã¾ã¨ããã¨ã
- ç¡å¹ã«ããå ´å -> ãã¹ããã¨ã«å¥ã ã®ç°å¢ã使ããä¸ã§å®è¡ããã
- æå¹ã«ããå ´å -> åä¸ã®ç°å¢ã§ãã¹ããå®è¡ããããããåæåãç¹°ãè¿ãã³ã¹ããåé¿ã§ãã
ã¨ããæåãå®ç¾ãã¦ãããããã§ãã
ä»å対å¿ãè¡ãªã£ããããã¯ãã¯å¼ç¤¾å
ã§ã¯è¦æ¨¡ã大ããã®ãã®ã§ã ãã¹ããã¡ã¤ã«ç·æ° 178ä»¶ããã¹ãç·æ° 854ä»¶
ã¨å®è¡ãããæ°ãå¤ãã§ãã
ãããªä¸ããããcoverageä»ãã§ãã®é度ã¨ããã®ã¯ãªããªãæåãã¾ããã»ã»ã» â¨
ãã ããå ¬å¼ã® Docs ã«è¨è¼ããã¦ããéããå®è¡ããç°å¢ã«ãã£ã¦ã¯ããã®ãªãã·ã§ã³ã使ç¨ããå ´åãã¾ããããªãå ´åããããããªã®ã§ãããã«é¢ãã¦ã¯æ³¨æãå¿ è¦ããã§ãã
WARNING
Even though this option will force tests to run one after another, this option is different from Jest's --runInBand. Vitest uses workers not only for running tests in parallel, but also to provide isolation. By disabling this option, your tests will run sequentially, but in the same global context, so you must provide isolation yourself.
This might cause all sorts of issues, if you are relying on global state (frontend frameworks usually do) or your code relies on environment to be defined separately for each test. But can be a speed boost for your tests (up to 3 times faster), that don't necessarily rely on global state or can easily bypass that.
æå¾ã«
Nuxt 3 æ¬ä½ã®ãã¤ã°ã¬ã¼ã·ã§ã³ã«ã¤ãã¦ã¯äºä¾ãå¾ã
ã«åºã¦ãã¦ã¯ãããã®ã®ããã¹ãå¨ãã¯ã¾ã æ
å ±ãå°ãªããªããªã大å¤ã§ããã
ãã®è¨äºãã¿ãªãã¾ã® Nuxt 3 ã¢ããã°ã¬ã¼ãã®å©ãã«ãªãã°å¹¸ãã§ãï¼
æ¯éèªè ã«ãªã£ã¦ãã ããï¼
ã¡ããã¢ã§ã¯ä¸ç·ã«åã仲éãåéãã¦ãã¾ãã
ãå¿åããå¾
ã¡ãã¦ããã¾ãï¼
â åéãã¸ã·ã§ã³ã¯ãã¡ã
â ã¨ã³ã¸ãã¢ç´¹ä»ãã¼ã¸ã¯ãã¡ã