# @art-suite/chained-test 中文文档

规范地址：https://npmcn.com/package/%40art-suite/chained-test/

版本：1\.8\.4
npm 元数据更新时间：2026-07-22T15:05:15.932Z
中文译文更新时间：2026-11-06T20:34:29.919Z
软件包许可：ISC

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40art-suite/chained-test
原文对照：https://npmcn.com/package/%40art-suite/chained-test/?lang=original
项目主页：https://github.com/art-suite/art-suite-foundations
源码仓库：https://github.com/art-suite/art-suite-foundations

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：49.4 kB，30 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：2 个
- peer 依赖：type-fest \>=4
- 首次发布：2020-11-09T23:54:43.557Z
- 最新版本发布：2026-07-22T15:05:15.759Z
- 近 30 天下载量：4021（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：43（近 12 个月 1 个）

## 中文简介

@art-suite/chained-test让你把大型的Jest或Mocha测试分解成一个更小的测试序列. 这特别有助于集成测试,用户-故事测试,以及一个以上同步步骤的测试.

## 安装

```sh
npm install @art-suite/chained-test
```

也可以使用：`pnpm add @art-suite/chained-test`、`yarn add @art-suite/chained-test`、`bun add @art-suite/chained-test`

## README

# 艺术套件/香槟试验

> 链式试验是一个Jest/MochaJS/Vitest扩展,用于将大型试验分解为较小试验的序列

较小的测试更便于写作,维护,使用,以确保代码正确. 链条 测试可以将大型测试分解为小测试的序列. 这对 **用户故事测试**, (中文(简体) ), **融合测试**,任何测试 **多个同步步骤**。 。 。 .

# 福利

-   **加速开发测试套装:** 将大,慢的测试分解为一系列更小的测试. 通过改进后的代码再用来降低测试套接字码总尺寸.
-   **加速测试套跑时间 :** 减少测试套房整体运行时间,其中多测试共享很多设置代码. 连锁测试就像一个普遍,多层次的"设置"系统.

# 支持的框架: Jest, Mocha & Vitest

连锁测试同样与 [贾斯特Js](https://www.npmjs.com/package/jest), (中文(简体) ), [摩诃迦叶](https://www.npmjs.com/package/mocha),或 [维特](https://vitest.dev/)。 。 。 .

事实上,链式试验应与下列任何试验框架相配合:

1.  使用其中之一声明测试 `test(name, testFunction)` 或者说 `it(name, testFunction)`,以及
2.  支持基于承诺的同步测试

# 安装

```coffeescript
npm install @art-suite/chained-test --save-dev
```

# 使用量

### 基本情况

```javascript
let { firstIt } = require("@art-suite/chained-test");

firstIt("should initialize to 123", () => 123)
  .thenIt("should still be 123", (value) => {
    expect(value).toEqual(123);
    return 456;
  })

  .thenIt("should be 456", (value) => {
    expect(value).toEqual(456);
  });
```

> 你可能会注意到,这看起来像一个连锁承诺。 这是故意的!

### 完整示例

```javascript
let { firstIt } = require("@art-suite/chained-test");
let {
  auth,
  createPost,
  createComment,
  getComments,
  logOut,
} = require("./TestApp");

const aliceEmail = "alice@test.com";
const postBody = "The quick brown fox jumped over the lazy dog.";
const commentBody = "Brilliant!";

// The return-result of this first test will be passed as the
// second argument to all subsequent tests in the chain.
firstIt("Alice's user story", () => auth(aliceEmail))
  // In "then" tests, the test's return value is passed to the next test.
  // skipped: if neither this nor any dependent tests are selected by test framework
  .thenIt("lets Alice create a post", () => createPost(postBody))

  // "tap" tests: ignores the test's return value. Instead it passes lastTestValue through.
  // skipped: if neither this nor any dependent tests are selected by test framework
  .tapIt("lets Alice create a comment", (post, alice) =>
    createComment(post.id, commentBody)
  )

  .thenIt("lets Alice get the comments for a post", (post, alice) =>
    getComments(post.id)
  )

  // In "softTap" tests, the test's return value is ignored.
  // Instead it passes lastTestValue through to the next test.
  // skipped: if not selected by test framework
  .softTapIt("should have only one comment by Alice", (comments, alice) => {
    expect(comments.length).toEqual(1);
    expect(comments[0].userId).toEqual(alice.id);
  })

  .tapIt("should be able to logOut", logOut);
```

这将在测试框架内产生7个测试. 没有过滤器,每个都会被按顺序执行一次. 如果测试框架的过滤器没有选择这些测试,那么它们都不会执行. 如果测试框架选择了部分但并非全部测试,则将只运行所需的测试.

例如:

-   如果只是这样的话 `logOut` 已选定, `"auth alice", "create a post", "create a comment", "get post's comments", and "logOut"` 被执行.
-   如果只是这样的话 `validate alice is returned` 仅选择 `"auth alice" and "validate alice is returned"` 被执行.

### 何时使用.news test/.new it,.tap test/.tap 它或.软Tap Test/.软TapIt

-   使用 `.then*` 当你需要通过一个测试的结果 从链条下到其他测试.
-   使用 `.tap*` 当您想要使用相同的,通过值进行多个测试时. `.tap*` 当下游测试注意测试的副作用,但不关心其直接结果时,测试也是有益的.
-   用户 `.softTap*` 当下游测试并不在乎这个测试的结果或副作用时.

一般情况下,使用 `.softTap` 如果你可以的话. `.softTap` 具有多种优势。 如果失败,不会使下游测试失败. 如果测试者跳过它, 它实际上是跳过, 你的测试套房运行更快.

否则,选择 `.tap*` 或者说 `.then*` 基于您如何需要返回值 传递到下一个测试.

# API 密码

### 第一个 它( )  
连锁试验( ) (别名)

开始连锁测试.

```javascript
let { firstIt } = require("@art-suite/chained-test");

firstIt(name, test);
```

-   **内:**
    -   名称: 字符串 \[可选\]
    -   测试: () 测试结果可以是任何东西
    -   选项? :
        -   测试:测试函数(如果不是全局性,则需要通过)
        -   跳过: 测试跳过函数( 不需要 skip 函数, 如果存在, 则使用此. skip, 但是可以在此自定义跳过)
-   **出来:**
    -   链式试验实例
-   **效果为:**
    -   用测试框架注册命名的测试

### .then It () /.tapIt () /.softTapIt () (中文(简体) )  
.when Test () /.taptest () /.softTaptest () (别名)

在测试链上添加额外的测试.

```javascript
let { firstIt } = require("@art-suite/chained-test");

firstIt(name, test)
  .thenIt(name, test) // test and pass return-value to the next test
  .tapIt(name, test) // test and pass previous return-value through to next test
  .softTapIt(name, test) // test, pass previous return-value through to next test,
  //   and skip if not requested by test runner.

  // aliases
  .thenTest(name, test)
  .tapTest(name, test)
  .softTapTest(name, test);
```

所有三种方法都有相同的签名,但效果略有不同:

-   **内:**
    -   名称(\*):字符串
    -   测试(\*): (最后测试结果,第一次测试结果) 测试结果可以是任何东西
        -   last TestResult: 上次非“ tap” 测试返回的值.
        -   第一次测试结果: 从第一次测试中返回的值 它召唤.
            
            > (\*) 决 定 `thenTest/tapTest/softTapTest` 方法可以接受任意数量的参数,只要它们被排列成名称测试对。 必须有至少一对。 如果有一对以上,每一对如果被独立调用,并按顺序调用同一方法类型,则被视为-.
            
-   **出来:**
    -   一个新的链式试验实例
    -   `.then*` 将测试值传递到链条中的下一个测试
    -   `.tap*` 财务报告和审定财务报表 `.softTap*` 将忽略测试的回放值, 相反,他们会通过他们最后的测试结果.
-   **效果为:**
    -   用测试框架注册命名的测试
    -   当测试进行时,通过: (最后测试结果,第一次测试结果)
-   **错误:**
    -   如果提供的测试失败:
    -   `.then*` 财务报告和审定财务报表 `.tap*` 将失败并导致所有后续测试被跳过
    -   `.softTap*` 将失败,但后续测试仍会运行
-   **如果不被测试者选中:**
    -   `.then*` 财务报告和审定财务报表 `.tap*` 如果,而且只有在下游测试(任何一种测试)的情况下,测试仍然会进行 _实值_ 由测试运行者选择.
    -   `.softTap*` 除非测试运行者明确选择,否则测试将不会运行.

# 如何处理失败和跳过测试

从逻辑上讲,如果链中的一步骤失败,所有下游测试都无法再完成(\*). 因此,应该跳过下游测试。 以下是每个测试框架中的链式测试处理方式:

-   **摩诃迦:** [Mocha 支持动态跳过测试 `this.skip()`](https://mochajs.org/#inclusive-tests)。链式测试利用了这一点,并跳过任何由于较早的失败而无法完成的测试.
    
-   **维特** [虚拟支持 `context.skip()`](https://vitest.dev/api/)。链式测试利用了这一点,并跳过任何由于较早的失败而无法完成的测试.
    
-   **贾斯特:** 在Jest中,链式测试会跳过所依赖的测试,但Jest只允许将测试标记为成功或失败. 链式测试采用最小噪音的方法. 实际失败的测试标记为 Jest 失败 。 其余的依赖性测试没有执行, _但他们在杰斯特的报导中被标为成功_。 。 。 .
    
    > 截止2020年11月,有 [打开功能请求 Jest 支持动态跳过测试](https://github.com/facebook/jest/issues/8604) 和莫查一样 `this.skip()` 能力.  
    >   
    > 请加入您的支持功能请求 如果你喜欢使用链式测试 与杰斯特,像我一样。 - SBD(英语:SBD)
    

> (\*):例外是: `.softTapIt/.softTestIt` 测试。 "软"的信号,即使测试失败,也可以继续测试.

# 获得魅力:测试树

你也许在问自己 我能做简单的测试吗? 我可以,也许, 分出一点点? 哦,是的,你可以做到这一点!

通过多条下游测试路径分享一些根包测试及其结果可能有意义。 主要限制是每个测试只能依赖于之前的一个测试. 然而,任何给定的测试都可以有任何数量的依赖性后续测试.

例如:

```javascript
let commonRoot = firstIt(mySetup).thenTest(test1Name, test1);

commonRoot.thenTest(test2Name, test2);

commonRoot.thenTest(test3Name, test3);
```

当过滤测试时,所有测试都按预期进行。 这个 `commonRoot` 仅执行一次,而且只有在需要时:

-   如果只是这样的话 `test1` 已选定, `mySetup, test1` 将被执行.
-   如果只是这样的话 `test2` 已选定, `mySetup, test1 and test2` 将被执行.
-   如果只是这样的话 `test3` 已选定, `mySetup, test1 and test3` 将被执行.
-   若为 `test2` 财务报告和审定财务报表 `test3` 选择所有测试, `mySetup, test1, test2 and test3`,将被执行.

# 发达国家

`@art-suite/chained-test` 最初开发于 [Imikimi.com (英语)](https://npmcn.com/package/%40art-suite/chained-test/imikimi.com) 作为《京都议定书》 `art-testbench` 与Mocha一起使用的软件包。 从那时起,链式测试被考虑出自己的包,并在Mocha和Jest的支持下更新. 这项工作的部分工作得到了以下各方的支持: [GenUI.com (英语)](https://npmcn.com/package/%40art-suite/chained-test/genui.com)。 。 。 .

## 常见问题

### @art-suite/chained-test 是什么？

@art-suite/chained-test让你把大型的Jest或Mocha测试分解成一个更小的测试序列\. 这特别有助于集成测试,用户-故事测试,以及一个以上同步步骤的测试\.

### 如何安装 @art-suite/chained-test？

在项目目录运行 npm install @art-suite/chained-test，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：type-fest（\>=4）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @art-suite/chained-test 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @art-suite/chained-test 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @art-suite/chained-test 可以商用吗？

@art-suite/chained-test 使用 ISC 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @art-suite/chained-test 的下载量有多少？

根据 npm 官方下载统计，@art-suite/chained-test 在 2026/10/07 – 2026/11/05 这 30 天内被下载 4,021 次，日均约 134 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @art-suite/chained-test 还在维护吗？

最新版本 1\.8\.4 发布于 2026/07/22（3 个月前）；至今共发布 43 个版本，其中过去 12 个月发布了 1 个；首次发布于 2020/11/10。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

