单元测试、集成测试和端到端测试均由 vitest 支持,vitest 是专为 vite 设计的快速且现代的测试框架。通过与 react 和 vue 等当代 javascript 库的顺利集成,它提供了一种快速有效的方法来编写无需设置的测试。本文将讨论使用 vitest 框架编写可靠、可管理且有效的测试的最佳方法。
1。设置 vitest
在深入研究高级技术之前,让我们使用 vitest 建立一个简单的项目。如果您在项目中使用 vite,vitest 的设计只需最少的设置即可开箱即用。
第 1 步:安装 vitest
要安装 vitest,请在项目目录中运行以下命令:
npm install vitest --save-dev
第 2 步:创建一个简单的测试
安装后,创建一个简单的测试文件来查看 vitest 的运行情况。
import { describe, it, expect } from 'vitest'; describe('math functions', () => { it('should add two numbers correctly', () => { const sum = 1 + 2; expect(sum).tobe(3); }); });
使用以下命令运行测试:
npx vitest
2。使用describe 和it blocks 组织测试
describe 和 it 块是 vitest(以及许多其他测试框架,如 jest)的基础。它们有助于逻辑地组织您的测试并使它们更易于阅读。
describe:用于对相关测试进行分组。
it:在描述块中定义单独的测试用例。
这种结构可确保您的测试用例随着测试套件的增长而组织良好且可维护。
describe('user authentication', () => { it('should login with valid credentials', () => { // test login functionality }); it('should fail to login with invalid credentials', () => { // test invalid login functionality }); });
3。模拟依赖
在现代应用程序中,测试通常需要模拟 api、数据库或第三方库等外部服务。 vitest 为模拟依赖项提供本机支持,这有助于隔离您想要测试的行为。
模拟 api 调用示例
让我们使用 vitest 的 vi.fn 来模拟一个简单的 api 调用来模拟函数,而无需实际调用外部服务。
import { vi } from 'vitest'; import { fetchuserdata } from './api'; vi.mock('./api', () => ({ fetchuserdata: vi.fn(), })); describe('user api', () => { it('should fetch user data correctly', async () => { const mockuserdata = { id: 1, name: 'john doe' }; fetchuserdata.mockresolvedvalueonce(mockuserdata); const result = await fetchuserdata(1); expect(result).toequal(mockuserdata); }); });
在此示例中,我们模拟了 fetchuserdata 函数,使我们能够控制响应并避免进行真正的 api 调用。
4。快照测试
vitest 支持快照测试,当您想要验证组件或函数随时间的输出时,这非常有用。这种技术对于 ui 组件特别有益。
快照测试示例
import { describe, it, expect } from 'vitest'; import { render } from '@testing-library/react'; import mycomponent from './mycomponent'; describe('mycomponent', () => { it('should match the snapshot', () => { const { container } = render(<mycomponent></mycomponent>); expect(container).tomatchsnapshot(); }); });
快照测试可确保组件输出保持一致。如果输出发生变化,系统会提示您更新快照,帮助捕获无意的更改。
5。测试异步代码
在测试异步函数时,vitest 提供了处理 promise 的实用程序,可以更轻松地确保异步代码按预期工作。
测试异步函数示例
import { describe, it, expect } from 'vitest'; const fetchdata = async () => { return new promise((resolve) => settimeout(() => resolve('data'), 1000)); }; describe('async functions', () => { it('should resolve data', async () => { const data = await fetchdata(); expect(data).tobe('data'); }); });
此技术对于测试 api 请求、计时器或其他异步代码至关重要。
6。代码覆盖率
vitest 支持生成开箱即用的代码覆盖率报告,这可以帮助您了解测试覆盖了多少代码库。它显示了代码的哪些部分已经过测试,哪些部分尚未测试。
启用代码覆盖
要启用代码覆盖率,请将以下内容添加到您的 vitest 配置中:
// vite.config.js or vitest.config.js export default { test: { coverage: { reporter: ['text', 'html'], }, }, };
运行覆盖范围的测试:
npx vitest --coverage
这将生成一份覆盖率报告,让您可以分析代码的哪些区域需要更多测试。
7。参数化测试
参数化测试是运行具有不同输入和预期输出的单个测试用例的好方法。这减少了代码重复并确保您的函数在各种场景下都能正确运行。
参数化测试示例
describe.each([ [1, 2, 3], [2, 3, 5], [5, 5, 10], ])('math operations', (a, b, expected) => { it(`should add ${a} and ${b} to equal ${expected}`, () => { expect(a + b).tobe(expected); }); });
通过使用describe.each,您可以在单个测试用例中迭代不同的输入集和预期输出,使您的测试更加dry(不要重复自己)。
8。使用测试库测试 react 组件
vitest 与 react 测试库配合良好,react 测试库是一种用于测试 react 组件的流行工具。它鼓励测试组件的行为,而不是实现细节。
react 组件测试示例
import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; import MyButton from './MyButton'; describe('MyButton Component', () => { it('should render correctly', () => { render(<mybutton></mybutton>); expect(screen.getByText('Click Me')).toBeInTheDocument(); }); it('should call onClick when clicked', () => { const handleClick = vi.fn(); render(<mybutton onclick="{handleClick}"></mybutton>); screen.getByText('Click Me').click(); expect(handleClick).toHaveBeenCalledTimes(1); }); });
使用 vitest 测试 react 组件可确保您的 ui 在与按钮、输入或其他元素交互时按预期运行。
结论
无需设置,vitest 框架即可提供强大、现代的测试体验。您可以通过遵循最佳实践来构建可靠且有效的测试套件,其中包括使用描述块来组织测试、模拟外部服务以及利用快照测试。此外,启用代码覆盖率、测试 react 组件和测试异步代码等方法将保证您的应用程序经过良好的测试和维护。