开发工具测试【免费下载链接】fast-checkProperty based testing framework for JavaScript (like QuickCheck) written in TypeScript项目地址https://gitcode.com/gh_mirrors/fa/fast-check点击查看免费下载fast-check 4.7.0 是一个围绕让生成器更贴近真实输入展开的发布stringMatching从此支持正则中的 Unicode 属性转义\p{...}/\P{...}fc.json()则通过引入基于JSON.parse的 unmapper 变为可逆reversiblearbitrary。本文基于 4.7.0 官方发布说明website/blog/2026-04-18-whats-new-in-fast-check-4-7-0/index.md结合仓库源码逐项讲解这两项特性的用法、实现原理与测试验证方式帮助你为国际化输入、Emoji 处理以及生产环境 JSON 回放等场景构建更贴近真实数据的属性测试。版本概览4.7.0 基于 4.6.04.7.0 直接基于 4.6.0 构建4.6.0 的卖点是stringMatching的maxLength支持见 CHANGELOG。该版本的功能Features变更如下ReversiblejsonarbitraryPR#6866Parse\p{}and\P{}instringMatchingPR#6868Support for\p{UnicodeProperty}instringMatchingPR#6870Support negated unicode properties instringMatchingPR#6871其余为 CI、文档与测试相关的 Fixes 类提交如将 race condition 测试迁移到 Vitest、稳定 Windows 上的 flaky timeout 测试等与核心 API 无关。stringMatching 支持 Unicode 属性转义解决的问题正则表达式可以用 Unicode 属性转义来限定字符集例如\p{Emoji}匹配 Emoji、\P{ASCII}匹配所有非 ASCII 字符。在 4.7.0 之前把这样的正则交给fc.stringMatching会抛出 not implemented yet 错误从 4.7.0 起stringMatching同时识别\p{...}肯定形式与\P{...}否定形式可以直接生成匹配的值// Strings made of emoji characters // e.g. , fc.stringMatching(/^\p{Emoji}$/u); // One uppercase letter followed by one or more lowercase letters // e.g. Gụ, Fapplyg fc.stringMatching(/^\p{Uppercase_Letter}\p{Lowercase_Letter}$/u); // Strings made only of non-ASCII characters // e.g. , fc.stringMatching(/^\P{ASCII}$/u);注意\p{...}/\P{...}转义需要正则带uunicode标志才能正确按代码点语义工作官方文档示例website/docs/core-blocks/arbitraries/combiners/string.md中也是以fc.stringMatching(/^\p{Emoji}$/u)的形式给出的。支持的属性形式从源码中的属性解析表 UnicodePropertyData.ts 可以确认支持范围与官方说明一致二进制属性如Emoji、Alphabetic别名Alpha、Math、ASCII、Cased等共 50 余个见 UnicodePropertyData.ts 的BINARY_PROP_NAMES_TO_ALIASES表支持规范名与短名shorthand互换通用类别General_Category如LetterL、Uppercase_LetterLu、Lowercase_LetterLl、Decimal_NumberNd、PunctuationP等见 UnicodePropertyData.ts 的类别表Script 属性通过ScriptGreek、scHan、Script_Extensions等形式使用脚本值与四字母缩写互相可解析如Greek↔Grek、Han↔Hani见 UnicodePropertyData.ts。resolveUnicodeProperty会把\p{...}大括号内的内容解析为结构化 token先按拆分显式形式\p{NameValue}再依次尝试 General Category 值、二进制属性名并把短名归一化为规范名无法识别的属性会抛出Unknown Unicode property name/value或Invalid Unicode property错误UnicodePropertyData.ts。底层实现属性 → 码点区间 → 字符类机制发布说明提到每个属性会被展开为其覆盖的码点集合并接入既有的字符类机制且结果只计算一次并缓存。这与源码完全对应调用链是分词阶段stringMatching内部先用tokenizeRegex把正则 source 分词。遇到\p/\P开头的块时调用resolveUnicodeProperty(propertySpec, negative)产出UnicodeProperty类型的 token见 TokenizeRegex.ts该 token 既可出现在正则主体中也可出现在字符类[...]内。AST 转换阶段toMatchingArbitrary遇到UnicodeProperty节点时直接委托给unicodePropertyArbitrary见 stringMatching.ts。区间计算阶段UnicodePropertyArbitraryHelper.ts 是核心。它构造一个探测正则^\p{Spec}$否定形式则用^\P{Spec}$然后从 0x0 到 0xD7FF 与 0xE000 到 0x10FFFF 逐码点测试把连续的命中码点压缩成区间列表appendRangesForRegex注意跳过了 0xD800–0xDFFF 代理区见 UnicodePropertyArbitraryHelper.ts缓存区间结果以p:/P:Spec为 key 缓存在模块级Map中UnicodePropertyArbitraryHelper.ts。首次使用某个属性需要一次全码点遍历约 110 万次regex.test但同一进程内后续使用直接命中缓存这正是computed once and cached的出处。接入字符类机制每个区间被convertGraphemeRangeToMapToConstantEntry转换为mapToConstant的条目最终以mapToConstant(...rangeEntries)形式产出一个在属性覆盖范围内均匀采样的字符 arbitrary从而复用了 fast-check 既有的区间→constant 映射与收缩机制。从源码结构看这种探测式展开意味着生成的值与引擎的 Unicode 属性数据保持一致因为直接用RegExp测试每个码点同时也意味着属性名拼写错误会在分词阶段尽早报错而不是等到生成时才失败。测试验证集成测试 stringMatching.spec.ts 将/^\p{Emoji}$/u与/^\P{Emoji}$/u加入了硬编码正则池并通过assertProduceSameValueGivenSameSeed同 seed 产生同值和assertProduceCorrectValues用新建同 source/flags 的正则对每个生成值做test校验避免依赖 RegExp 实例内部状态见 stringMatching.spec.ts双重验证。你可以用同样的思路在本地快速验证import * as fc from fast-check; fc.assert( fc.property(fc.stringMatching(/^\p{Emoji}$/u), (s) { return /^\p{Emoji}$/u.test(s); }), );可逆的 json arbitrary背景单向映射的局限fc.json()的实现是用JSON.stringify序列化jsonValue的输出发布说明原话。在 4.7.0 之前这个映射是单向的fast-check 能产出 JSON 字符串但无法识别外部提供的 JSON 字符串。后果是凡是需要回放replay或重组recompose值的场景——比如收缩一段从生产日志里捕获的 payload——都无法借力fc.json()当框架拿到一个没有生成上下文context的值时不知道如何把它映射回jsonValue的值空间也就无从收缩。实现给 map 补上 unmapper4.7.0 的实现非常简洁——给map补上第二个参数 unmapper基于JSON.parse// packages/fast-check/src/arbitrary/json.ts function jsonStringUnmapper(value: unknown): JsonValue { if (typeof value ! string) { throw new Error(Cannot unmap the passed value); } return JSON.parse(value) as JsonValue; } export function json(constraints: JsonSharedConstraints {}): Arbitrarystring { const arb jsonValue(constraints); return arb.map(JSON.stringify, jsonStringUnmapper); }见 json.tsArbitrary.map(mapper, unmapper?)的 unmapper 正是仅在没有上下文、需要收缩用户定义值时才使用且遇到不兼容的值必须抛错的钩子Arbitrary.ts。MapArbitrary收到无上下文的 shrink 请求时会先用 unmapper 把值还原到底层 arbitrary 的值空间再走正常收缩Arbitrary.ts。使用效果canShrinkWithoutContext 变为 true发布说明给出的最小验证示例const arb fc.json(); arb.canShrinkWithoutContext({a:{b:[1,2,3]}}); // now true在此之前对外部传入的合法 JSON 字符串canShrinkWithoutContext返回false现在任意合法 JSON 字符串都会被jsonStringUnmapper接受并可收缩。这意味着fc.json()可以作为一个可逆积木参与组合也能在需要回放 JSON 输入而无需从头重新生成时作为 drop-in 方案。集成测试 json.spec.ts 中新增了针对可逆性的断言it(should produce values seen as shrinkable without any context, async () { await assertProduceValuesShrinkableWithoutContext(jsonBuilder, { extraParameters }); });该测试同时保留了同 seed 一致性校验assertProduceSameValueGivenSameSeed与正确性校验用JSON.parse不抛错 maxDepth约束检查来验证输出。测试文件中还有一处值得注意的注释assertShrinkProducesSameValueWithoutInitialContext并不适用于json——因为JSON.stringify(-0)产出0但JSON.parse(0)得到0而非-0且数字键的顺序会因Object.keys变化两条收缩路径可能分叉json.spec.ts。这说明可逆性是指值空间可往返而非逐比特等价。fc.json()仍支持原有的约束参数JsonSharedConstraints如maxDepth、depthSize、stringUnit、noUnicodeString可逆化并未改变其生成侧 API。实践建议与边界结合本次发布与源码给出几条可操作的结论正则要带u标志\p{...}/\P{...}的语义依赖 unicode 模式stringMatching本身支持d、g、m、s、u五个标志不支持i大小写不敏感与ysticky传入不支持的标志会直接抛错stringMatching.ts。首次使用某属性有一次性成本属性到区间的展开是全码点探测0x0–0xD7FF、0xE000–0x10FFFF 两段但结果按属性缓存于模块级Map同一测试进程内重复使用同一属性无额外开销不同属性名/别名如Letter与L会各自归一化后计算缓存 key 基于规范化后的Spec。属性支持范围以仓库内映射表为准UnicodePropertyData.ts中的三张表二进制属性、通用类别、Script定义了当前支持的全部属性与别名表外名称会在解析阶段抛出明确的错误信息便于快速定位拼写问题。fc.json()的回放语义任何能被JSON.parse接受的字符串都会被收缩但-0、键顺序等细节在 stringify/parse 往返中不保证保留见上文测试注释对这类边缘语义敏感的场景需自行注意。升级路径若你从 4.6.0 升级到 4.7.0API 均为增量能力stringMatching新增可解析的正则形式、fc.json()行为放宽不存在破坏性变更stringMatching的maxLength/size约束在 4.7.0 中保持不变stringMatching.ts。小结fast-check 4.7.0 的两个特性都指向同一个方向——让 arbitrary 能处理不是 fast-check 自己生成的输入stringMatching通过把 Unicode 属性转义展开为码点区间并接入既有的字符类机制使 Emoji、大小写字母、非 ASCII 等国际化正则可直接用于生成fc.json()通过JSON.stringify/JSON.parse成对的 mapper/unmapper 变得可逆使外部 JSON 字符串可以被识别和收缩。两者分别由 stringMatching.ts、UnicodePropertyArbitraryHelper.ts、json.ts 及对应 spec 文件中的测试用例共同佐证可以直接在当前仓库中复核。赞分享开发工具测试【免费下载链接】fast-checkProperty based testing framework for JavaScript (like QuickCheck) written in TypeScript项目地址https://gitcode.com/gh_mirrors/fa/fast-check点击查看免费下载相关推荐fast-check 3.10.0 新特性用 stringMatching 从正则直接生成匹配字符串fast check 3.10.0 新特性用 stringMatching 从正则直接生成匹配字符串 fast check 3.10.0 引入了一个名为 st开发工具测试fast-check 3.19.0 新特性解读为 object、anything、json 与 jsonValue 全面解锁 Unicode 字符串生成fast check 3.19.0 新特性解读为 object、anything、json 与 jsonValue 全面解锁 Unicode 字符串生成 本文开发工具测试fast-check 3.21.0 新特性uuid 任意值生成器支持自定义版本v1–v15fast check 3.21.0 新特性uuid 任意值生成器支持自定义版本v1–v15 本篇技术指南聚焦 fast check 3.21.0 版本对开发工具测试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考