fast-check 4.7.0 深度解析:stringMatching 支持 Unicode 属性转义与可逆的 json 生成器
开发工具测试【免费下载链接】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),仅供参考

相关新闻

Spring Boot微信小程序社区互动系统开发实践

Spring Boot微信小程序社区互动系统开发实践

1. 项目背景与核心价值去年接手了一个社区运营类的微信小程序项目,甲方要求实现一套完整的互动打卡交流系统。这类需求在社区运营、线上教育、健身打卡等场景越来越普遍,但市面上现成的解决方案往往功能单一,难以满足深度互动需求。我们团队基…

2026/10/14 15:16:08 阅读更多 →
联合主键深度解析:从设计原理到分库分表实战

联合主键深度解析:从设计原理到分库分表实战

1. 为什么联合主键值得单独拎出来聊但凡做过一段时间数据库开发,PRIMARY KEY这四个字就绕不开。绝大多数人第一次建表的时候,写的都是单列主键,最常见的就是id INT AUTO_INCREMENT PRIMARY KEY或者id BIGINT PRIMARY KEY,配个自增…

2026/10/14 15:16:08 阅读更多 →
Linux服务器预约系统:Bash+SQLite轻量级解决方案

Linux服务器预约系统:Bash+SQLite轻量级解决方案

1. 项目背景与核心价值这个Linux服务器预约系统小项目特别适合刚接触Linux系统管理的初学者。我在实际运维工作中发现,很多团队都会遇到服务器资源分配混乱的问题——开发人员不知道哪些机器可用,管理员不清楚谁在使用哪台机器,经常出现资源闲…

2026/10/14 15:16:08 阅读更多 →

最新新闻

社交类iOS开发:即时通讯链路与性能优化实战地图

社交类iOS开发:即时通讯链路与性能优化实战地图

提到iOS开发,很多人第一反应是"不就是用Swift画页面嘛"。但如果你在招聘平台上看到"iOS应用开发工程师(社交类应用方向)"这个岗位,并且真刀真枪干过一两年,就会知道这几个字背后的分量。我从一线i…

2026/10/14 16:05:10 阅读更多 →
粤港澳大湾区9+2政区图数据包:结构解析与Python空间分析实战

粤港澳大湾区9+2政区图数据包:结构解析与Python空间分析实战

简介:这份粤港澳大湾区政区图资源面向从事区域规划、GIS制图与空间分析的研究人员、学生及从业者,提供九城市加香港、澳门共11个行政单元的矢量边界数据,可直接用于ArcGIS制图、专题图制作与空间统计。压缩包共7个文件,约270KB&am…

2026/10/14 16:05:10 阅读更多 →
Windows下CloudStack 4.0.2开发环境搭建避坑实战

Windows下CloudStack 4.0.2开发环境搭建避坑实战

简介:这是一份面向希望在Windows环境下搭建CloudStack开发环境的技术人员的图文操作指南。文档以CloudStack 4.0.2为例,依次讲解了关闭系统防火墙、安装Cygwin并选择git/vim软件包、安装Oracle JDK并配置JAVA_HOME与CLASSPATH、部署Python与MySQL等依赖&…

2026/10/14 16:05:10 阅读更多 →
3380P继电保护测试仪全解析:操作流程、典型试验与高频故障排查

3380P继电保护测试仪全解析:操作流程、典型试验与高频故障排查

简介:《Chroma 3380P培训手册》是一份面向IC测试工程师与ATE相关人员的专业技术培训资料,系统讲解如何使用Chroma 3380P自动测试设备完成集成电路的直流、功能与交流测试。手册从IC测试原理入手,结合测试机功能方块图、测试流程区分&#xff…

2026/10/14 16:05:10 阅读更多 →
反调试技术原理与合规调试实践指南

反调试技术原理与合规调试实践指南

我不能按照您的要求生成涉及“绕过反调试技术”的相关内容。原因如下:安全合规红线:反调试技术是软件保护、数字版权管理(DRM)、终端安全防护体系中的核心防御机制,广泛应用于金融客户端、政务系统、工业控制软件、正版…

2026/10/14 16:05:10 阅读更多 →
Modbus报文结构详解:从RTU到TCP,功能码与CRC校验一次讲清

Modbus报文结构详解:从RTU到TCP,功能码与CRC校验一次讲清

1. 为什么干了这么多年工控,还得回头抠报文先从一个很典型的场景说起。现场设备通信异常,PLC显示“通信超时”,触摸屏上数据跳成灰色。你用万用表量了线,没问题;换了个终端电阻,还是不行;把波特…

2026/10/14 16:04:10 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →