riteway

GitHub
1.2k 38 简单 1 次阅读 3天前MIT开发框架Agent其他
AI 解读 由 AI 自动生成,仅供参考

Riteway 是一款专为 AI 驱动开发(AIDD)设计的现代化单元测试框架,旨在让测试代码对人类和 AI 代理都更加简单、易读且有用。它通过独特的断言风格,解决了传统测试框架代码冗余、逻辑晦涩以及难以被 AI 准确理解的问题,显著降低了编写高质量测试的门槛。

这款工具特别适合追求高效开发的软件工程师、致力于提升代码质量的团队,以及正在探索 AI 辅助编程的研究者。Riteway 的核心亮点在于其强制遵循的“五问”测试哲学,要求每个测试必须清晰回答被测单元、预期行为、实际输出、期望输出及复现步骤,从而为 AI 提供结构化的需求上下文,减少幻觉并提高生成准确率。此外,其极简的 API 设计不仅节省宝贵的 Token 空间,还内置了 riteway ai 命令行工具,支持通过 OAuth 直接调用 Claude、Cursor 等主流 AI 代理进行提示词评估,让开发者能像编写普通单元测试一样轻松验证 AI 的表现。无论是配合 Vitest、Playwright 使用,还是用于 JSX 组件测试,Riteway 都能帮助构建更可靠、更易维护的现代测试套件。

使用场景

某初创团队正在利用 Cursor 和 Claude Code 等 AI 助手快速迭代一个电商订单处理模块,急需建立一套既能被人类理解又能被 AI 精准执行的测试体系。

没有 riteway 时

  • AI 理解偏差:传统断言代码冗长且逻辑隐晦,AI 经常误读测试意图,导致生成的代码虽通过测试却不符合业务需求。
  • 调试成本高昂:测试失败时,缺乏清晰的“实际输出 vs 预期输出”对比,开发者需花费大量时间复现和定位问题。
  • 上下文浪费:繁琐的样板代码占用了宝贵的 Token 上下文窗口,限制了 AI 对项目整体逻辑的分析深度。
  • 提示词评估困难:缺乏标准化工具来量化评估 AI 提示词(Prompt)的效果,优化过程全靠主观猜测。

使用 riteway 后

  • 需求精准对齐:riteway 强制要求的“五问”结构(如“它应该做什么”、“如何复现失败”)让 AI 清晰掌握业务规则,生成代码一次通过率显著提升。
  • 故障一目了然:测试报告以自然语言呈现明确的差异对比,开发者甚至无需查看代码即可直接修复逻辑漏洞。
  • Token 高效利用:极简的语法大幅减少代码行数,为 AI 留出更多空间分析复杂业务逻辑,提升开发效率。
  • 量化提示词效果:通过 riteway ai 命令行工具,团队能像运行单元测试一样批量评估 Prompt,并获得具体的通过率报告,实现数据驱动的提示词优化。

riteway 通过将测试转化为人类与 AI 都能读懂的明确契约,彻底解决了 AI 驱动开发中“沟通歧义”与“评估黑盒”的核心痛点。

运行环境要求

操作系统
  • 未说明
GPU

无需求

内存

未说明

依赖
notes该工具基于 Node.js (v16+) 运行,需启用原生 ES 模块 (在 package.json 中设置 "type": "module")。AI 评估功能 (`riteway ai`) 依赖外部 AI 代理 CLI 工具(如 Claude Code, Cursor, OpenCode),并通过 OAuth 进行认证,无需 API Key。若需测试 React/JSX 组件,需额外配置构建工具(如 Vite 或 Next.js)以支持转译。
python不适用
Node.js>=16
vitest (可选,用于 JSX 测试)
nyc (可选,用于覆盖率)
tap-nirvana (可选,用于报告格式化)
riteway hero image

快速开始

Riteway

SudoLang AIDDParallel Drive

面向AI驱动开发(AIDD)与软件代理的标准测试框架。

Riteway是一种测试断言风格与理念,旨在为人类和AI代理编写简单、易读且富有帮助性的单元测试。

它让你用远少于传统断言框架的代码量,写出更好、更易读的测试;而riteway ai CLI则使你能够像编写单元测试套件一样轻松地进行AI代理提示评估。

Riteway是构建现代测试套件的原生AI方式。它与Vitest、Playwright、Claude Code、Cursor Agent、Google Antigravity等工具配合得非常好。

  • Readable(可读性)
  • Isolated/Integrated(隔离性/集成性)
  • Thorough(全面性)
  • Explicit(明确性)

Riteway强制你编写Readable、Isolated和Explicit的测试,因为这是使用其API的唯一方式。同时,它通过让测试断言变得极其简单,促使你愿意编写更多断言,从而更容易做到全面覆盖。

为什么在AI驱动开发中选择Riteway?

Riteway的结构化方法使其非常适合AIDD:

📖 了解更多: 通过测试驱动开发实现更好的AI驱动开发

  • 清晰的需求:通过“给定”、“应该”的期望以及5问框架,帮助AI更准确地理解需要构建的内容。
  • 设计之初即注重可读性:自然语言描述使测试对人类和AI都易于理解。
  • 简洁的API:最小化的接口表面减少了AI的困惑与幻觉。
  • 节省Token:简洁的语法节约了宝贵的上下文窗口空间。

每个测试必须回答的5个问题

每个单元测试都必须回答5个问题。Riteway会强制你回答这些问题。

  1. 被测单元是什么(模块、函数、类或其他)?
  2. 它应该做什么?(用文字描述)
  3. 实际输出是什么?
  4. 预期输出是什么?
  5. 如何复现失败?

安装

npm install --save-dev riteway

然后在你的package.json中添加一条npm命令:

"test": "riteway test/**/*-test.js",

对于同时使用核心Riteway测试和JSX组件测试的项目,你可以采用双测试运行器配置:

"test": "node source/test.js && vitest run",

现在你可以通过npm test来运行测试。Riteway还完全兼容TAPE的使用语法,因此你也可以设置一个高级入口,如下所示:

"test": "nyc riteway test/**/*-rt.js | tap-nirvana",

在这种情况下,我们使用了nyc,它可以生成测试覆盖率报告。输出会被管道传递给一个高级TAP格式化工具ta-p-nirvana,后者会添加颜色编码、源码行号标识以及高级差异对比功能。

系统要求

Riteway需要Node.js 16及以上版本,并使用原生ES模块。请在你的package.json中添加"type": "module"以启用ESM支持。若要进行JSX组件测试,你需要一个能够转译JSX的构建工具(详见下文的[JSX设置])。

riteway ai — AI提示评估

riteway ai CLI会根据可配置的通过率阈值,运行你的AI代理提示评估。编写一个.sudo测试文件,将其输入任何支持的AI代理,即可获得一份TAP格式的报告,其中包含多次运行中每项断言的通过率。

认证

所有代理均采用OAuth认证——无需API密钥。在运行评估之前,只需进行一次认证:

代理 命令 文档
Claude claude setup-token Claude Code文档
Cursor agent login Cursor文档
OpenCode 参见文档 opencode.ai/docs/cli

编写测试文件

AI评估使用SudoLang语法,在.sudo文件中编写:

# my-feature-test.sudo

import 'path/to/spec.mdc'

userPrompt = """
按照描述实现sum函数。
"""

- Given the spec, should name the function sum
- Given the spec, should accept two parameters named a and b
- Given the spec, should return the correct sum of the two parameters

每一行- Given ..., should ...都会成为独立评判的断言。代理会根据userPrompt(并以导入的规格作为上下文)作出响应,随后由一位裁判代理对每次运行中的每项断言进行评分。

运行评估

riteway ai path/to/my-feature-test.sudo

默认情况下,此命令会执行4轮测试,要求75%的通过率,使用Claude代理,最多4个测试并发执行,并且每次代理调用允许300秒

# 指定运行次数、阈值和代理
riteway ai path/to/test.sudo --runs 10 --threshold 80 --agent opencode

# 使用Cursor代理并启用彩色输出
riteway ai path/to/test.sudo --agent cursor --color

# 使用自定义代理配置文件(与--agent互斥)
riteway ai path/to/test.sudo --agent-config ./my-agent.json

选项

标志 默认值 描述
--runs N 4 每项断言的运行次数
--threshold P 75 所需的通过百分比(0–100)
--timeout MS 300000 每次代理调用的超时时间,单位为毫秒
--agent NAME claude 代理:claudeopencodecursor,或来自riteway.agent-config.json的自定义名称
--agent-config FILE 自定义单代理JSON配置文件路径,格式为{"command","args","outputFormat"}——与--agent互斥
--concurrency N 4 最大并发测试执行数
--color 关闭 启用ANSI彩色输出
--save-responses 关闭 将原始代理响应及裁判详情保存到配套的.responses.md文件中

结果将以TAP Markdown格式写入项目根目录下的ai-evals/文件夹中。

保存原始响应以进行调试

当传递 --save-responses 时,会在 .tap.md 输出文件旁边生成一个配套的 .responses.md 文件。该文件包含每个断言的原始代理响应结果以及每次运行的评判详情(通过、实际值、期望值、分数),这在不增加控制台输出的情况下非常有助于调试失败原因。

riteway ai path/to/test.sudo --save-responses

每个测试文件都会生成自己唯一命名的一对文件(例如 2026-03-17-test-abc12.tap.md2026-03-17-test-abc12.responses.md),因此多个测试文件之间不会发生冲突。

将响应捕获为 CI 构建产物

在 GitHub Actions 中,使用 --save-responses 并将 ai-evals/ 目录作为构建产物上传:

- name: 运行 AI 提示词评估
  run: npx riteway ai path/to/test.sudo --save-responses

- name: 上传 AI 评估响应
  if: always()
  uses: actions/upload-artifact@v4
  with:
    name: ai-eval-responses
    path: ai-evals/*.responses.md
    retention-days: 14

if: always() 确保即使断言失败,响应也会被上传,这样你就可以精确地查看代理生成的内容。

超时情况下的部分结果

如果某些运行在另一些超时之前完成,已完成运行的响应仍然会被写入响应文件。超时运行的部分代理输出也会被捕获,并在其后添加 [RITEWAY TIMEOUT] 标记,标明超时发生的时间和位置。这有助于你调试为什么某个运行耗时过长,并可能优化提示词以提高运行速度。

自定义代理配置

riteway ai init 会将所有内置代理配置写入项目根目录下的 riteway.agent-config.json 文件中,以便你可以添加自定义代理或调整现有标志:

riteway ai init           # 创建 riteway.agent-config.json
riteway ai init --force   # 覆盖现有文件

生成的文件是一个键值注册表。你可以添加自定义代理条目,并使用 --agent 参数来调用它:

{
  "claude":   { "command": "claude",   "args": ["-p", "--output-format", "json", "--no-session-persistence"], "outputFormat": "json"  },
  "opencode": { "command": "opencode", "args": ["run", "--format", "json"],                                   "outputFormat": "ndjson" },
  "cursor":   { "command": "agent",    "args": ["--print", "--output-format", "json"],                        "outputFormat": "json"  },
  "my-agent": { "command": "my-tool",  "args": ["--json"],                                                    "outputFormat": "json"  }
}
riteway ai path/to/test.sudo --agent my-agent

一旦 riteway.agent-config.json 存在,其中定义的任何代理键都会覆盖库中针对该代理的默认设置。


示例用法

import { describe, Try } from 'riteway/index.js';

// 待测试的函数
const sum = (...args) => {
  if (args.some(v => Number.isNaN(v))) throw new TypeError('NaN');
  return args.reduce((acc, n) => acc + n, 0);
};

describe('sum()', async assert => {
  const should = '返回正确的总和';

  assert({
    given: '无参数',
    should: '返回 0',
    actual: sum(),
    expected: 0
  });

  assert({
    given: '零',
    should,
    actual: sum(2, 0),
    expected: 2
  });

  assert({
    given: '负数',
    should,
    actual: sum(1, -4),
    expected: -3
  });

  assert({
    given: 'NaN',
    should: '抛出错误',
    actual: Try(sum, 1, NaN),
    expected: new TypeError('NaN')
  });  
});

测试 React 组件

import render from 'riteway/render-component';
import { describe } from 'riteway/index.js';

describe('renderComponent', async assert => {
  const $ = render(<div className="foo">testing</div>);

  assert({
    given: '一些 JSX',
    should: '渲染标记',
    actual: $('.foo').html().trim(),
    expected: 'testing'
  });
});

注意:JSX 组件测试需要转译。请参阅下方的 JSX 设置 部分,了解如何与 Vite 或 Next.js 配合使用。

Riteway 使使用 riteway/render-component 模块测试纯 React 组件变得比以往更加容易。所谓纯组件,是指在输入相同的情况下,始终渲染相同输出的组件。

我不建议对有状态组件或带有副作用的组件进行单元测试。对于这类组件,应编写功能测试,因为它们需要描述从用户输入到后端服务再到 UI 的完整端到端流程。这些测试往往会重复你在单元测试有状态 UI 行为时所做的工作。无论如何,要正确地对这类组件进行单元测试,都需要大量的模拟,而这种模拟可能会掩盖组件内部耦合度过高的问题。有关详细信息,请参阅文章《Mocking is a Code Smell》(https://medium.com/javascript-scene/mocking-is-a-code-smell-944a70c90a6a)。

一个很好的替代方案是将副作用和状态管理封装在容器组件中,然后将状态作为 props 传递给纯组件。对纯组件进行单元测试,并使用功能测试确保完整的用户体验流程在真实浏览器中能够正常运作。

隔离 React 单元测试

当你对 React 组件进行单元测试时,通常需要多次渲染你的组件。而且很多时候,不同的测试需要使用不同的 props。

Riteway 可以通过结合使用工厂函数块级作用域,在保持测试可读性的同时轻松实现测试的隔离。

import ClickCounter from '../click-counter/click-counter-component';

describe('ClickCounter 组件', async assert => {
  const createCounter = clickCount =>
    render(<ClickCounter clicks={ clickCount } />)
  ;

  {
    const count = 3;
    const $ = createCounter(count);
    assert({
      given: '点击次数',
      should: '渲染正确的点击次数',
      actual: parseInt($('.clicks-count').html().trim(), 10),
      expected: count
    });
  }

  {
    const count = 5;
    const $ = createCounter(count);
    assert({
      given: '点击次数',
      should: '渲染正确的点击次数',
      actual: parseInt($('.clicks-count').html().trim(), 10),
      expected: count
    });
  }
});

输出

Riteway 生成标准的 TAP 输出,因此可以轻松集成到几乎任何测试格式化工具和报告工具中。(TAP 是一项成熟的标准,拥有数百(甚至数千?)种集成方式)。

TAP version 13
# sum()
ok 1 给定无参数:应该返回 0
ok 2 给定零:应该返回正确的总和
ok 3 给定负数:应该返回正确的总和
ok 4 给定 NaN:应该抛出错误

1..4
# 测试总数 4
# 通过数 4

# 好的

想要更丰富的彩色输出吗?没问题。标准的 TAP 输出已经为你准备好了。你可以通过任何你喜欢的 TAP 格式化工具来处理它:

npm install -g tap-color
npm test | tap-color

彩色输出

API

describe

describe = (unit: String, cb: TestFunction) => Void

describe 接受一个对被测试单元(函数、模块等)的文字描述,以及一个回调函数 (cb: TestFunction)。这个回调函数应该是一个 异步函数,这样当测试执行到末尾时就能自动结束。Riteway 假设所有测试都是异步的。在 JavaScript 中,异步函数会自动返回一个 Promise,因此 Riteway 知道何时结束每个测试。

describe.only

describe.only = (unit: String, cb: TestFunction) => Void

describe 类似,但不会运行测试套件中的其他测试。参见 test.only

describe.skip

describe.skip = (unit: String, cb: TestFunction) => Void

跳过此测试的执行。参见 test.skip

TestFunction

TestFunction = assert => Promise<void>

TestFunction 是用户定义的函数,接受 assert() 作为参数,并且必须返回一个 Promise。如果你提供的是一个异步函数,它会自动返回一个 Promise。如果不是,你就需要显式地返回一个 Promise。

如果 TestFunction 的 Promise 没有被解决,就会抛出一个错误,告诉你测试在未结束的情况下退出了。通常的解决方法是在你的 TestFunction 签名中添加 async,例如:

describe('sum()', async assert => {
  /* 测试内容 */
});

assert

assert = ({
  given = Any,
  should = '',
  actual: Any,
  expected: Any
} = {}) => Void, throws

assert 函数是你用来进行断言的函数。它接受 givenshould 的文字描述(应为字符串),并调用测试框架来评估测试的通过或失败状态。除非你使用自定义的测试框架,否则断言失败会导致测试失败报告和错误退出状态。

请注意,assert 使用 深度相等性检查 来比较实际值和期望值。在极少数情况下,你可能需要另一种类型的检查。这时可以为 actual 值传递一个 JavaScript 表达式。

createStream

createStream = ({ objectMode: Boolean }) => NodeStream

创建一个输出流,绕过默认将消息写入 console.log() 的输出流。默认情况下,该流将是 TAP 输出的文本流,但你可以通过将 opts.objectMode 设置为 true 来获取对象流。

import { describe, createStream } from 'riteway/index.js';

createStream({ objectMode: true }).on('data', function (row) {
    console.log(JSON.stringify(row))
});

describe('foo', async assert => {
  /* 你的测试在这里 */
});

countKeys

给定一个对象,返回该对象自有属性的数量。

countKeys = (Object) => Number

这个函数在你向以 ID 为键的对象添加新状态时非常有用,可以帮助你确保正确数量的键被添加到了对象中。

Try

Try = (fn, ...args) => Error | Any

使用给定的参数执行函数,如果抛出错误则返回错误,如果没有错误则返回函数的返回值。这个工具专门用于测试断言中的错误情况。

Try 同时处理同步错误(通过 try/catch)和异步错误(通过 Promise 拒绝),因此非常适合测试那些会抛出异常或返回被拒绝的 Promise 的函数。

示例:测试同步错误

const sum = (...args) => {
  if (args.some(v => Number.isNaN(v))) throw new TypeError('NaN');
  return args.reduce((acc, n) => acc + n, 0);
};

describe('sum()', async assert => {
  assert({
    given: 'NaN',
    should: '抛出 TypeError',
    actual: Try(sum, 1, NaN),
    expected: new TypeError('NaN')
  });
});

示例:测试异步错误

const fetchUser = async (id) => {
  if (!id) throw new Error('需要 ID');
  return await fetch(`/api/users/${id}`);
};

describe('fetchUser()', async assert => {
  assert({
    given: '没有 ID',
    should: '抛出错误',
    actual: await Try(fetchUser),
    expected: new Error('需要 ID')
  });
});

Render Component

首先,从 riteway/render-component 中导入 render

import render from 'riteway/render-component';
render = (jsx) => CheerioObject

接收一个 JSX 对象,并返回一个 Cheerio 对象,它是 jQuery 核心 API 的部分实现,使得从渲染后的 JSX 标记中选择元素就像使用 jQuery 或 querySelectorAll API 一样简单。

示例

describe('MyComponent', async assert => {
  const $ = render(<MyComponent />);

  assert({
    given: '无参数',
    should: '渲染带有 my-component 类的内容',
    actual: $('.my-component').length,
    expected: 1
  });
});

Match

首先,从 riteway/match 中导入 match

import match from 'riteway/match.js';
match = text => pattern => String

接收一段要搜索的文本,返回一个函数,该函数接受一个模式并返回匹配的文本(如果找到的话),否则返回空字符串。模式可以是字符串或正则表达式。

示例

假设你有一个需要测试的 React 组件。该组件接收一些文本并在某个 div 内容中渲染出来。你需要确保传入的文本确实被渲染出来了。

const MyComponent = ({text}) => <div className="contents">{text}</div>;

你可以使用 match 创建一个新的函数,用来测试你的搜索文本是否包含与你传入的模式匹配的内容。以这种方式编写测试可以使预期值和实际值更加清晰,从而确保你能找到预期的特定文本:

describe('MyComponent', async assert => {
  const text = '测试任意你喜欢的内容!';
  const $ = render(<MyComponent text={ text }/>);
  const contains = match($('.contents').html());

  assert({
    given: '一些要显示的文本',
    should: '渲染该文本',
    actual: contains(text),
    expected: text
  });
});

JSX 设置

对于 JSX 组件的测试,你需要一个能够转译 JSX 的构建工具。我们推荐 ViteNext.js,它们都可以直接处理 JSX。

选项 1: Vite 설정

Vite는 최소한의 구성으로 훌륭한 JSX 지원을 제공합니다:

  1. Vite, Vitest 및 React 플러그인 설치:

    npm install --save-dev vite vitest @vitejs/plugin-react
    
  2. 프로젝트 루트에 vite.config.js 생성:

    import { defineConfig } from 'vite';
    import react from '@vitejs/plugin-react';
    
    export default defineConfig({
      plugins: [react()],
    });
    
  3. package.json의 test 스크립트 업데이트:

    {
      "scripts": {
        "test": "vitest run"
      }
    }
    

    참고: Vitest 구성은 선택 사항입니다. 위의 설정은 기본 설정으로도 작동합니다.

옵션 2: Next.js 설정

Next.js는 JSX 트랜스파일링을 자동으로 처리합니다. JSX 지원을 위해 추가 구성이 필요하지 않습니다.

Vitest

Vitest는 Riteway 테스트를 실행할 수 있는 Vite 플러그인입니다. 설정이 간편하고 속도가 빠르기 때문에 Riteway를 시작하기에 매우 좋은 방법입니다. 또한 실제 브라우저에서 테스트를 실행하므로 표준 웹 컴포넌트를 테스트할 수 있습니다.

설치

먼저 Vitest를 설치해야 합니다. 아직 프로젝트에 Riteway를 설치하지 않았다면 함께 설치해야 합니다. 원하는 패키지 매니저를 사용할 수 있습니다:

npm install --save-dev vitest

사용법

먼저 riteway/vitest에서 assertvitest에서 describe를 가져옵니다:

import { assert } from 'riteway/vitest';
import { describe, test } from "vitest";

그런 다음 Vitest 러너를 사용하여 테스트를 실행할 수 있습니다. 직접 npx vitest를 실행하거나 package.json에 스크립트를 추가할 수 있습니다. Vitest 구성 설정에 대한 추가 정보는 여기를 참조하세요.

Vitest를 사용할 때는 실패가 발생했을 때 Vitest가 어디에서 실패했는지 파악할 수 있도록 아사ert 문을 테스트 함수 안에 감싸야 합니다.

// 테스트할 함수
const sum = (...args) => {
  if (args.some(v => Number.isNaN(v))) throw new TypeError('NaN');
  return args.reduce((acc, n) => acc + n, 0);
};

describe('sum()', () => {
  test('기본 합산', () => {
    assert({
      given: '인수 없음',
      should: '0을 반환해야 함',
      actual: sum(),
      expected: 0
    });

    assert({
      given: '두 숫자',
      should: '올바른 합을 반환해야 함',
      actual: sum(2, 0),
      expected: 2
    });
  });
});

Bun

Bun에는 Jest와 호환되는 빠른 내장 테스트 러너가 있습니다. Riteway는 Bun 어댑터를 제공하여 익숙한 assert API를 Bun의 테스트 러너와 함께 사용할 수 있도록 해줍니다.

설치

먼저 Bun이 설치되어 있는지 확인하세요. 그런 다음 프로젝트에 Riteway를 설치합니다:

bun add --dev riteway

설정

assert를 사용하기 전에 맞춤형 매처를 등록하기 위해 setupRitewayBun()을 한 번 호출해야 합니다. Bun의 preload 옵션을 사용하여 전역 설정 파일에서 이를 수행하는 것을 권장합니다.

설정 파일(예: test/setup.ts)을 만듭니다:

import { setupRitewayBun } from 'riteway/bun';

setupRitewayBun();

그런 다음 Bun이 이를 미리 로드하도록 구성합니다. bunfig.toml에 다음을 추가하세요:

[test]
preload = ["./test/setup.ts"]

또는 CLI를 통해 지정할 수도 있습니다:

bun test --preload ./test/setup.ts

사용법

테스트 파일에서 riteway/bun에서 test, describeassert를 가져옵니다:

import { test, describe, assert } from 'riteway/bun';

그런 다음 bun test를 사용하여 테스트를 실행합니다:

bun test

예제

import { test, describe, assert } from 'riteway/bun';

// 테스트할 함수
const sum = (...args) => {
  if (args.some(v => Number.isNaN(v))) throw new TypeError('NaN');
  return args.reduce((acc, n) => acc + n, 0);
};

describe('sum()', () => {
  test('주어진 인수가 없을 경우, 0을 반환해야 함', () => {
    assert({
      given: '인수 없음',
      should: '0을 반환해야 함',
      actual: sum(),
      expected: 0
    });
  });

  test('두 숫자가 주어질 경우, 올바른 합을 반환해야 함', () => {
    assert({
      given: '두 숫자',
      should: '올바른 합을 반환해야 함',
      actual: sum(2, 3),
      expected: 5
    });
  });
});

실패 출력

테스트가 실패하면 오류 메시지에 givenshould 컨텍스트가 포함됩니다:

오류: 두 개의 서로 다른 숫자가 주어졌을 때, 같아야 합니다.

예상: 43
받은 값: 42

版本历史

v6.1.12019/11/05

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.6k|★★☆☆☆|今天
开发框架Agent语言模型

opencode

OpenCode 是一款开源的 AI 编程助手(Coding Agent),旨在像一位智能搭档一样融入您的开发流程。它不仅仅是一个代码补全插件,而是一个能够理解项目上下文、自主规划任务并执行复杂编码操作的智能体。无论是生成全新功能、重构现有代码,还是排查难以定位的 Bug,OpenCode 都能通过自然语言交互高效完成,显著减少开发者在重复性劳动和上下文切换上的时间消耗。 这款工具专为软件开发者、工程师及技术研究人员设计,特别适合希望利用大模型能力来提升编码效率、加速原型开发或处理遗留代码维护的专业人群。其核心亮点在于完全开源的架构,这意味着用户可以审查代码逻辑、自定义行为策略,甚至私有化部署以保障数据安全,彻底打破了传统闭源 AI 助手的“黑盒”限制。 在技术体验上,OpenCode 提供了灵活的终端界面(Terminal UI)和正在测试中的桌面应用程序,支持 macOS、Windows 及 Linux 全平台。它兼容多种包管理工具,安装便捷,并能无缝集成到现有的开发环境中。无论您是追求极致控制权的资深极客,还是渴望提升产出的独立开发者,OpenCode 都提供了一个透明、可信

144.3k|★☆☆☆☆|昨天
Agent插件

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像