跟踪 @fast-check/jest 2.x 的演进:从默认 ESM 构建到全面支持 fast-check 插件体系

发布时间:2026/10/13 2:54:51

跟踪 @fast-check/jest 2.x 的演进:从默认 ESM 构建到全面支持 fast-check 插件体系 开发工具测试【免费下载链接】fast-checkProperty based testing framework for JavaScript (like QuickCheck) written in TypeScript项目地址https://gitcode.com/gh_mirrors/fa/fast-check点击查看免费下载fast-check/jest是 fast-check 官方为 Jest 提供的属性化测试Property Based Testing集成包。本文以 packages/jest/CHANGELOG.md 为主线完整梳理 2.0.0 到 2.3.0 八个版本的变更脉络——包括 2.0.0 默认转为 ESM 的破坏性变更、对 fast-check v4 与插件 API 的跟进支持并结合仓库源码说明 seed 传递、超时接管与插件适配等关键机制在 构建器源码 中的落地方式。fast-check/jest 的定位与 2.x 依赖基线从 包清单 可以确认 2.3.0 的依赖基线运行时唯一依赖是fast-check ^4.10.0即 2.x 系列已经建立在 fast-check v4 之上peerDependencies中fast-check/worker的约束为0.0.7 0.7.0且标记为可选peerDependenciesMeta中optional: truejest/globals要求25.5.2jest/expect要求28.0.0且同样可选——后两者的可选性对应 worker 入口需要expect而主入口不需要的差异包声明type: moduleexports字段对.与./worker两个子路径分别提供requirelib/cjs/与importlib/双通道及对应.d.ts类型这正是 2.0.0 起ES Module version by default这一版本主题的产物。主入口非常精简在 jest-fast-check.ts 中可以看到全部导出import * as fc from fast-check; import { it as itJest, test as testJest, jest } from jest/globals; import { buildTest } from ./internals/TestBuilder.js; export const test: FastCheckItBuilderIt buildTest(testJest, jest, fc); export const it: FastCheckItBuilderIt buildTest(itJest, jest, fc); export { fc };test与it是对 Jest 同名全局函数的加法式增强在两者上挂载.propfc则原样转发 fast-check 命名空间。2.0.0 2.3.0 版本总览CHANGELOG 中每个版本都附有主题句、Code/Diff 链接指向上游仓库 tag本文不再重复外部链接以及 Features/Fixes 明细。汇总如下版本主题主要变更2.0.0ES Module version by default移除已废弃的{it,test}Prop构建链迁移到 ESMPR#5166、PR#5165、PR#51672.0.1Document minimum requirements of 2.x文档补充 2.x 最低环境要求PR#51712.0.2Export missing types修复导出上缺失的类型声明PR#52012.0.3Rework our testing stack测试栈迁移到 Vitest、更精细的测试作用域、测试并行执行PR#5364、PR#5375、PR#53782.1.0Support fast-check v4支持 fast-check v4修复/worker导出声明错误类型声明不再引入中间变量PR#5791、PR#5680、PR#57652.1.1Support for most recent version offast-check/worker支持fast-check/worker0.5.xPR#58662.2.0Add support forfast-check/workerversion 0.6.0支持 worker 0.6.0更快的打包 CIReadme 指向 npmxPR#6628、PR#6616、PR#66542.3.0Support for plugins支持 fast-check 插件 APIPR#7218测试侧剥离 AI 环境变量、从 cjs test-bundle 移除babel-jestPR#6864、PR#6958下面按主题分组展开。2.0.0默认 ESM 与旧 API 移除破坏性变更2.0.0 是 2.x 中唯一带 Breaking changes 的版本包含三条变更PR#5166 移除了已废弃的{it,test}PropPR#5165 将 CI 构建链迁移到 ESMPR#5167 完成 Jest 自身的 ESM 迁移。理解第一条需要先回顾 1.x 的历史见 packages/jest/CHANGELOG_1.X.md1.4.0 引入it.prop/test.prop新 APIPR#3339、PR#3366 同时支持 record 形式1.7.3 将旧的全局itProp/testProp标记为 deprecatedPR#42012.0.0 则正式将其从发布物中删除。也就是说2.x 用户只有一条 API 路径可用且必须从包内导入而不是依赖全局import { test, fc } from fast-check/jest; // 元组形式对所有字符串 a、b、cb 必为 abc 的子串 test.prop([fc.string(), fc.string(), fc.string()])(should detect the substring, (a, b, c) { return (a b c).includes(b); }); // record 形式同名参数、可读性更好 test.prop({ a: fc.string(), b: fc.string(), c: fc.string() })(should detect the substring, ({ a, b, c }) { return (a b c).includes(b); });上面两个示例与 test-types/main.ts 中的类型检查用例一致——该文件专门用于在发布前验证用户视角的类型声明可用与 2.0.2 Export missing types、2.1.0 No intermediate var to declare our types 两条修正是相呼应的。buildTest的实现解释了增强是如何做到的见 TestBuilder.ts以原testFn为基础构造enrichedTestFn行为与原函数完全一致遍历testFn上的函数属性only、skip、failing、concurrent等对除each外的每个变体递归调用buildTest从而让test.skip.prop、test.concurrent.failing.prop这类任意嵌套组合都自动获得.prop递归类型FastCheckItBuilderTTestBuilder.ts用[K in keyof OmitT, each]映射类型把这一结构同步到类型层这就是 2.1.0 中不再引入中间变量声明类型的落点。2.0.1 2.0.3类型补全与测试栈重建2.0.1PR#5171补充了 2.x 的最低环境要求文档。该内容沉淀在 README.md 的 Minimal requirements 一节值得完整保留fast-check/jestjestfast-checknode^2.0.026.5.0CommonJS^3.0.014.15.0node 16/18.17 等区间详见原文脚注^1.0.026.5.0^3.0.0同上注意事项使用 CommonJS 时 jest 需 ≥26.5.0使用 ESM 构建可能需要 Node 的实验性特性node 1818.17.0 之前与 node 19 上 Jest 的 timeout 可能无法正确作用到 fast-check。2.0.2PR#5201修复导出上缺失的类型属于纯类型层修正配合test-types/目录的编译期检查防止回归。2.0.3PR#5364、PR#5375、PR#5378把自身的测试栈迁移到 Vitest。这一点在当前仓库结构中可以直接印证test/ 下的base.spec.ts、seeds.spec.ts等文件全部import { describe, it } from vitest并通过 RunJest.js 一类辅助工具把生成好的用例写盘、再拉起真实的 Jest 进程执行——即用 Vitest 驱动对 Jest 集成包的端到端验证同时按it/、test/、test-jasmine/、test-jasmine-worker/、test-worker/划分作用域覆盖不同 runner 与 worker 模式。2.1.0 2.2.0跟进 fast-check v4 与 worker 的版本演进2.1.0Support fast-check v4包含三条变更PR#5791 把对 fast-check 的版本约束提升到 v4。当前 package.json 中fast-check: ^4.10.0即为该约束的最终形态PR#5680 修复/worker导出被错误声明的问题——exports中./worker子路径的require/import双通道是 worker 用法可用性的前提PR#5765 移除类型声明中的中间变量简化FastCheckItBuilder的对外类型。2.1.1PR#5866与 2.2.0PR#6616连续两次放宽fast-check/worker的兼容范围至 0.5.x 与 0.6.0。worker 0.6.0 起成为 ESM-only 包在 CommonJS 模式的 Jest 下需要babel-jest参与转译README.md 给出了完整配套步骤npm install --save-dev babel-jest babel/core babel/preset-env项目根目录增加babel.config.cjsmodule.exports { presets: [[babel/preset-env, { targets: { node: current }, modules: commonjs }]], };并在 Jest 配置中指定 transform、放开transformIgnorePatterns对fast-check/worker的忽略module.exports { transform: { ^.\\.[t|j]sx?$: babel-jest, }, transformIgnorePatterns: [/node_modules/(?!(?:fast-check/worker)/)], };ESM 模式则只需以node --experimental-vm-modules node_modules/jest/bin/jest.js启动无需额外配置。仓库自身的 test-bundle 脚本也印证了这两条路线package.json 中的test-bundle:cjs/test-bundle:mjs。worker 入口的实现见 jest-fast-check-worker.tsinit(url, options?)接收测试文件的 URL内部通过fast-check/worker的propertyFor构造基于 worker 的属性执行器使 runner 能够终止长时间占住主线程的同步代码例如死循环。它按运行环境分三条路径取test/itCommonJS 下直接使用全局test/itESM 下由于 worker 上下文限制只能动态import(jest/globals)因此文档强调 ESM 版本init必须加await两者皆不可用时回退到 dummy 测试对象。典型用法import { init, fc } from fast-check/jest/worker; const { test, expect } await init(new URL(import.meta.url)); test.prop([fc.constant(null)])(should pass, (value) { expect(value).toBe(null); });2.3.0支持 fast-check 插件 API2.3.0 的核心主题是 Support for pluginsPR#7218即让test.prop/it.prop的参数可以携带 fast-check 自 4.10.0 引入的插件体系。插件体系本身插件的类型定义在 Plugin.tsPluginTs是一个工厂函数接收(pluginIndex, pluginStore)每次属性评估实例化一次返回的PluginInstance提供四个可选钩子decorateGenerate包装生成过程、decorateRun包装每次谓词执行、onAllRunsComplete评估结束拿到RunDetails、afterAll清理资源。fast-check 内置了若干现成插件fc.timeout、fc.interruptAfterTimeLimit、fc.unbiased等见 website/docs/core-blocks/plugins/index.md。在 fast-check/jest 中的两条落地链路链路一record 模式下的插件适配。test.prop的 record 形式内部会被record(arb)包装成一个单元素元组来驱动 runner但用户写的插件是按 record 值类型而非[record值]元组类型构造的。TestBuilder.ts 的adaptPluginForRecord负责这一层翻译decorateGenerate钩子把元组输出out.value[0]解包还原成 record 值再交给用户插件结果再重新包回元组decorateRun钩子nestedRun([value], ctx)与decorated(value[0], ctx)双向转换onAllRunsComplete经由adaptRunDetailsForRecordTestBuilder.ts把counterexample、failures、executionSummary从[record值]还原为 record 值保证插件与reporter看到的是用户视角的数据。buildTestProp在 TestBuilder.ts 中将params.plugins逐个映射为适配后的插件用户无感知这一机制的存在。链路二自动注入超时插件。这是 1.6.0 引入、2.x 继续沿用的机制见 CHANGELOG_1.X.md 中 Let fast-check guide timeouts。TestWithPropRunnerBuilder.ts 在构造customParams时如果能从 Jest 取到超时值就会执行const plugin fc.interruptAfterTimeLimit(jestTimeout) as NonNullabletypeof customParams.plugins[number]; customParams.plugins customParams.plugins undefined ? [plugin] : [plugin, ...customParams.plugins];即把fc.interruptAfterTimeLimit(jestTimeout)插到插件列表最前让 fast-check 在内部主动中断超时的属性执行而不是被动等待 Jest 的超时机制——这与 InterruptAfterTimeLimitPlugin.ts 中到点后解析PreconditionFailure并竞速Promise.race的实现相对应。取不到 Jest 超时值时会打印警告并回退到 Jest 自身的全局超时处理TestWithPropRunnerBuilder.ts。seed 与 timeout 的优先级同一文件还实现了两个常被搜索的运行时细节seed 优先级TestWithPropRunnerBuilder.tsparams.seedtest.prop(arb, { seed })显式指定fc.configureGlobal({ seed })全局设置经readConfigureGlobal()读取jest.getSeed()Jest ≥29.2.0 的--seed能力README 也因此推荐jest --show-seed;兜底为Date.now() ^ (Math.random() * 0x100000000)。最终 seed 会被写进测试名${label} (with seed${customParams.seed})便于失败后定位回放。timeout 优先级extractJestGlobalTimeout显式第三参数timeoutjest.setTimeout经TEST_TIMEOUT_SYMBOL读取 jest-circus runner 的JEST_STATE_SYMBOL状态 / jest-jasmine2 的jasmine.DEFAULT_TIMEOUT_INTERVAL。这些优先级在 TimeoutsSpecs.ts 中有逐条对拍的端到端用例例如local timeout 1000 优先于 setTimeout 3000与setTimeout 1000 优先于 CLI 3000worker 模式下还验证了plugins: [fc.timeout(500)]可以终止阻塞主线程的死循环属性TimeoutsSpecs.ts。插件在用户代码中的使用参数位就是普通fc.Parameters例如固定 seedimport { it, test, fc } from fast-check/jest; test.prop([fc.nat(), fc.nat()], { seed: 4242 })(should replay the test for the seed 4242, (a, b) { return a b b a; }); test.skip.prop([fc.string()])(should be skipped, (text) { return text.length [...text].length; });worker 模式下则通过plugins携带时间限制插件runner.prop([fc.nat()], { plugins: [fc.timeout(500)])。变更脉络的几点观察破坏性变更被压缩在 2.0.0 一次完成移除旧 API 构建链 ESM 化集中处理此后 2.0.12.3.0 均为向后兼容的类型、依赖与功能跟进2.x 的迭代节奏与 fast-check 主线版本强耦合2.1.0 对齐 fast-check v42.3.0 对齐 4.10.0 的插件 APIpackage.json中fast-check ^4.10.0的下限恰好在 2.3.0 主题所需的位置测试基建与产品代码同步演进2.0.3 引入 Vitest 驱动、2.3.0 的 PR#6958 又从 cjs test-bundle 中移除babel-jesttest-bundle/ 下按cjs/、mjs/分目录维护双通道打包验证。关键文件索引版本历史packages/jest/CHANGELOG.md、packages/jest/CHANGELOG_1.X.md包元数据packages/jest/package.json主入口与 worker 入口packages/jest/src/jest-fast-check.ts、packages/jest/src/jest-fast-check-worker.ts构建器packages/jest/src/internals/TestBuilder.ts、packages/jest/src/internals/TestWithPropRunnerBuilder.ts插件类型packages/fast-check/src/check/plugin/Plugin.ts、packages/fast-check/src/check/plugin/InterruptAfterTimeLimitPlugin.ts测试与类型检查packages/jest/test/test-helpers/TimeoutsSpecs.ts、packages/jest/test-types/main.ts赞分享开发工具测试【免费下载链接】fast-checkProperty based testing framework for JavaScript (like QuickCheck) written in TypeScript项目地址https://gitcode.com/gh_mirrors/fa/fast-check点击查看免费下载相关推荐fast-check 的 AVA 集成包 fast-check/ava 1.x 演进全记录从首个稳定版到 fc.pre 前置条件支持fast check 的 AVA 集成包 fast check/ava 1.x 演进全记录从首个稳定版到 fc.pre 前置条件支持 fast check开发工具测试复盘 fast-check 2.x从 dual 打包、Size 模型到 uniqueArray 与 NextArbitrary 的演进之路复盘 fast check 2.x从 dual 打包、Size 模型到 uniqueArray 与 NextArbitrary 的演进之路 packages/开发工具测试fast-check v4 版本演进全解从 4.0.0 API 瘦身到 4.10.2 插件体系的发布主线梳理fast check v4 版本演进全解从 4.0.0 API 瘦身到 4.10.2 插件体系的发布主线梳理 本文基于 fast check 核心包的 CHA开发工具测试上一篇Hugo 模板函数 math.Pow 完全指南幂运算的语法、类型转换与实战用法下一篇k3d 项目架构全解析从 CLI 命令树到集群容器布局的代码导航指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/13 6:50:03

Cortex-M4 三级流水线 BL 带返回跳转指令(PC、LB)

一、行业经典疑点:两段官方描述看似冲突在 Cortex‑M4 汇编体系中,关于 BL 指令存在两段标准描述,是嵌入式学习、面试、考试的核心易错点:硬件流水线描述:BL 执行顺序为先将 PC−4 赋值给 LR,再将目标函数入…

2026/10/13 6:50:03

CentOS 7 NTP精准同步实战:从配置到生产级时间治理

1. 为什么在CentOS 7里搭NTP不是“装个包就完事”——从一次生产环境时间漂移说起去年冬天,某公司一套基于Kubernetes的订单处理系统突然出现大量“时间戳异常”告警。日志里同一笔交易的前端请求时间比后端数据库写入时间早了3.2秒,而MQ消息的消费延迟计…

2026/10/13 6:50:03

AI日报自动化生成实战:从信息采集到深度解读的完整流程

1. 一份AI日报的诞生逻辑:从信息洪流到结构化认知每天早上七点,我的信息采集脚本会准时跑完最后一轮抓取。屏幕上滚动的原始条目大概有三百到五百条,来源横跨论文预印本平台、头部实验室的官方博客、开源社区的提交记录、行业媒体的快讯&…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/13 0:04:41

基于Triton部署YOLO目标检测:从训练脚本到线上服务

简介:这份资源面向希望将目标检测模型落地到生产环境的深度学习开发者与算法工程师,聚焦于用 Triton Inference Server 部署 YOLOv9 的完整实战方案,解决从训练权重到线上推理服务之间的工程化难题。压缩包共 16 个文件,约 886KB&…

2026/10/13 0:04:41

手把手教你云端部署Qwen-Image-2.1:从GPU选型到在线文生图服务

Qwen-Image-2.1 这个开源的图像生成模型,最近在内容创作和 AI 应用圈子里热度相当高。它属于通义 Qwen 系列里的视觉生成分支,让我眼前一亮的是它对中文长文本的理解能力——以前用那些老方案生成带中文文字的图,十个里九个是“乱码印刷体”&…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑