@ cosyte/ vitest- config
默认设定覆盖阈值, 外加一个套件来运行您文档中的实例 .
共享 Vitest 配置(v8 覆盖度,每部目录为 QQ90 门) 和 StrykerJS 突变测试配置为 @ cosyte/ * 包.
为什么会这样
报告但封口的覆盖面是无人操作的数字,而整个重传的门槛隐藏着 一个没有的目录:一个软件包可以坐到92%的整体位置,而其序列器是40%. 每个目录的 Cosyte 基线闸门, 它的船允许而不是作为每个回波的设置 记得开机.
最近的选择是手写 vitest.config.ts 每个存储器 coverage.thresholds
复制进来。 这也是这个包裹的后半部分
来源:该选项中没有任何内容可以证明您文档中的实例仍然有效.
第三半为变异测试. 报道说有一条线路运行,没有说测试会注意到
如果线路错了. @cosyte/vitest-config/stryker 在StrykerJS下运行同样的Vitest套房,
以一个小方式修改代码, 计算没有注意到的更改.
状态
@cosyte/vitest-config 位于Cosyte 0.1.x线上:公共API被安顿下来,凸起类型跟随普通semver.
仍在移动:覆盖范围不包括清单和片段套接字(runnableTag, (中文(简体) ), resolve, (中文(简体) ),
requireSnippet),随着第一批消费者采用它们而改变形状. 90个门槛和
页:1 cosyteVitest(options) 签名是已结算的部分,对其中任一部分的更改记录在
撞出型号,而不是被吸收到补丁中.
突变测试入口, /stryker, (中文(简体) ), /mutate 编辑 cosyte-mutate bin,为新和
最不落户的部分。 特别是,被更改的文件运行每个被更改的文件整体;
是否只打开在大文件中更快的已更改行.
安装
pnpm add -D @cosyte/vitest-config vitest @vitest/coverage-v8 vite
vitest (4或5个), @vitest/coverage-v8 (同样的主要)和 vite 是同伴的依赖关系.
安装 vite 明确:vitest 4和5要求主要版本6或以后,不直接
宣布决心者将乐于保留一个不相容的Vite 5. 节点 >=22.14仅限无害环境管理.
为了进行突变测试,还安装了可选的同位素:StrykerJS 10及其Vitest跑道,以及
@cosyte/script-utils,哪个 cosyte-mutate changed 读取更改。 仅使用软件包
vitest 配置不安装其中之一; cosyte-mutate changed 无 @cosyte/script-utils
2号出口并命名它.
pnpm add -D @stryker-mutator/core @stryker-mutator/vitest-runner @cosyte/script-utils
使用量
vitest.config.ts 输出工厂的回报:
import { cosyteVitest } from "@cosyte/vitest-config";
const { thresholds } = cosyteVitest({ coverageDirs: ["parser", "model"] }).test.coverage;
thresholds.lines; // => 90
thresholds["src/parser/**"].lines; // => 90
每个条目 coverageDirs 增加每本目录 src/<dir>/** 门在地上90分
门,它阻止了一个覆盖良好的帮助目录支付一个未经测试的解析器.
入境点
| 进入点 | 这是什么 |
|---|---|
@cosyte/vitest-config | 页:1 cosyteVitest(opts?) ,返回 Vitest 配置对象 |
@cosyte/vitest-config/snippets | 以下 API 所描述的 doc/code- agreement guage |
@cosyte/vitest-config/stryker | cosyteStryker(options?),共享的 StrykerJS 配置 |
@cosyte/vitest-config/mutate | runMutate,身体为 cosyte-mutate 及其部件 |
cosyte-mutate (宾 | full,以及 changed --base <ref> |
它们是独立的子路径,因为它们是可单独收养的, 导入配置永远不会
装上绳子. extractRunnableSnippets 是决定运行的原始人 它报告
每个区块的一号码线,所以一个故障点在片段而不是栅栏:
import { extractRunnableSnippets } from "@cosyte/vitest-config/snippets";
const fence = "`".repeat(3);
const doc = ["# Title", "", fence + "ts runnable", "const dose = 5;", fence].join("\n");
extractRunnableSnippets(doc).length; // => 1
extractRunnableSnippets(doc)[0].line; // => 4
覆盖
两个切入点都是通过参数配置的,两个切入点都没有执行 消费者无法达到:
cosyteVitest带coverageThresholds添加或推翻特定覆盖键,以及test对于任何其他Vitest选项。 两者最后合并,所以真正的无法持有的回购QQ 90 in 一个目录会降低一个密钥,而不是放弃配置.docSnippetSuite带docsDir或者说files, (中文(简体) ),include(默认).md财务报告和审定财务报表.mdx, (中文(简体) ),resolve, (中文(简体) ),runnableTag(默认)"runnable", (中文(简体) ),name, (中文(简体) ),requireSnippet, (中文(简体) ),tmpDir, (中文(简体) ),every, (中文(简体) ),includeGenerated财务报告和审定财务报表tsconfig。 。 。 .
cosyteStryker 带 mutate, (中文(简体) ), vitestConfig 财务报告和审定财务报表 stryker (任何其他 Stryker 选项,合并)
; 其缺省及其原因列于下文的变异部分.
没有可运行片段的软件包产生一个空的、经过的套件,除非 requireSnippet 设置为:
离开会悄悄地退化 错了 片段响亮失败 。 降低覆盖阈值是
因为与其他人不同 它会改变CI允许什么
通过.
突变测试: /stryker 财务报告和审定财务报表 cosyte-mutate
A 类 stryker.config.mjs 在套件根导出工厂返回的内容 :
import { cosyteStryker } from "@cosyte/vitest-config/stryker";
const config = cosyteStryker();
config.testRunner; // => "vitest"
config.ignoreStatic; // => false
config.jsonReporter; // => { fileName: "reports/mutation/mutation.json" }
然后,从同一个目录:
pnpm exec cosyte-mutate full # every file the config names
pnpm exec cosyte-mutate changed --base origin/main # only what this change touched
pnpm exec cosyte-ratchet check --skip coverage --base origin/main
full 写入 reports/mutation/mutation.json,报告 地板文件的变异分数读取
从. changed 写入 reports/mutation/changed.json 在它旁边,所以跑过几个文件是永远不会
读取为整个包的分数。 没有更改源文件的更改开始不运行:它会写一个
空出报告,使鼠标能从"从未跑过"中分出"ran, nothing to mutate",并出0.
cosyte-mutate 当运行完成时退出 0 , 当运行不能运行时退出 2 ; 它不判断
分数.
这个 /mutate 切入点是垃圾桶的躯体 和它建造的碎片 对于一个运行的呼叫者来说
从它自己的剧本. selectChangedFiles 规则是更改的运行从 :
import { selectChangedFiles } from "@cosyte/vitest-config/mutate";
const picked = selectChangedFiles({
changed: ["src/a.ts", "src/a.test.ts", "README.md"],
root: "/repo",
cwd: "/repo",
patterns: ["src/**/*.ts", "!src/**/*.test.ts"],
});
picked; // => ["src/a.ts"]
什么史崔克的配置,为什么
cosyteStryker({ mutate, vitestConfig, stryker }) 获取文件列表、 Vitest 配置文件,以及
任何其它 Stryker 选项, 最后合并, 因此一个软件包可以更改下面的任何内容 。 每一个默认是
以及为什么:
| 设置 | 默认 | 为什么 |
|---|---|---|
testRunner | vitest,从此软件包中解析 | Stryker 找不到 pnpm 下的名称插件 |
vitest.pool | forks | Vitest 本身的默认; Stryker 是线程, 其中 process.chdir() 掷出 |
coverageAnalysis | perTest | 每一个变种人只进行能达到的测试 |
mutate | src/**/*.ts 未进行测试,桶,类型 | 相同的文件 @cosyte/vitest-config 覆盖范围 |
ignoreStatic | false | 静态变种是模块级表格,例如扫描仪的图案:保存 |
thresholds.break | null | 楼层文件决定掉落,而不是 Stryker |
| 报告 | JSON 和 HTML 标题下 reports/mutation/ | JSON为鼠标和CI, HTML为读取存活的变种人 |
设置 ignoreStatic: true 运行得更快, 值得回顾的是:
将每个模块级代码中的变异者从分数中丢出,而没有任何内含原因.
一个例外,为什么它需要两个评论
无法被杀死的变种人(等同的变种人,或只有儿童过程到达的行) 说明理由的内在例外:
// Stryker disable next-line ConditionalExpression: both branches return the same value here
突变测试不会读取覆盖的被忽略的提示,所以从覆盖中排除的一行是:
/* v8 ignore next -- reason */ 仍然有它的变种人, 他们显示没有覆盖。 这么一行
需要两个评论,每个都有其理由. cosyte-ratchet check --base 列出在
更改了代码,所以拉动请求可以携带列表.
90个大门和地板文件
90个阈值是每个包件的一个固定的最低限值,它们都失败了测试本身. 这个
地板文件, quality-floor.json, 由 cosyte-ratchet 内 @cosyte/script-utils每一个
寄存器本身的记录 它的测量, 它只上升。 两人从事不同的工作:
- 一个超过90公尺的包裹被放在地上,放在它测量的地上;90公尺的门 是不会起火的后援.
- 一个比90以下的包在一个比分下方的键上
coverageThresholds和它的地板仍然 持有测量值,所以数字只能从那里上升. - 牵引请求本身更改的行由鼠标所控为100道,无论哪个数字都表示.
这个 json-summary 财务报告和审定财务报表 lcov 报告这个配置的写法 是鼠标读取的两个.
PHI 与安全
此包是测试配置 。 它不处理病人数据:它配置一个测试跑者,并且,
结束 /snippets,编译并执行您指向的代码块。 穿过 /stryker 这个
在沙盒目录中运行您自己的测试, 测试您自己来源的被修改的副本
(单位:千美元).stryker-tmp/在您的项目中; 添加它和 reports/mutation/ 改为 .gitignore。 。 。 .
有两个后果值得直言 因为 /snippets 运行代码。 它执行片段
在自己的文档中,在自己的过程中,所以文档示例决不能包含真实的
病人数据:然后执行,而且已经执行。 还有瞬间舱
runSnippet 写在您的工程根下, 因此磁盘上的片段输入区域完全为
测试的固定会。 在文档中使用合成数据,如在测试中使用.
API 密码
cosyteVitest(options)
基线配置: v8 覆盖 text 编号 : html 编号 : lcov 编号 : json-summary 记者,标准不包括
(管、固定装置、生成的代码、声明) 启用, 显示 每个指令阈值
时间 第90条。 。 。 .
文档/代码协议 : @cosyte/vitest-config/snippets
这个 /snippets 子路径是 符合标准者模拟文件: 它证明了
软件包中的实例 docs-content/ 仍照传道所言作. 复制可复制的片段
默回错误的字段(一剂,一码,一标识符)是一种临床-伤害故障模式
所以绿色的道克建筑 带错了片段 就是这个
预防.
标记有栅栏的块 选入 与 ```ts runnable 并用 // =>数字 :
```ts runnable
import { parseHl7 } from "@cosyte/hl7";
const { warnings } = parseHl7(raw);
warnings.length; // => 0
```
docSnippetSuite() 移动一个文件目录, 将每个可运行块变为 Vitest test 标签
文件与行, 编译它, 并执行它: 窗体行 <expr>; // => <value> 变成
expect(<expr>).toStrictEqual(<value>)标记块 ```ts runnable throws 必须投出.
// test/docs-content.test.ts
import { join } from "node:path";
import { docSnippetSuite } from "@cosyte/vitest-config/snippets";
docSnippetSuite({
docsDir: join(import.meta.dirname, "..", "docs-content"),
// Point a snippet's `import ... from "@cosyte/hl7"` at what you want to prove against. This repo's
// source for a fast local gate, or `../dist/index.js` (after `pnpm build`) for artifact fidelity.
resolve: (spec) =>
spec === "@cosyte/hl7" ? join(import.meta.dirname, "..", "src", "index.ts") : undefined,
});
选项 : docsDir 编号 : files, (中文(简体) ), include (默认) .md 编号 : .mdx, (中文(简体) ), resolve (进口说明)
再来一次, runnableTag (默认) "runnable", (中文(简体) ), name, (中文(简体) ), requireSnippet, (中文(简体) ), tmpDir, (中文(简体) ), every, (中文(简体) ),
includeGenerated, (中文(简体) ), tsconfig。没有的软件包
可流出片段产生一个空的、经过的套房: 缺席会悄悄地退化; a 错了 片断失败
大声点 原始人(extractRunnableSnippets, (中文(简体) ), rewriteAssertions, (中文(简体) ), remapImports, (中文(简体) ), runSnippet(中文(简体) )
也出口出来,用于接线.
每一个样本,不只是标记的
docSnippetSuite({ every: true }) 运行 ts, (中文(简体) ), typescript, (中文(简体) ), tsx, (中文(简体) ), js, (中文(简体) ), javascript 财务报告和审定财务报表 mjs
块,标记与否,这是文件内容标准对库的要求(决定记录0006)
在cosyte/配置中。 在此模式下, JavaScript 样本将作为运行 .mjs 模块,所以 TypeScript 语法
它失败了,一个 tsx 样本运行为 .tsx; 无 every,每个 runnable 块运行为 .ts,作为
从前 一个无法运行的区块说出其栅栏上的原因 测试报告将它列为跳过
这个原因:
```ts no-run opens a listener that stays open for the life of the process
const server = createServer().listen(2575);
```
A 类 no-run 没有任何理由 失败的套房。 贝壳、 JSON 和文本块不是样本 从来不是
运行. extractSamples(markdown) 财务报告和审定财务报表 planSamples(files, options) 这是背后的原始人.
走路时 docsDir中,此模式将删除 api/ 它下面的文件夹: 引用生成器写
这些页面来自TSDoc, 以及他们的例子 是签名文件的一部分,而不是样本.
includeGenerated: true 走路也一样。 给定的套房 files,或无 every,读读它是什么
和以前一样.
每个类型脚本样本( E)ts, (中文(简体) ), typescript, (中文(简体) ), tsx)也根据包的类型进行打字检查
在它运行之前,一个有类型错误的样本即使运行也会失败:一个复制它的读者
输入 TypeScript 工程将无法编译 。 样本是作为读者项目汇编的
将汇编它们,作为自己的模块,按其公布的名称输入软件包
项目的 tsconfig.json (那个) tsconfig 名称,或工作目录中的名称)
并关闭未用名称检查。 图书馆用它自己的名字来决定它已经建立的宣言
通过其 exports,所以在套房运行前建造, 因为套房已经运行样本
反对 dist/。这需要 typescript 软件包,可选的对等依赖。 其类型
无法检查,例如显示当一个打电话者忽略他们时会发生什么
栅栏;它仍然运行,它的测试名称带有:
```ts throws no-typecheck passes a number where the types ask for a string, to show it throws
parseMessage(42);
```
A 类 no-typecheck 没有任何理由失败 套房,作为一个裸体 no-run 已经. typecheckSamples(samples, options) 这是背后的原始人。 无 every,没有键盘检查.
runSnippet写一个瞬间.ts模块(或extension样本名称)tmpDir(默认).cosyte-doc-snippets/在工程根中)并导入它,从而 Vitest 将 TypeScript 转换: 添加.cosyte-doc-snippets*/改为.gitignore。它必须留在工程根;文件在下面node_modules没有改变.
捐款
问题、错误报告和提议 问题跟踪器欢迎调用请求 cosyte/ 配置,这个包裹住的地方.
改变必须清除所需的 verify 任务,以及阈值或排除需求的变化
说动了动的东西的变换器: 它能把经过的消费者弄红.
许可证
麻省理工学院,版权:Cosyte LLC. 见 自由主义。 。 。 .