ํ๋ก ํธ์๋ ํ ์คํธํ๊ธฐ 1: ํ๋ก ํธ์๋์์์ ํ ์คํธ, Vue + TypeScript + Jest ๋จ์ ํ ์คํธ ์ ์
- ํ ์คํธ ๋ฌ๋๋, ํ๋ก ํธ์๋์์์ ํ ์คํธ
- Jest ์๊ฐ: Jest, Transformer
- Jest ์ค์นํ๊ธฐ (VTU ์ฌ์ฉํ๊ธฐ)
- Jest ์ค์ ํ๊ธฐ:
jest.config.js
, Preset - ๋ณํ์ด ํ์ํ ์จ๋ํํฐ ๋ชจ๋ ์๋ ค์ฃผ๊ธฐ
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๊ด๋ฆฌํ๊ธฐ: Jest ์ค์ ์ ๋ช ์, ์ปค๋ฒ๋ฆฌ์ง ๋ฆฌํฌํธ
Jest์ ๊ฐ์ ํ ์คํธ ๋๊ตฌ๋ฅผ ํ ์คํธ ๋ฌ๋๋ผ๊ณ ํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ํ ์คํธ ์์ฒด์๋ง ์ง์คํ ์ ์๋๋ก ์ ์ฉํ ๋ฉ์๋๋ค์ ์ ๊ณตํ๊ณ , ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๋๋ฐ ํ์ํ ํ๊ฒฝ ์ ์ ์ ๊ฐ๋จํ๊ฒ ํด์ค๋๋ค.
Test runners like Jest, mocha, ava let you write test suites as regular JavaScript, and run them as part of your development process. Additionally, test suites are run as part of continuous integration. - React
ํ๋ก ํธ์๋์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ 3๊ฐ์ง์ ๋ํ ํ ์คํธ๊ฐ ํ์ํ ๊ฒ๋๋ค.
- UI: HTML ๋งํฌ์ ๊ณผ CSS๋ฅผ ์ฌ์ฉํ ์คํ์ผ ์์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ํ ํ ์คํธ
- ์ฌ์ฉ์ ์ด๋ฒคํธ ํธ๋ค๋ง: ๋ง์ฐ์ค, ํค๋ณด๋, ํฐ์น ๋ฑ ์ฌ์ฉ์ ์ด๋ฒคํธ ์๋ฎฌ๋ ์ด์
- API ํต์ : API ํต์ ๊ณผ ๋๊ธฐํ์ ๋ํ ํ ์คํธ (API Mocking ๋๋ ์ค์ API๋ฅผ ์ฌ์ฉ)
ํ ์คํธ ์ข ๋ฅ๋ก ๋๋ ๋ณด๋ฉด ๋จ์ ํ ์คํธ์ E2E ํ ์คํธ๋ฅผ ๊ฐ๊ฐ ์ด๋ป๊ฒ ์ํํ ์ง ์ ๋ฆฌํด๋ณผ ์ ์์ต๋๋ค.
-
์ปดํฌ๋ํธ: UI ํ ์คํธ์ ์ฌ์ฉ์ ์ด๋ฒคํธ ํธ๋ค๋ง์ ๋ํ ๋จ์ ํ ์คํธ๋, React๋ Vue ๊ฐ์ ๋ชจ๋ ํ๋ ์์ํฌ ํ๊ฒฝ์์ ๋ณดํต ์ฑ์ ์ปดํฌ๋ํธ ๋จ์์์ ์งํ
-
Util ํจ์: ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ Util ํจ์ ๊ฐ๊ฐ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์ํ
-
State ํธ๋ค๋ฌ: ์ฃผ์ด์ง ๊ฐ์ ๋ํด State๊ฐ ์๋ํ๋๋ก ์ ๋ฐ์ดํธ๋๋์ง ํ ์คํธ (Vuex์ Mutation, Redux์ Reducer์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์ํ)
์ฑ ์ ์ฒด๊ฐ ์ ๋์ํ๋์ง ํ์ธํ๋ ค๋ฉด ๋ฅผ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ค์ ๋ธ๋ผ์ฐ์ ์์ UI๊ฐ ์๋ํ๋๋ก ๋ ๋๋ง ๋๋์ง, ๋ผ์ฐํธ๊ฐ ์ด๋์ด ์ ๋๋์ง, ์ค์ API ํต์ ์ ๋ฌธ์ ๊ฐ ์๋์ง ๋ฑ์ Assertion์ ์ฌ์ฉํ์ฌ ํ ์คํธํฉ๋๋ค. E2E ํ ์คํธ ๋๊ตฌ๋ก๋ Cypress๊ฐ ์์ต๋๋ค.
Jest๋ JavaScript๋ก ๋ง๋ ํ๋ก๊ทธ๋จ์ ๋จ์ ํ ์คํธ๋ฅผ ๊ฐ๋จํ๊ฒ ํด์ฃผ๋ ํ ์คํธ ๋ฌ๋์ ๋๋ค. ํ๋ก ํธ์๋ ๊ด์ ์์๋ง ๋ณด๋ฉด, UI ํ ์คํธ๋ฅผ ์ํ ์ค๋ ์ท ํ ์คํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์, Mocking์ ํตํ API ํต์ ํ ์คํธ๋ ์ํํ ์ ์์ต๋๋ค. Jest๊ฐ ๊ฐ๋ฐ์๋ฅผ ๋์ ํ์ฌ ํด์ฃผ๋ ์ผ๋ค์ ๋ค์ํ์ง๋ง, ๋จ์ํ๊ฒ ๋ค์ 2๊ฐ์ง๋ก ์ ๋ฆฌํด๋ณผ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ์๊ฐ ํ ์คํธ ์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์๋๋ก ์ ์ฉํ ๋ฉ์๋ ์ ๊ณต
- ํ ์คํธ ์ฝ๋๋ฅผ Node.js ํ๊ฒฝ์์ ๊ฐ๋จํ๊ฒ ์คํํ๊ธฐ ์ํ ํ๊ฒฝ ์ ๊ณต
Jest๋ jsdom์ด๋ผ๋ ๊ฐ์ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ์, ์ด๋ Jest๊ฐ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ Node.js๋ฅผ ํ ์คํธ ์ฝ๋์ ๋ฐํ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. Node.js๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ณด๋ค ๋น ๋ฅด๊ธด ํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ๋ค์ํ Web API ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๊ณ DOM์๋ ์ ๊ทผํ ์ ์์ต๋๋ค. Jest๋ jsdom์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ์ ์๊ณ DOM ๋ ธ๋์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ๋ฑ์ ํ ์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค. jsdom์ Node.js ๋ด์์ ๋ง์น ์ค์ ๋ธ๋ผ์ฐ์ ์ธ ๊ฒ์ฒ๋ผ ๋์ํ์ง๋ง ํ์๊ณผ ๋ ์ด์์ ๊ธฐ๋ฅ์ ํฌํจ๋์ด์์ง ์์ผ๋ ์ฐธ๊ณ ํ์ธ์.
Jest๋ ํ
์คํธ ์ฝ๋๋ฅผ ์คํํ ๋ Transformer์ ๋์์ ๋ฐ์ต๋๋ค. ํ
์คํธ ์ฝ๋๊ฐ Plain JavaScript๋ก ์์ฑ๋ ๋ชจ๋๋ง ์ฌ์ฉํ๋ค๋ฉด Node.js์์ ์คํํ๋๋ฐ ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋ง, Vue, TypeScript ๋ฑ์ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๋ชจ๋์ ํฌํจํ๋ ํ
์คํธ ์ฝ๋๋ Node.js๊ฐ ์ดํดํ ์ ์๊ธฐ ๋๋ฌธ์ Plain JavaScript๋ก ๋ณํํ๋ ์์
์ ๊ฑฐ์ณ์ผํฉ๋๋ค. ์ด Transformer์ ๋ํ ์ค์ ์ ๋ค์์ ์์๋ณผ Jest ์ค์ ํ์ผ์ธ jest.config.js
์์ ํฉ๋๋ค.
๋ค์์ Vue ์ปดํฌ๋ํธ์ ๋ํ ํ
์คํธ ์ฝ๋ ์์์
๋๋ค. ์ฌ๊ธฐ์์ ํ
์คํธ ์ฝ๋ ์์ฒด๋ *.ts
ํ์ผ๋ก ์์ฑ๋์์ง๋ง, ์ผ๋จ ํ
์คํธ ์ฝ๋ ๋ด HelloWorld
๋ชจ๋์ Transform์ ๋ํด์๋ง ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
// example.spec.ts
import { shallowMount } from "@vue/test-utils";
import HelloWorld from "@/components/HelloWorld.vue";
describe("HelloWorld.vue", () => {
it("renders props.msg when passed", () => {
const msg = "new message";
const wrapper = shallowMount(HelloWorld, {
props: { msg },
});
expect(wrapper.text()).toMatch(msg);
});
});
๋ค์์ ์์ ํ
์คํธ ์ฝ๋์์ ์ฌ์ฉํ๋ HelloWorld.vue
ํ์ผ์
๋๋ค. ์ด ํ์ผ์ vue-jest
๋ผ๋ Transformer๋ฅผ ์ฌ์ฉํ์ฌ <template>
, <script>
, <style>
๊ตฌ๋ฌธ์ ์๋์ ๋ง๋ Plain JavaScript๋ก ๋ณํํด์ผํฉ๋๋ค. <script>
์์ญ์ ์์ฑ๋ TypeScript ์ฝ๋ ์ญ์ ts-jest
๋ผ๋ Transformer๋ฅผ ์ฌ์ฉํ์ฌ Plain JavaScript๋ก ๋ณํํด์ผํ๊ณ ์.
<template>
<div class="hello">{{ msg }}</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
export default defineComponent({
name: "HelloWorld",
props: {
msg: String,
},
});
</script>
<style scoped lang="scss">
div {
color: #42b983;
}
</style>
Vue์์ ๊ณต์ ์ง์ํ๋ VTU(Vue ํ
์คํธ ์ ํธ)์ ํตํด Jest๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. VTU๋ Vue ์ปดํฌ๋ํธ์ ๋ํ ๋จ์ ํ
์คํธ๋ฅผ ๊ฐ๋จํ๊ฒ ํด์ฃผ๋ ์ ํธ ํจ์๋ค์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. @vue/cli
3.x ์ดํ ๋ฒ์ ์ ์ฌ์ฉํ์ฌ Vue ์ฑ์ ์๋ก ์์ฑํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ์ฑ ์์ฑ์ ๋จ์ ํ
์คํธ ํด์ ์ ํํจ์ผ๋ก์จ VTU์ ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฝ๊ฒ ์
์
ํ ์ ์์ต๋๋ค. ์๋์ ๊ฐ์ด ์ฑ์ ์์ฑํ ๋ Unit Testing
๋๊ตฌ๋ก Jest
๋ฅผ ์ ํํ๋ฉด ๋ฉ๋๋ค. VTU ๊ณต์ ๋ฌธ์์์๋ VTU๋ฅผ Jest์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ๋๋ค.
์ ๋ @vue/cli
4.5.13 ๋ฒ์ ์ผ๋ก ์ฑ์ ์์ฑํ๋๋ฐ์, ์ฑ ์์ฑ์ ์๋ฃํ๋ฉด package.json
ํ์ผ์ ์๋์ ๊ฐ์ด ํ์ํ ์คํฌ๋ฆฝํธ์ ๋ํ๋์๋ค์ด Preset ๋ฉ๋๋ค. (TypeScript, Babel, Jest ๊ด๋ จ ํญ๋ชฉ์ด ์๋ ๊ฒ์ ์๋ต)
{
"scripts": {
"test:unit": "vue-cli-service test:unit"
},
"devDependencies": {
"@types/jest": "^24.0.19",
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-typescript": "~4.5.0",
"@vue/cli-plugin-unit-jest": "~4.5.0",
"@vue/test-utils": "^2.0.0-0",
"typescript": "~4.1.5",
"vue-jest": "^5.0.0-0"
}
}
-
@types/jest
: ํ ์คํธ ์ฝ๋ ์์ฒด๋ฅผ TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๊ฒฝ์ฐ Jest ๋ชจ๋์ ๋ํ Type ์ ๋ณด ์ ๊ณต (Optional) -
@vue/cli-plugin-babel
: Babel 7 +babel-loader
+@vue/babel-preset-app
-
@vue/cli-plugin-typescript
:ts-loader
+fork-ts-checker-webpack-plugin
Since 3.0.0-rc.6, typescript is now a peer dependency of this package, so you can use a specific version of TypeScript ...
-
@vue/cli-plugin-unit-jest
:jest
๋ฅผ ์คํํ๋vue-cli-service test:unit
์ปค๋งจ๋๋ฅผ ๋ฑ๋กํ๋ ํ๋ฌ๊ทธ์ธ, 4.x ์ด์ ๋ฒ์ ์ฌ์ฉ์ Vue ์ปดํฌ๋ํธ๋ฅผ Plain JavaScript๋ก ๋ณํํ ๋ TypeScript ๋ณํ๊ณผ Babel ์ฌ์ฉ์ ์ํ Preset ์ ๊ณต์ด์ ๋ฒ์ ์ ์ฌ์ฉํ๋ค๋ฉด Babel์์ TypeScript๋ฅผ ์ปดํ์ผํ ์ ์๋๋ก
@babel/preset-typescript
ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ ์ค์น ํ์ (Jest์์ Babel์ ํตํด TypeScript๋ฅผ ์ง์ํฉ๋๋ค) -
@vue/test-utils
: Vue ์ปดํฌ๋ํธ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ๊ฐํธํ๊ฒ ํด์ฃผ๋ ์ ํธ ํจ์๋ค์ ์ ๊ณต -
typescript
: TypeScript -
vue-jest
:.vue
ํ์ผ(SFC)๋ด<template>
,<script>
,<style>
๊ตฌ๋ฌธ๋ค์ Plain JavaScript๋ก ๋ณํ
๊ธฐ์กด Vue ํ๋ก์ ํธ์ VTU๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ์๋์ ๊ฐ์ด @vue/cli
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ช
๋ น์ด๋ @vue/cli-plugin-unit-jest
๋ฅผ ์ค์นํฉ๋๋ค.
vue add unit-jest
๊ทธ๋ฆฌ๊ณ ํจํค์ง๋งค๋์ ๋ฅผ ์ฌ์ฉํ์ฌ @vue/test-utils
, vue-jest
๋ฑ ์ถ๊ฐ๋ก ํ์ํ ํจํค์ง๋ค์ ์ค์นํฉ๋๋ค.
yarn add @vue/test-utils --dev
Jest ์ค์ ํ์ผ์ jest.config.js
์
๋๋ค. jest.config.js
๋์ package.json
ํ์ผ์ jest
ํ๋๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ค์์ @vue/cli
4.5.13 ๋ฒ์ ์ผ๋ก Babel, TypeScript๋ฅผ ํฌํจํ์ฌ ์ฑ ์์ฑ์ ๊ธฐ๋ณธ์ผ๋ก ์ธํ
๋๋ jest.config.js
ํ์ผ ๋ด์ฉ์
๋๋ค.
// jest.config.js
module.exports = {
preset: "@vue/cli-plugin-unit-jest/presets/typescript-and-babel",
transform: {
"^.+\\.vue$": "vue-jest", // vue-jest๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ *.vue ํ์ผ์ *.js ํ์ผ๋ก ์ปดํ์ผ
},
};
preset
์ต์
์ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์ค์ ํ์ผ ๋ด์ฉ์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค. Shallow Merge์ฒ๋ผ ์ดํ์ ์ง์ ํ๋ ์ต์
๋ค์ด ๋ฎ์ด์ฐ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผํฉ๋๋ค. ์์์ Preset์ผ๋ก ์ฌ์ฉ๋ @vue/cli-plugin-unit-jest/presets/typescript-and-babel
์ ๋ค์ 3 ๊ฐ Preset ํฉ์ผ๋ก ๋์ด์์ต๋๋ค.
presets/default/jest-preset
: Vue ์ฑ์ ์ํ ๊ธฐ๋ณธ Presetpresets/typescript/jest-preset
:.ts
/.tsx
ํ์ผ์ ํ ์คํธํ๊ธฐ ์ ์ts-jest
๋ฅผ ์ฌ์ฉํ์ฌ JavaScript ํ์ผ๋ก ๋ณํํ๋๋ก ์ค์ presets/typescript-and-babel/jest-preset
:ts-jest
์babelConfig: true
์ค์
๊ธฐ๋ณธ์ ์ผ๋ก Jest๋ node_modules
์ ์ค์น๋ ๋ํ๋์ ๋ชจ๋์ ๋ํด ํ
์คํธ๋ฅผ ์ํ ๋ณํ ์์
์ ํ์ง ์์ต๋๋ค. Jest ์ค์ ์ต์
์ค transformIgnorePatterns
์ ๋ํดํธ ๊ฐ์ /node_modules/
๊ฒฝ๋ก๊ฐ ํฌํจ๋์ด์๊ธฐ ๋๋ฌธ์
๋๋ค.
transformIgnorePatterns: ["/node_modules/"];
์ด๋ ๋๋ถ๋ถ์ ์จ๋ํํฐ ๋ชจ๋์ด Plain JavaScript๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฒ๋ค๊ฐ Jest๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ Node.js ํ๊ฒฝ์์ Run ๋๋๋ฐ, Node.js 8.x ์ด์๋ถํฐ ๊ฑฐ์ ๋๋ถ๋ถ์ ๋ชจ๋ ECMAScript ๊ธฐ๋ฅ๋ค์ ์ง์ํ๊ณ ์๊ธฐ ๋๋ฌธ์ Babel ๋ํ ํ์์๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ค๋ง ์๋์ ์์ธ ์ฌํญ์ ํด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๋ฉด ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ Jest๊ฐ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ๋์ ์ ์ ํ๊ฒ ๋ณํํ ์ ์๋๋ก ์๋ ค์ฃผ์ด์ผํฉ๋๋ค!
- ES6
import
/export
๋ชจ๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Node.js์์ ์คํํ ์ ์๋๋กmodule.exports
๋ก ๋ณํ๋์ด์ผ ํจ .vue
ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ,vue-jest
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ๋์ด์ผ ํจ- TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
ts-jest
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ๋์ด์ผ ํจ
๋ง์ฝ ํ
์คํธ ์ ๋ณํ์ด ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด transformIgnorePatterns
์ต์
์ ์์ ํฉ๋๋ค. ์์ธํ ์ค๋ช
์ @vue/cli-plugin-unit-jest
๊ณต์๋ฌธ์์์ ํ์ธํ ์ ์์ต๋๋ค.
// jest.config.js
module.exports = {
// ..
transformIgnorePatterns: ["/node_modules/(?!name-of-lib-to-transform)"],
};
Jest๋ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธก์ ํ๊ณ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ ์์ฑํ ์ ์์ต๋๋ค. ์๋์ ๊ฐ์ด jest.config.js
ํ์ผ์ ํด๋น ์ต์
๋ค์ ์ง์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์๋์ ๊ฐ์ด collectCoverageFrom
๊ฐ์ ์ง์ ํด์ฃผ๋ฉด, ๋ชจ๋ *.ts
, *.vue
ํ์ผ์ ๋ํด ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์์งํ๋, node_modules
, coverage
, tests
๋๋ ํ ๋ฆฌ์ ์กด์ฌํ๋ ํ์ผ๋ค์ ์ ์ธํ๋ค๋ ์๋ฏธ์
๋๋ค.
// jest.config.js
module.exports = {
// ..
collectCoverage: true,
collectCoverageFrom: [
"**/*.{ts,vue}",
"!**/node_modules/**",
"!**/coverage/**",
"!**/tests/**",
],
};
์ด์ ํ ์คํธ๋ฅผ ์คํํด๋ด ๋๋ค.
# vue-cli-service test:unit
yarn test:unit
๋ค์๊ณผ ๊ฐ์ ๋ณด๊ณ ์๊ฐ ์ถ๋ ฅ๋๊ณ ์,
๋ณด๊ณ ์์ ๊ฐ ํญ๋ชฉ์ ๋ค์์ ์๋ฏธํฉ๋๋ค.
Stmts
: ์ต์ ํ ๋ฒ ์ด์ ์คํ๋ ๋ช ๋ น๋ฌธ(๋ณ์์ ๊ฐ ์ ์ฅ, ํจ์ ํธ์ถ ๋ฑ) ์ฝ๋์ ๋น์จBranch
: ์ต์ ํ ๋ฒ ์ด์ if, switch์ ๊ฐ์ ๋ถ๊ธฐ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋น์จFuncs
: ์ต์ ํ ๋ฒ ์ด์ ํธ์ถ๋ ํจ์์ ๋น์จLines
: ์ต์ ํ ๋ฒ ์ด์ ์คํ๋ ์ฝ๋ ๋ผ์ธ์ ๋น์จUncovered Line
: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ์ธก์ ๋์ง ์์ ์ฝ๋ ๋ผ์ธ ์
๋ถ์์์ผ๋ก ํ์๋ ํ์ผ๋ค์ ๋์ํ๋ ํ ์คํธ ํ์ผ์ด ์๋ ํ์ผ๋ค์ ๋๋ค. VTU์ Jest Preset์ ๋ฐ๋ผ, Jest๋ ๋ํดํธ๋ก ๋ค์ ๊ฒฝ๋ก์ ํด๋นํ๋ ํ ์คํธ ํ์ผ์ ์คํํฉ๋๋ค.
module.exports = {
// ..
testMatch: ["**/tests/unit/**/*.spec.[jt]s?(x)", "**/__tests__/*.[jt]s?(x)"],
};
์ฑ ์์ฑ์ ์๋ ํฌํจ๋ ์ํ ํ
์คํธ ํ์ผ์ธ tests/unit/example.spec.ts
์์ HelloWorld.vue
์ปดํฌ๋ํธ์ ๋ํ ํ
์คํธ๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ HelloWorld.vue
ํ์ผ์ ๋ํ ์ปค๋ฒ๋ฆฌ์ง๋ง 100
์ธ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- The Practical Test Pyramid - Ham Vocke
- UnitTest - Martin Fowler
- TestDouble - Martin Fowler
- Mocks Aren't Stubs - Martin Fowler
- SelfTestingCode - Martin Fowler
- TestDrivenDevelopment - Martin Fowler
- The Art of Agile Development: Test-Driven Development | James Shore's Art of Agile Development
- IntegrationTest - Martin Fowler
- BroadStackTest - Martin Fowler
- ExtremeProgramming - Martin Fowler
- SUT | xUnit Patterns
- The little guide to CI/CD for frontend developers - Maxime Heckel
- Using TypeScript | Jest
- Using Vue Test Utils with Jest (recommended) | Vue Test Utils
- Unit Testing with Jest | Cracking Vue.js
- Vue Test Utils | Cracking Vue.js
- Setting up for TDD | Vue Testing Handbook
- Testing Environments | React
- ๋ชจ๋ ํ๋ก ํธ์๋ ํ ์คํธ ์ ๋ต โ 1ํธ(Testing Overview) | ์ฝด๋ค ํ๋ธ๋ก๊ทธ
- ํ ์คํธ | TOAST UI
- ํ ์คํธ ์ฝ๋์์ ๋ด๋ถ ๊ตฌํ ๊ฒ์ฆ ํผํ๊ธฐ | ๊ธฐ์ต๋ณด๋จ ๊ธฐ๋ก์