首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

前端单,为什么不要 “实现细节”?

它的意思是测试用虽然失败了,但它是因为测试代码有问题所以崩了,并不是因为业务代码/应用代码导致崩溃了。...因为我们只了业务中非常小的一个实现细节,所以为这个实现细节,我们不得不补另外很多测试用,来其它毫不相关的实现细节,那这样我们永远都不可能补完所有实现细节的测试代码。...然而 Enzyme 的测试用基本都是在这些别人根本不 care 的内容。...这也是为什么 Enzyme 测试用为什么这么容易出现 “假错误”,因为 当用它来写一些 End User 和 Developer 都不 care 的测试用,我们实际上是在创造第三个用户视角:Tests...不使用 Enzyme 的另一个原因是 Enzyme 在 React Hooks 使用上有很多问题。事实证明,当测试代码 “实现细节” ,“实现细节” 的中的任何修改都会对测试有很大的影响。

92250

前端测试常见的 3 个误区

在做前端测试,选用合适的测试策略远比一通狂写测试更重要,所谓 “方向 > 努力”。 如果选择了错误的测试策略,很容易写出维护性差和不稳定的测试用。一旦业务出现变化,用就全崩了。...像上面那样过度测试实现细节会带来两个结果: 我可以在测试完全通过的情况下弄崩业务代码(比如在 onClick 赋值故意写错变量名) 我可以在重构业务代码的时候弄崩测试用(例如,把 increment...重命名为 updateCount,测试就崩了,但业务代码是能正常运行的) (译注:作者对重构的理解是:改动业务代码逻辑测试代码不应该做改动的,因为业务逻辑没变,只是实现方式变了) 类似这样的测试用是最难维护的...代码覆盖只能告诉你一件事: 这行代码有被测试用跑过 然而,它没有告诉你的事有: 代码是否按业务需求来正常工作 代码是否能和项目里其它代码一起工作 项目崩了的时候会发生什么(这里指意外崩溃) 代码覆盖率的另一个问题是...当你很痛苦地编写测试用的时候,那么很可能你钻入了牛角尖,往错误的方向写测试了,这时就要停止然后回过头来想:怎么做才能提高代码自信呢? 参考资料 [1] Kent C.

33720
您找到你想要的搜索结果了吗?
是的
没有找到

单元测试

/BLoginModal/services/wxApi'; // 这种方式设计到代码细节问题需避免使用,如果方法名 getWXSanqrAjax 变更将导致测试用执行失败 jest.spyOn(wxApis...,但是当运行一组测试用,会出现报错 这种情况通常是由于在一组测试用中,前一个测试用没有正确地清理或重置测试环境,导致后续的测试无法找到期望的元素或状态。...这样可以确保每个测试用都在相同的初始状态下运行,并且没有残留的状态或影响。 在每个测试用之后使用 afterEach 函数或 afterAll 函数来清理测试环境。...这样可以确保每个测试用完成后,不会留下任何对后续测试用有影响的状态。 确保在每个测试用中,等待异步操作完成后再进行断言。...检查测试用代码中是否存在任何可能导致测试环境污染或干扰的因素,例如全局状态、全局变量等。尽量将测试用代码进行封装和隔离,以确保每个测试的独立性。

15610

在 ts + Jest 单元测试中 debugging

TS 写的 所功能无 UI 界面,且出现 bug 初步定位到是循环体内部问题,功能较为复杂 用 console 式 debug 效率太低,需要打断点式调试 在 Jest 单中进行 debugger...2、步骤 在认为可能失败并输入的测试中插入一个 debugger。...弹出一个单独的 devtools 窗口 执行命令 node --inspect node_modules/.bin/jest --runInBand --runInBand 选项,表示仅在当前的进程中连续运行所有测试...Jest运行测试用的特点是多进程并发运行不同测试案例,达到快速的效果。但是这样对调试来说是没法进行的。这个参数保证了使用一个进程运行所有代码。 接下来就可以开心的 debug 了: ?...launch.json 的配置项,可以借鉴一下 使用jest+enzyme进行react项目测试 - debug篇:虽说是 2017 年的文章,仍旧有可借鉴性 Debugging with TypeScript

3.9K30

前端单元测试,更进一步

pre-commit 等开发流程中,也容易重蹈早期 Jasmine 等基于浏览器页面单的覆辙 -- 编写简单但很容易过时失效。...) ).toBeInTheDocument(); }; 类似单在命令行中的红绿结果,交互式测试的每个步骤、其成功失败,都会显示在相应的面板中: 复用测试用 不难发现,工具栈相同、写法无异,...需要做的也非常简单,直接在单中 import 后 play 就是了: // foo.spec.jsx import { render } from '@testing-library/react';...FooUISpec />); await FooUISpec.play({ canvasElement: container }); }); 总结 现在,我们可以让 Storybook 和单元测试分享测试用...,甚至可以在 Playwright 中调用 Storybook 服务后再编写自动化测试 -- 后者这里不展开讨论了;总之,测试工具的发展,给了前端开发者更直观编写测试用的手段,最终也更好地保证了前端项目的开发质量

1K00

前端测试一共有哪几种?

还记得刚刚就让你记住两件事么: 越往上走,遇到的报错和失败就越多,因此你的测试也越容易崩 单一般只用来无依赖的小东西,或者把它的依赖 Mock 掉再测试(把上千行代码替换成几行 Mock 实现) 这两点说的都是...所以,如果你在做低层级的测试,会需要更多测试用来覆盖应用程序中相同数量的代码。实际上,当你越往模型下面走,会有很多东西是没办法测试的。...现在让我们从另一个角度出发:在模型的顶端,如果你想用 E2E 来检查输入文本和点击提交后表单的边界用,你需要启动整个应用来做很多初始准备工作(后端也要),对这样场景来说,用集成测试会更合适。...而如果你想用集成测试测试优惠券的边界情况,你可能要在初始函数里做一些准备工作来渲染出优惠券生成组件,然后才能通过单更好地覆盖边界用。...一个 E2E 测试失败很多次,所以很难追踪哪些代码导致的崩溃,但这也意味着它能给你带来更多的信心。这样的测试在你没有时间写测试是很有用的。

52520

来聊聊我们为什么要写单

上面说的单特点比较偏向于 “防守”,而 TDD 中的测试则偏向于 “进攻”。 TDD 的原理是在开发功能代码之前,先编写单元测试用代码,在此基础上再补充产品代码。...当接口更新了之后,Postman 的用可能存在过期的情况 单元测试则很好地填补了这一块,利用单强大的 Mock 能力先将依赖项都 Mock 掉,开发可以只关注某个函数、服务的开发,不会受其依赖项干扰...用即例子 测试用还有个很好的功能:将使用案例记录在案。 很多时候别人写一些工具函数和方法,使用者是不能一眼就能学会怎么用的。往往这时写函数的人就会说:你看 XXX 文件就知道怎么用了。...然而,只有在真正编写测试用的时候才会发现单的难度呈指数级上涨。因为测试的本身是另一个领域,是需要通过不断练习才能掌握测试技巧的。...不过,从另一个角度来看,如果你能坚持写好单,对个人能力也大有裨益: 提升不同环境的 Mock 能力。 掌握不同测试框架的测试技巧 提升异常分支的感知能力。

43620

测试中如何处理 Http 请求?

这会好点,但这也会遇到第 1 点类似的问题 把所有东西都放在函数中,然后拿来做单(这样还行),这样就避免在集成测试中再一遍(不太好,译注:不太好是因为集成测试应该要对整个功能进行测试,这样分开就不完整了...这里还可以给它再多加一个失败的 Case,不过我已经很满意了。 这样做的好处是对大量测试用都不用写特别多的代码就能提高我对业务逻辑的信心了。...对于自定义的场景,msw 可以在运行时允许你在测试用中添加自定义的 Server Handler,也可以一键重置成你原来的 Handler,以此保留隔离性。...msw 不仅可以在测试中拦截请求,实现集成、E2E 测试,还可以在前端开发来 Mock 数据,确实是一个有趣的实践。 最近也给我们项目写不少单,其实单和集成测试还是有很多互补的地方的。...当你发现要测试的东西太复杂,或者太多干扰项,使用集成测试会让你真正从用户的角度来写测试。这样一来,你就不会过度关注那些覆盖率指标了,而是从一个用户的角度来思考这样的用能给我带来多少信心。

1.2K10

React团队是如何测试并发特性的

对于测试React内部运行机制」这样的场景,掺杂了宿主环境相关信息显然会让测试用编写起来更繁琐。 2. 如何测试并发环境?...如果将上文的用中ReactDOM.render改为ReactDOM.createRoot,那么用就会失败: // 之前 ReactDOM.render(<FunctionComponent name...比如上面的异步代码,在React中的测试用例会这么写: // 测试用修改后: await act(() => { ReactDOM.createRoot(el).render(<FunctionComponent...比如,我想测试组件卸载useEffect回调的执行顺序。...中测试用的编写策略为: 可以用ReactDOM的用,一般结合ReactDOM与ReactTestUtils(浏览器环境的辅助方法)完成 需要把控中间过程的用,使用Scheduler的测试包,用Scheduler.unstable_yieldValue

1.3K20

单元测试最佳实践|如何避免常见陷阱?

这种问题被称为误报,看似无懈可击的测试用,其实没什么用处,为了防止这种情况,请考虑是什么导致您的测试失败。更好的是,从失败测试开始,然后编写代码直到它通过。在不知不觉中,您正在进行测试驱动开发。...使用单元测试保证非确定性行为的正确性 这是一个众所周知的谬论。如果您的测试或被代码以不确定的方式运行,您将对测试失去信心。每次失败,你都会问:我的测试失败了,还是会通过重新运行?...重新修改运行都会给你的测试用带来修改的麻烦,你甚至想要放弃单元测试用。 对于测试来说,不确定性的缺点是显而易见的,那么是什么导致了这种情况呢? 您是否在测试中使用当前时间或日期?...如果是,则您的测试每天都在使用不同的数据运行。一旦您从事该行业的时间足够长,您就会遇到这些类型的测试。它们可能仅在该月的最后一天失败,或者仅在午夜之前开始并在之后完成。...它非常适合填充演示环境或冒烟测试。对于单元测试不是那么有用,通常而言,使用硬编码的单元测试用最可靠。

84530

前端单,我们应该什么?

所以,当你看着这份覆盖率报告,你不要总想着那些 if/else、循环或者生命周期,而是要问问自己: 这几行代码实现对应的是哪些使用用?我应该要加哪些测试用来覆盖它们?...值,则返回空数组 传入非 falsy 值且不是数组,返回一个数组,其中包含的输入值 现在再来把测试用都加上,然后再来看覆盖情况: test('传入 falsy 值,则返回空数组', () => {...(),那么这样的测试用就不能很好地给足我们代码的信心了。...很多人在做 React 代码测试,经常会想到一些让他们不断 “实现细节” 的测试点。...后面 Kent 说到要如何把测试引入团队的方法也很值得大家去尝试:先按功能优先级列出个清单,再写 E2E 覆盖住最重要的那部分,再加集成测试,再加单元测试,等一切就绪,那么剩下的就是时间堆测试用,最后测试用也能慢慢融入到代码中了

67720

React 组件进行单元测试

单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试测试框架 测试框架的作用是提供一些方便的语法来描述测试用,以及对用进行分组。...测试用 test case 为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。 一般的形式为: it('should ......测试覆盖率(code coverage) 用于统计测试用对代码的测试情况,生成相应的报表,比如 istanbul 是常见的测试覆盖率统计工具 II....此外, Jest 的测试用是并行执行的,而且只执行发生改变的文件所对应的测试,提升了测试速度。...React代码,并且还使用了ES6语法,所以项目下需要存在一个.babelrc文件: { "presets": ["env", "react"] } 以上是基本的配置,而实际由于webpack可以编译

4.2K40

前端接入单元测试(Node+React)

此时老框架针对其内部API函数,写了充分的单侧用。在开发新框架,直接运行老前端框架的单侧用,如果所有测试用都通过,则可快速保证内部api的一致性,快速验证所有功能。...如果频繁修改业务代码,对应的测试用可能也要修改。...://testone.woa.com/dwt/tiyan#/docs/getStarted 可视化查询测试结果,可结合蓝盾插件和质量红线做流水线测试,整个配置比较重,耗时,目前项目缺少测试用,可在后续集成...orange-ci跑单元测试 优点:配置简单,和现有的工作流集成在一起,可以在构建前执行测试用,执行效率高…总结node项目可以利用egg自带的测试工具,针对controller, service,...extend, helper等模块编写单元测试,特别是controller重要的路由需要做单元测试;控制台和其他React项目可以利用jest工具,针对方法、组件、模块去做单元测试,特别是组件,可以利用快照功能避免多次修改测试用

3.2K30

react生态下jest单元测试

Enzyme: React测试类库Enzyme提供了一套简洁强大的API,并通过jQuery风格的方式进行DOM处理,开发体验十分友好。不仅在开源社区有超高人气,同时也获得了React官方的推荐。...module.exports = Hook; 文件名:Hook.test.js describe('hook', () => { const hook = new Hook(); // 每个测试用执行前都会还原数据...后面每次再运行快照测试,都会和第一次的比较,若组件代码有所改变,则快照测试失败,如果组件代码是最新的,优化过得代码,则需要更新快照,免得每次执行报错。...更新快照命令:jest --updateSnapshot 被组件代码如下: //被组件 import React from 'react'; const STATUS = { HOVERED...如果尝试对这些对象进行快照,它们将强制快照在每次运行时失败. //2.Jest允许为任何属性提供非对称匹配器。

2.2K20

React 现代化测试

测试的动机 测试用的书写是一个风险驱动的行为, 每当收到 Bug 报告, 先写一个单元测试来暴露这个 Bug, 在日后的代码提交中, 若该测试用是通过的, 开发者就能更为自信地确保程序不会再次出现此...: 静态测试: 在编写代码逻辑阶段进行报错提示。...测试组件的具体细节会带来的两个问题: 测试用对代码错误否定; 测试用对代码错误肯定; 以轮播图组件为, 依次来看上述问题。...因为这段代码对于使用方来说是不存在问题的, 但是测试用却抛出错误, 此时开发者不得不做'无用功'来调整测试用适配新代码。...相较于 enzyme, react-testing-library 所提供的 api 更加贴近用户的使用行为, 使用其对上述测试用进行重构: import { render, fireEvent }

91630

如何测试驱动开发 React 组件?

它的原理就是在编写代码之前先编写测试用,由测试来决定我们的代码。而且 TDD 更多地需要编写独立的测试用,比如只测试一个组件的某个功能点,某个工具函数等。...TDD 的过程 编写测试用 运行测试测试失败 修改代码 测试通过 重构/优化代码 新增功能,重复上述步骤 在某种程度上,它可能在初学者看来是单调乏味或者不切实际的,但是严格按照这个步骤来做这件事,...让你自己决定测试用是否对你的组件有帮助,会让测试用变得有意义。...确保渲染测试 第一个测试相当抽象。仅仅需要检查组件是否展现(任何东西) ,以确保这个组件是存在。但是实际上,我将测试的组件还不存在。...动态标题测试 创建一个测试用: it('should have a dynamic title', () => { const title = '标题'; const { getByText

2.1K10

如何测试驱动开发 React 组件?

它的原理就是在编写代码之前先编写测试用,由测试来决定我们的代码。而且 TDD 更多地需要编写独立的测试用,比如只测试一个组件的某个功能点,某个工具函数等。...TDD 的过程 编写测试用 运行测试测试失败 修改代码 测试通过 重构/优化代码 新增功能,重复上述步骤 image.png 在某种程度上,它可能在初学者看来是单调乏味或者不切实际的,但是严格按照这个步骤来做这件事...,让你自己决定测试用是否对你的组件有帮助,会让测试用变得有意义。...确保渲染测试 第一个测试相当抽象。仅仅需要检查组件是否展现(任何东西) ,以确保这个组件是存在。但是实际上,我将要测试的组件还不存在。...动态标题测试 创建一个测试用: it('should have a dynamic title', () => { const title = '标题' const { getByText }

2.1K10

那些年错过的React组件单元测试(上)

我们发现有以下几种模式: f: 只会测试之前没有通过的测试用 o: 只会测试关联的并且改变的文件(需要使用 git)(jest --watch 可以直接进入该模式) p: 测试文件名包含输入的名称的测试用...t: 测试用的名称包含输入的名称的测试用 a: 运行全部测试用测试过程中,你可以切换适合的模式。...钩子函数 类似于 react 或者 vue 的生命周期,一共有四种: beforeAll():所有测试用执行之前执行的方法 afterAll():所有测试用跑完以后执行的方法 beforeEach(...如果代码中使用了Promise,则可以通过返回Promise来处理异步代码,jest会等该promise的状态转为resolve才会结束,如果promise被reject了,则该测试用不通过。...当我们再次运行快照测试,Jest 会将新的快照与旧的快照进行比较,如果两者不一致,测试就会失败,从而帮助我们确保用户界面不会发生意外改变。 ?

4.9K20

使用 React Testing Library 的 15 个常见错误

以前的我(Kent)并不是很喜欢那个时候的测试环境,为此写了一个 React Testing Library。...低:一般为我的主观想法,如果你觉得使用上没啥问题可以忽略它 中:如果你不遵循,可能会出现 Bugs、低效的测试用、还可能会做额外的工作 高:一定要用我建议的方法。...不然很有可能你会遇到大问题,而且测试用并不怎么高效 没有使用 Testing Library 的 ESLint 插件 重要程度:中 如果你想避免这些常见的错误,那么官方的 ESLint 插件可以给你带来很多帮助...但这样你也会留下一个脆弱的测试用,一旦改了某些异步逻辑它很可能就崩了。...而如果 waitFor 里只有一个断言,我们则可以等待 UI 渲染到断言的同时,也可以在其中一个断言失败更快地获得报错信息。

1.2K20
领券