Skip to content

Next Generation Testing Framework

Introduction

Vitest เป็นเฟรมเวิร์กสำหรับการทดสอบแบบหน่วย (unit testing) ที่ทำงานร่วมกับ Vite ได้อย่างมีประสิทธิภาพ เหมาะสำหรับโปรเจ็กต์ JavaScript และ TypeScript Vitest เป็นกรอบการทดสอบหน่วยที่เร็วมาก ใช้พลังจาก Vite ให้โซลูชันการทดสอบที่สมบูรณ์ด้วย:

  • โหมดดูแบบทันที
  • รองรับ ESM, TypeScript และ JSX ทันที
  • การทำงานหลายเธรดผ่าน workers
  • การกรอง การกำหนดเวลา และการทำงานพร้อมกันสำหรับชุดทดสอบ

Comparison

ข้อแตกต่างระหว่างเฟรมเวิร์กการทดสอบที่นิยม

คุณสมบัติvitest.dev faviconVitestjestjs.io faviconJestjapa.dev faviconJapa
ความเร็ว⚡ เร็วมาก (ใช้ Vite)🐢 ปานกลาง⚡ เร็ว
HMR✅ ในตัว❌ ไม่มี✅ ในตัว
ESM Support✅ ในตัว❌ ต้องกำหนดค่า✅ ในตัว
TypeScript✅ ในตัว❌ ต้องใช้ ts-jest✅ ในตัว
Browser Testing✅ ผ่าน Playwright❌ ต้องใช้ Puppeteer❌ ไม่มี
Snapshot Testing✅ ในตัว✅ ในตัว❌ ไม่มี
Parallel Testing✅ ในตัว✅ ในตัว✅ ในตัว
Mocking✅ vi ในตัว✅ jest ในตัว✅ ในตัว
Coverage✅ ในตัว✅ ในตัว❌ ต้องใช้ nyc

Installation

ขั้นตอนการติดตั้ง Vitest ในโปรเจ็กต์ของคุณด้วย package managers ต่างๆ

bash
npm install -D vitest
bash
pnpm add -D vitest
bash
yarn add -D vitest
bash
bun add -D vitest

Configuration

การตั้งค่า Vitest ผ่านไฟล์ config เพื่อปรับแต่งการทำงาน

สร้าง vitest.config.ts:

vitest.config.ts
ts
import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    // เปิดใช้งาน global APIs เหมือนใน Jest
    globals: true,
    // สภาพแวดล้อมสำหรับทดสอบ DOM (จำเป็นสำหรับคอมโพเนนท์)
    environment: "jsdom",
    coverage: {
      // ใช้ istanbul สำหรับรายงาน coverage
      provider: "istanbul",
    },
  },
});

Configuration Options

การตั้งค่าพื้นฐานสำหรับการกำหนดค่า Vitest Basic settings to configure how Vitest runs your tests.

Core Settings

การตั้งค่าพื้นฐานเกี่ยวกับสภาพแวดล้อมการทดสอบและการรวมไฟล์ Fundamental configurations that affect test environment and file inclusion.

ตัวเลือกคำอธิบายตัวอย่าง
vitest.dev faviconglobalsเปิดใช้งาน API ระดับ global เช่นเดียวกับใน Jestglobals: true
vitest.dev faviconenvironmentกำหนดสภาพแวดล้อมการทดสอบ (node, jsdom, happy-dom)environment: 'jsdom'
vitest.dev faviconincludeรายการไฟล์ที่จะรวมในการทดสอบinclude: ['**/*.test.ts']
vitest.dev faviconexcludeรายการไฟล์ที่จะยกเว้นจากการทดสอบexclude: ['node_modules']
vitest.dev faviconaliasกำหนด path aliases เหมือนใน Vitealias: { '@': path.resolve(__dirname, './src') }
vitest.dev faviconrootกำหนด root directory ของโปรเจ็กต์root: './src'

Test Execution

การตั้งค่าการทำงานของเทส เช่น การจำกัดเวลาและการรันแบบขนาน Settings that control how tests are run, including timeouts and parallel execution.

ตัวเลือกคำอธิบายตัวอย่าง
vitest.dev favicontestTimeoutระยะเวลาสูงสุดที่อนุญาตให้การทดสอบทำงาน (มิลลิวินาที)testTimeout: 10000
vitest.dev faviconthreadsเปิด/ปิดการรันเทสแบบขนานthreads: false
vitest.dev faviconisolateแยก environment สำหรับแต่ละไฟล์ทดสอบisolate: true
vitest.dev faviconpassWithNoTestsผ่านแม้ไม่มีเทสที่รันได้passWithNoTests: true
vitest.dev faviconretryจำนวนครั้งที่จะลองรันเทสที่ล้มเหลวretry: 2

Reporting

การตั้งค่ารูปแบบการแสดงผลและรายงานผลการทดสอบ Options for configuring test output and reporting formats.

ตัวเลือกคำอธิบายตัวอย่าง
vitest.dev faviconreportersรูปแบบการแสดงผลการทดสอบreporters: ['default', 'json']
vitest.dev faviconoutputFileบันทึกผลลัพธ์ลงไฟล์outputFile: './test-results.json'
vitest.dev faviconsilentปิดการแสดงผลใน consolesilent: true
vitest.dev faviconlogHeapUsageแสดงการใช้หน่วยความจำlogHeapUsage: true

Coverage

การตั้งค่าการวัดความครอบคลุมของโค้ด Configuration for code coverage analysis and reporting.

ตัวเลือกคำอธิบายตัวอย่าง
vitest.dev faviconcoverage.providerระบบสร้างรายงาน coverage (istanbul หรือ v8)provider: 'istanbul'
vitest.dev faviconcoverage.enabledเปิดใช้งาน coverage โดยอัตโนมัติenabled: true
vitest.dev faviconcoverage.reporterรูปแบบรายงาน coveragereporter: ['text', 'html']
vitest.dev faviconcoverage.thresholdsกำหนดค่า coverage ขั้นต่ำthresholds: { lines: 80 }

Features

แนวคิดหลักที่ควรเข้าใจเมื่อทำงานกับ Vitest

Conceptคำอธิบายตัวอย่าง
vitest.dev faviconWatch Modeรันแบบติดตามการเปลี่ยนแปลงอัตโนมัติvitest หรือ vitest watch
vitest.dev faviconTest Filteringรันเฉพาะบางการทดสอบvitest test my-test
vitest.dev faviconConcurrent Testsรันหลายการทดสอบพร้อมกันit.concurrent()
vitest.dev faviconMockingสร้างฟังก์ชันจำลองconst mock = vi.fn()
vitest.dev faviconSnapshot Testingตรวจสอบผลลัพธ์กับค่าที่บันทึกไว้expect(result).toMatchSnapshot()
vitest.dev faviconCoverageวัดโค้ดที่ยังไม่ได้ทดสอบvitest run --coverage
vitest.dev faviconIn-Source Testingเขียนเทสในไฟล์เดียวกันกับโค้ดif (import.meta.vitest) { ... }
vitest.dev faviconType Testingทดสอบประเภทข้อมูลexpectTypeOf(1).toBeNumber()

CLI Commands

คำสั่งสำคัญสำหรับการทำงานกับ Vitest

Commandคำอธิบายตัวเลือก
vitest.dev faviconvitestรันการทดสอบในโหมด watch (ติดตามการเปลี่ยนแปลง)--ui, --coverage
vitest.dev faviconvitest runรันการทดสอบครั้งเดียว--reporter, --threads
vitest.dev faviconvitest watchรันและติดตามการเปลี่ยนแปลงไฟล์--ignore
vitest.dev faviconvitest devรันการทดสอบในโหมดพัฒนา--api
vitest.dev faviconvitest relatedรันเฉพาะการทดสอบที่เกี่ยวข้องกับไฟล์ที่แก้ไข--changed
vitest.dev faviconvitest benchรันการทดสอบประสิทธิภาพ--watch
vitest.dev faviconvitest initสร้างไฟล์ config เริ่มต้น--force
vitest.dev faviconvitest listแสดงรายการการทดสอบทั้งหมด--verbose

APIs

Test API Reference

Test API Reference คือชุดคำสั่งสำหรับการเขียนการทดสอบใน Vitest โดยมีคำสั่งหลักๆ ดังนี้

APIคำอธิบายตัวอย่าง
vitest.dev favicontest()กำหนดการทดสอบtest('description', () => { ... })
vitest.dev favicondescribe()กลุ่มการทดสอบdescribe('feature', () => { ... })
vitest.dev faviconbeforeAll()เรียกก่อนทุกการทดสอบbeforeAll(() => setup())
vitest.dev faviconafterAll()เรียกหลังทุกการทดสอบafterAll(() => cleanup())
vitest.dev faviconbeforeEach()เรียกก่อนแต่ละการทดสอบbeforeEach(() => init())
vitest.dev faviconafterEach()เรียกหลังแต่ละการทดสอบafterEach(() => reset())
vitest.dev favicononTestFinished()เรียกเมื่อการทดสอบเสร็จสิ้นonTestFinished(() => cleanup())
vitest.dev favicononTestFailed()เรียกเมื่อการทดสอบล้มเหลวonTestFailed(({ task }) => log(task))

Mock Functions

Mock Functions ช่วยให้คุณสร้างและจัดการฟังก์ชันจำลอง (mock functions) สำหรับทดสอบ โดยสามารถกำหนดพฤติกรรมและตรวจสอบการเรียกใช้ได้

Method/Propertyคำอธิบายตัวอย่าง
vitest.dev faviconmockImplementation()กำหนดการทำงานของ mock functionmock.mockImplementation(() => 'value')
vitest.dev faviconmockImplementationOnce()กำหนดการทำงานของ mock function แบบครั้งเดียวmock.mockImplementationOnce(() => 'once')
vitest.dev faviconmockReturnValue()กำหนดค่าที่จะ returnmock.mockReturnValue(42)
vitest.dev faviconmockReturnValueOnce()กำหนดค่าที่จะ return แบบครั้งเดียวmock.mockReturnValueOnce(1)
vitest.dev faviconmockResolvedValue()กำหนดค่าที่จะ resolve สำหรับ async functionmock.mockResolvedValue('data')
vitest.dev faviconmockResolvedValueOnce()กำหนดค่าที่จะ resolve แบบครั้งเดียวmock.mockResolvedValueOnce('temp')
vitest.dev faviconmockRejectedValue()กำหนดค่าที่จะ reject สำหรับ async functionmock.mockRejectedValue(new Error())
vitest.dev faviconmockClear()ล้างประวัติการเรียกใช้mock.mockClear()
vitest.dev faviconmockReset()ล้างประวัติและรีเซ็ตการทำงานmock.mockReset()
vitest.dev faviconmockRestore()คืนค่า function เดิมmock.mockRestore()
vitest.dev faviconmock.callsอาร์เรย์ของทุกการเรียกใช้mock.mock.calls
vitest.dev faviconmock.resultsอาร์เรย์ของทุกผลลัพธ์mock.mock.results
vitest.dev faviconmock.contextsอาร์เรย์ของ context thismock.mock.contexts
vitest.dev faviconmock.instancesอาร์เรย์ของ instancesmock.mock.instances

Vi Utility

Utility functions สำหรับจัดการ timers, globals และ mock ทั้งหมดใน Vitest

APIคำอธิบายตัวอย่าง
vitest.dev faviconvi.useFakeTimers()mock timer functionsvi.useFakeTimers()
vitest.dev faviconvi.stubGlobal()mock global variablesvi.stubGlobal('fetch', mockFetch)
vitest.dev faviconvi.clearAllMocks()ล้าง mock ทั้งหมดvi.clearAllMocks()
vitest.dev faviconvi.useRealTimers()เรียกใช้ timer จริงvi.useRealTimers()
vitest.dev faviconvi.advanceTimersByTime()เลื่อนเวลาใน fake timersvi.advanceTimersByTime(1000)
vitest.dev faviconvi.runAllTimers()รัน timer ทั้งหมดที่ pendingvi.runAllTimers()
vitest.dev faviconvi.setSystemTime()ตั้งค่าเวลาในระบบvi.setSystemTime(new Date(2023, 0, 1))

Expect

Assertion functions สำหรับตรวจสอบผลลัพธ์ที่คาดหวังในการทดสอบ

APIคำอธิบายตัวอย่าง
vitest.dev faviconexpect()ตรวจสอบผลลัพธ์expect(value).toBe(3)
vitest.dev favicon.toBe()ตรวจสอบความเท่ากันexpect(1 + 1).toBe(2)
vitest.dev favicon.toEqual()ตรวจสอบ object/arrayexpect(obj).toEqual({key: value})
vitest.dev favicon.toMatch()ตรวจสอบ string ด้วย regexexpect('hello').toMatch(/llo/)
vitest.dev favicon.toContain()ตรวจสอบ array/string มีค่าที่ต้องการexpect([1,2]).toContain(1)
vitest.dev favicon.toBeTruthy()ตรวจสอบค่า truthyexpect('hello').toBeTruthy()
vitest.dev favicon.toBeFalsy()ตรวจสอบค่า falsyexpect('').toBeFalsy()
vitest.dev favicon.toBeDefined()ตรวจสอบค่า definedexpect(var).toBeDefined()
vitest.dev favicon.toBeUndefined()ตรวจสอบค่า undefinedexpect(undefined).toBeUndefined()
vitest.dev favicon.toBeNull()ตรวจสอบค่า nullexpect(null).toBeNull()

ExpectTypeOf

Assertion functions เฉพาะสำหรับตรวจสอบประเภทข้อมูล TypeScript

APIคำอธิบายตัวอย่าง
vitest.dev faviconexpectTypeOf()ตรวจสอบ typeexpectTypeOf(1).toBeNumber()
vitest.dev favicon.toBeNumber()ตรวจสอบ type numberexpectTypeOf(1).toBeNumber()
vitest.dev favicon.toBeString()ตรวจสอบ type stringexpectTypeOf('a').toBeString()
vitest.dev favicon.toBeBoolean()ตรวจสอบ type booleanexpectTypeOf(true).toBeBoolean()
vitest.dev favicon.toBeSymbol()ตรวจสอบ type symbolexpectTypeOf(Symbol()).toBeSymbol()
vitest.dev favicon.toBeNull()ตรวจสอบ type nullexpectTypeOf(null).toBeNull()
vitest.dev favicon.toBeUndefined()ตรวจสอบ type undefinedexpectTypeOf(undefined).toBeUndefined()
vitest.dev favicon.toBeArray()ตรวจสอบ type arrayexpectTypeOf([]).toBeArray()
vitest.dev favicon.toBeFunction()ตรวจสอบ type functionexpectTypeOf(() => {}).toBeFunction()
vitest.dev favicon.toBeObject()ตรวจสอบ type objectexpectTypeOf({}).toBeObject()
vitest.dev favicon.toHaveProperty()ตรวจสอบ property ของ objectexpectTypeOf({a:1}).toHaveProperty('a')

Assert

Assertion functions แบบดั้งเดิม (เหมือนกับใน Node.js assert module)

APIคำอธิบายตัวอย่าง
vitest.dev faviconassert()assertion แบบดั้งเดิมassert(true)
vitest.dev faviconassert.equal()ตรวจสอบความเท่ากันassert.equal(1, 1)
vitest.dev faviconassert.isTrue()ตรวจสอบค่า trueassert.isTrue(true)
vitest.dev faviconassert.isFalse()ตรวจสอบค่า falseassert.isFalse(false)
vitest.dev faviconassert.isExtensible()ตรวจสอบ object ที่สามารถเพิ่ม propertyassert.isExtensible({})
vitest.dev faviconassert.isNotExtensible()ตรวจสอบ object ที่ไม่สามารถเพิ่ม propertyassert.isNotExtensible(Object.preventExtensions({}))
vitest.dev faviconassert.isSealed()ตรวจสอบ sealed objectassert.isSealed(Object.seal({}))
vitest.dev faviconassert.isFrozen()ตรวจสอบ frozen objectassert.isFrozen(Object.freeze({}))
vitest.dev faviconassert.isEmpty()ตรวจสอบค่าว่างassert.isEmpty([])
vitest.dev faviconassert.isNotEmpty()ตรวจสอบค่าไม่ว่างassert.isNotEmpty([1])

AssertType

Assertion functions สำหรับตรวจสอบประเภทข้อมูล TypeScript แบบ low-level

APIคำอธิบายตัวอย่าง
vitest.dev faviconassertType()ตรวจสอบ type ใน compile-timeassertType<string>('test')
vitest.dev faviconassertType<T>()ตรวจสอบ generic typeassertType<number>(1)

Examples

Basic Test Example

math.test.ts
ts
import { describe, expect, it } from "vitest";

// describe: ใช้จัดกลุ่ม test case ที่เกี่ยวข้องกัน
// it: ใช้กำหนดแต่ละ test case
// expect: ใช้เขียน assertions

describe("basic math", () => {
  it("adds two numbers", () => {
    expect(1 + 1).toBe(2);
  });

  it("subtracts numbers", () => {
    expect(5 - 3).toBe(2);
  });
});

File System Testing

file.test.ts
ts
import { existsSync, readFileSync } from "fs";
import { describe, expect, it } from "vitest";

// existsSync: ตรวจสอบว่ามีไฟล์อยู่หรือไม่
// readFileSync: อ่านเนื้อหาไฟล์แบบ synchronous

describe("file operations", () => {
  it("checks if file exists", () => {
    expect(existsSync("./package.json")).toBe(true);
  });

  it("reads file content", () => {
    const content = readFileSync("./package.json", "utf-8");
    expect(content).toContain("\"name\"");
    expect(content).toContain("\"version\"");
  });
});

Component Testing (Vue)

MyComponent.spec.ts
ts
import { mount } from "@vue/test-utils";
import { describe, expect, it } from "vitest";
import MyComponent from "./MyComponent.vue";

describe("MyComponent", () => {
  it("renders correctly", () => {
    const wrapper = mount(MyComponent, {
      props: { msg: "Hello Vitest" },
    });
    expect(wrapper.text()).toContain("Hello Vitest");
  });
});

Testing File Upload (Mocking)

ts
import { describe, expect, it, vi } from "vitest";
import { uploadFile } from "./file-utils";

// สร้าง mock file object
// File constructor: สร้าง object ที่เลียนแบบไฟล์จริง
const mockFile = new File(["content"], "test.txt", { type: "text/plain" });

// ตัวอย่างการทดสอบ file upload
// vi.fn(): mock fetch API
// mockResolvedValue: กำหนด response ที่ต้องการ

describe("file upload", () => {
  it("uploads file successfully", async () => {
    global.fetch = vi.fn().mockResolvedValue({
      ok: true,
      json: () => Promise.resolve({ success: true }),
    });

    const result = await uploadFile(mockFile);

    // ตรวจสอบว่าอัพโหลดสำเร็จ
    expect(result.success).toBe(true);

    // ตรวจสอบว่าเรียก fetch
    expect(fetch).toHaveBeenCalled();
  });
});

Last updated: