设计属性测试的输入生成器时,如何让空值、极值、Unicode 等边界数据被充分采到?
设计属性测试的输入生成器时,如何让空值、极值、Unicode 等边界数据被充分采到? 本文先给出可直接复述的结论,再用最小代码说明fast-check arbitrary 边界生成的工作方式、判断依据、项目边界和常见误区。
单元与集成测试专题面试题第 1 页,显示第 1–40 题,共找到 40 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
设计属性测试的输入生成器时,如何让空值、极值、Unicode 等边界数据被充分采到? 本文先给出可直接复述的结论,再用最小代码说明fast-check arbitrary 边界生成的工作方式、判断依据、项目边界和常见误区。
断言 mock「被调用过」和「以特定参数调用」的说服力差异在哪,为什么参数断言更防回归? 本文先给出可直接复述的结论,再用最小代码说明toHaveBeenCalledWith 参数断言的工作方式、判断依据、项目边界和常见误区。
自定义断言失败消息应该包含哪些信息才能让失败输出直接定位问题? 本文先给出可直接复述的结论,再用最小代码说明断言失败消息 可读性 设计的工作方式、判断依据、项目边界和常见误区。
单元测试里断言失败和普通代码抛异常有什么区别,为什么不能用 try-catch 代替断言? 本文先给出可直接复述的结论,再用最小代码说明断言失败 异常 单元测试的工作方式、判断依据、项目边界和常见误区。
expect.any、expect.objectContaining 这类非对称匹配器何时该用,滥用会掩盖什么回归? 本文先给出可直接复述的结论,再用最小代码说明expect.objectContaining 非对称匹配器的工作方式、判断依据、项目边界和常见误区。
beforeEach 和 beforeAll 建立测试环境时该如何选择,什么情况下 beforeAll 会破坏隔离? 本文先给出可直接复述的结论,再用最小代码说明beforeEach beforeAll 区别 测试隔离的工作方式、判断依据、项目边界和常见误区。
为什么 afterEach 中清理比在被测代码里清理更可靠,清理遗漏会造成什么后果? 本文先给出可直接复述的结论,再用最小代码说明afterEach 清理 测试污染的工作方式、判断依据、项目边界和常见误区。
消费者驱动契约测试解决的是 mock 与真实服务之间什么具体的漂移问题? 本文先给出可直接复述的结论,再用最小代码说明消费者驱动契约测试 mock 漂移的工作方式、判断依据、项目边界和常见误区。
契约测试能否替代跨服务的集成测试,两者各自覆盖不了的失败类型是什么? 本文先给出可直接复述的结论,再用最小代码说明契约测试 集成测试 区别的工作方式、判断依据、项目边界和常见误区。
契约测试中生产者端和消费者端各自验证什么,为什么只在一端验证不够? 本文先给出可直接复述的结论,再用最小代码说明契约测试 生产者 消费者 双向验证的工作方式、判断依据、项目边界和常见误区。
测试一个防抖输入框时用 fake timer 应验证哪几个时间点(未到间隔、恰好到间隔、连续触发)? 本文先给出可直接复述的结论,再用最小代码说明防抖 测试 fake timer的工作方式、判断依据、项目边界和常见误区。
为什么测试数据要用固定种子或显式构造而不是 Math.random,随机数据带来的不可重复失败如何诊断? 本文先给出可直接复述的结论,再用最小代码说明测试数据 确定性 随机种子的工作方式、判断依据、项目边界和常见误区。
Vitest 中 expect.assertions() 和 expect.hasAssertions() 在异步测试里分别防止什么漏检? 本文先给出可直接复述的结论,再用最小代码说明Vitest expect.assertions 异步断言漏检的工作方式、判断依据、项目边界和常见误区。
fake timer 开启后为什么有些测试会假死(例如等待真实请求超时),如何避免? 本文先给出可直接复述的结论,再用最小代码说明fake timer 卡死 真实请求的工作方式、判断依据、项目边界和常见误区。
fake timer 下异步代码卡在 await 上时,runAllTimersAsync 与 advanceTimersByTimeAsync 分别解决什么问题? 本文先给出可直接复述的结论,再用最小代码说明runAllTimersAsync 假定时器 微任务的工作方式、判断依据、项目边界和常见误区。
Vitest 的 vi.useFakeTimers() 如何跳过 setTimeout 等待,为什么必须配合 advanceTimersByTime 而非直接 await? 本文先给出可直接复述的结论,再用最小代码说明Vitest fake timers advanceTimersByTime的工作方式、判断依据、项目边界和常见误区。
vi.setSystemTime() 固定当前时间对测试 Date.now 依赖的代码(如过期判断)有什么价值,与时区问题的关系是什么? 本文先给出可直接复述的结论,再用最小代码说明vi.setSystemTime 固定时间 Date.now的工作方式、判断依据、项目边界和常见误区。
数据库类夹具选择「每用例全新数据」还是「共享只读基线数据」,各自适合什么测试目标? 本文先给出可直接复述的结论,再用最小代码说明测试夹具 共享数据 全新数据的工作方式、判断依据、项目边界和常见误区。
测试夹具(fixture)应该把环境搭建放在哪一层(每用例、每文件、全局),判断依据是什么? 本文先给出可直接复述的结论,再用最小代码说明测试 fixture 分层 setup teardown的工作方式、判断依据、项目边界和常见误区。
Playwright 的 web-first 断言(如 toBeVisible)为什么会自动重试,这与普通 expect 断言的竞态差异是什么? 本文先给出可直接复述的结论,再用最小代码说明Playwright web-first 断言 自动重试的工作方式、判断依据、项目边界和常见误区。
对 CI 上的不稳定(flaky)测试,重试机制、隔离与修复三种处理策略该如何排优先级? 本文先给出可直接复述的结论,再用最小代码说明flaky test 重试 隔离 修复的工作方式、判断依据、项目边界和常见误区。
需要模拟依赖第一次失败、第二次成功来测试重试逻辑时,mock 应如何表达调用序列并断言调用次数? 本文先给出可直接复述的结论,再用最小代码说明mock 模拟调用序列 测试重试逻辑的工作方式、判断依据、项目边界和常见误区。
mock、stub、spy 三者在验证行为上的分工差异是什么,什么场景必须验证交互而非状态? 本文先给出可直接复述的结论,再用最小代码说明mock stub spy 区别的工作方式、判断依据、项目边界和常见误区。
过度 mock 为什么会让测试在重构后大面积误报,判断该不该 mock 一条依赖的标准是什么? 本文先给出可直接复述的结论,再用最小代码说明过度 mock 脆弱测试 重构的工作方式、判断依据、项目边界和常见误区。
Vitest 并行执行测试文件时靠什么隔离模块状态,什么全局副作用仍会泄漏? 本文先给出可直接复述的结论,再用最小代码说明Vitest 并行 隔离 worker 模块的工作方式、判断依据、项目边界和常见误区。
如何用 vi.importActual 只替换模块的一个导出而保留其余真实实现,这种做法的风险是什么? 本文先给出可直接复述的结论,再用最小代码说明Vitest vi.importActual 部分 mock的工作方式、判断依据、项目边界和常见误区。
属性测试与示例测试的根本差异是什么,为什么「反序两次等于原数组」比固定用例更有覆盖力? 本文先给出可直接复述的结论,再用最小代码说明属性测试 property based testing 区别的工作方式、判断依据、项目边界和常见误区。
为排序函数写属性测试时,除了「结果有序」还应断言哪些不变量(长度守恒、多重集守恒)? 本文先给出可直接复述的结论,再用最小代码说明排序函数 属性测试 不变量的工作方式、判断依据、项目边界和常见误区。
单元测试为什么不应该发真实网络请求,违反后除了慢还有什么正确性风险? 本文先给出可直接复述的结论,再用最小代码说明单元测试 网络请求 隔离的工作方式、判断依据、项目边界和常见误区。
属性测试发现失败用例后的 shrink(收缩)过程在做什么,为什么它对定位根因至关重要? 本文先给出可直接复述的结论,再用最小代码说明属性测试 shrinking 最小反例的工作方式、判断依据、项目边界和常见误区。
什么时候该用软断言(soft assertions)让一个用例报告多个失败,代价是什么? 本文先给出可直接复述的结论,再用最小代码说明软断言 soft assertions 使用场景的工作方式、判断依据、项目边界和常见误区。
vi.spyOn 监视对象方法后为什么必须在测试间恢复,不恢复会引发什么跨用例污染? 本文先给出可直接复述的结论,再用最小代码说明Vitest spyOn restoreMocks的工作方式、判断依据、项目边界和常见误区。
为什么单元测试之间必须相互独立,共享可变状态会导致哪些难以诊断的失败模式? 本文先给出可直接复述的结论,再用最小代码说明单元测试 隔离性 共享状态的工作方式、判断依据、项目边界和常见误区。
发现一个测试单独运行通过、整套运行时失败,应按什么思路诊断顺序依赖? 本文先给出可直接复述的结论,再用最小代码说明测试顺序依赖 单独运行通过 排查的工作方式、判断依据、项目边界和常见误区。
除了时间与时区,还有哪些环境因素(语言环境、区域格式、文件系统大小写)会让同一测试在不同机器结果不同? 本文先给出可直接复述的结论,再用最小代码说明测试可重复性 时区 locale 环境差异的工作方式、判断依据、项目边界和常见误区。
「测行为不测实现」原则下,哪些断言(调用内部私有方法、检查内部状态)属于脆弱的实现耦合? 本文先给出可直接复述的结论,再用最小代码说明测试行为 不测实现 重构的工作方式、判断依据、项目边界和常见误区。
Testing Library 的 waitFor 与 findBy 查询都带等待,两者适用场景与超时失败信息有何不同? 本文先给出可直接复述的结论,再用最小代码说明Testing Library waitFor 与 findBy 区别的工作方式、判断依据、项目边界和常见误区。
Vitest 的 toBe、toEqual、toStrictEqual 在比较对象和类实例时行为差异是什么? 本文先给出可直接复述的结论,再用最小代码说明Vitest toBe toEqual toStrictEqual 区别的工作方式、判断依据、项目边界和常见误区。
Vitest 中 vi.fn() 配合 mockReturnValue 与 mockImplementation 该如何选择,链式 mockResolvedValueOnce 解决什么问题? 本文先给出可直接复述的结论,再用最小代码说明Vitest vi.fn mockReturnValue mockImplementation的工作方式、判断依据、项目边界和常见误区。
Vitest 的 vi.mock() 为什么会被提升到文件顶部,这一提升对工厂函数里引用外部变量有什么限制? 本文先给出可直接复述的结论,再用最小代码说明Vitest vi.mock 提升 hoisting的工作方式、判断依据、项目边界和常见误区。