自动化工具 活跃维护

shortest

antiwork/shortest

通过自然语言人工智能进行的问答测试

5699
Stars 标星
342
Forks 分支
31
Watchers 关注
2
Open Issues
TypeScript
主要语言
MIT
开源协议
2.1 MB
仓库大小
2 个月前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:antiwork/shortest
git clone https://github.com/antiwork/shortest.git
git clone git@github.com:antiwork/shortest.git
README.md main

英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。

最短

由 AI 驱动的自然语言端到端测试框架。

功能

  • 自然语言 E2E 测试框架
  • 使用 Anthropic Claude API 的 AI 驱动测试执行
  • 基于 Playwright 构建
  • 支持 2FA 的 GitHub 集成
  • 使用 Mailosaur 进行电子邮件验证

在你的项目中使用 Shortest

如果有帮助,这里有一个简短的视频!

安装

使用 shortest init 命令在新项目或现有项目中简化设置过程。

shortest init 命令将会:

npx @antiwork/shortest init

这将:

  • 如果尚未安装,会自动将 @antiwork/shortest 包作为开发依赖安装
  • 创建一个默认的 shortest.config.ts 文件,包含模板配置
  • 生成一个 .env.local 文件(如果不存在),并为所需的环境变量(例如 ANTHROPIC_API_KEY)提供占位符
  • 将 .env.local 和 .shortest/ 添加到 .gitignore

快速开始

  1. 确定你的测试入口并在配置文件 shortest.config.ts 中添加你的 Anthropic API 密钥
import type { ShortestConfig } from "@antiwork/shortest";

export default {
  headless: false,
  baseUrl: "http://localhost:3000",
  browser: {
    contextOptions: {
      ignoreHTTPSErrors: true
    },
  },
  testPattern: "**/*.test.ts",
  ai: {
    provider: "anthropic",
  },
} satisfies ShortestConfig;

Anthropic API 密钥默认为 SHORTEST_ANTHROPIC_API_KEY / ANTHROPIC_API_KEY 环境变量。可以通过 ai.config.apiKey 覆盖。

你可以选择在配置文件中使用 browser.contextOptions 属性来配置浏览器行为。这允许你传递自定义的 Playwright 浏览器上下文选项。

  1. 使用配置中指定的模式创建测试文件:app/login.test.ts
import { shortest } from "@antiwork/shortest";

shortest("Login to the app using email and password", {
  username: process.env.GITHUB_USERNAME,
  password: process.env.GITHUB_PASSWORD,
});

使用回调函数

您也可以使用回调函数来添加额外的断言和其他逻辑。测试在浏览器中执行完成后,AI将执行回调函数。

import { shortest } from "@antiwork/shortest";
import { db } from "@/lib/db/drizzle";
import { users } from "@/lib/db/schema";
import { eq } from "drizzle-orm";

shortest("Login to the app using username and password", {
  username: process.env.USERNAME,
  password: process.env.PASSWORD,
}).after(async ({ page }) => {
  // Get current user's clerk ID from the page
  const clerkId = await page.evaluate(() => {
    return window.localStorage.getItem("clerk-user");
  });

  if (!clerkId) {
    throw new Error("User not found in database");
  }

  // Query the database
  const [user] = await db
    .select()
    .from(users)
    .where(eq(users.clerkId, clerkId))
    .limit(1);

  expect(user).toBeDefined();
});

生命周期钩子

您可以使用生命周期钩子在测试前后运行代码。

import { shortest } from "@antiwork/shortest";

shortest.beforeAll(async ({ page }) => {
  await clerkSetup({
    frontendApiUrl:
      process.env.PLAYWRIGHT_TEST_BASE_URL ?? "http://localhost:3000",
  });
});

shortest.beforeEach(async ({ page }) => {
  await clerk.signIn({
    page,
    signInParams: {
      strategy: "email_code",
      identifier: "iffy+clerk_test@example.com",
    },
  });
});

shortest.afterEach(async ({ page }) => {
  await page.close();
});

shortest.afterAll(async ({ page }) => {
  await clerk.signOut({ page });
});

链式测试

最短支持灵活的测试链模式:

// Sequential test chain
shortest([
  "user can login with email and password",
  "user can modify their account-level refund policy",
]);

// Reusable test flows
const loginAsLawyer = "login as lawyer with valid credentials";
const loginAsContractor = "login as contractor with valid credentials";
const allAppActions = ["send invoice to company", "view invoices"];

// Combine flows with spread operator
shortest([loginAsLawyer, ...allAppActions]);
shortest([loginAsContractor, ...allAppActions]);

API 测试

使用自然语言测试 API 端点

const req = new APIRequest({
  baseURL: API_BASE_URI,
});

shortest(
  "Ensure the response contains only active users",
  req.fetch({
    url: "/users",
    method: "GET",
    params: new URLSearchParams({
      active: true,
    }),
  }),
);

或者简单地说:

shortest(`
  Test the API GET endpoint ${API_BASE_URI}/users with query parameter { "active": true }
  Expect the response to contain only active users
`);

运行测试

pnpm shortest                   # Run all tests
pnpm shortest login.test.ts     # Run specific tests from a file
pnpm shortest login.test.ts:23  # Run specific test from a file using a line number
pnpm shortest --headless        # Run in headless mode using

你可以在 examples 目录中找到示例测试。

CI设置

你可以通过在无头模式下运行测试,在CI/CD流水线中运行最短。确保将你的Anthropic API密钥添加到CI/CD流水线的密钥中。

在这里查看示例

GitHub 2FA 登录设置

最短支持使用GitHub双重认证登录。用于GitHub认证测试:

  1. 进入你的仓库设置
  2. 进入“密码与认证”
  3. 点击“认证器应用”
  4. 选择“使用你的身份验证器应用”
  5. 点击“设置密钥”以获取OTP密钥
  6. 将 OTP 密钥添加到你的 .env.local 文件中,或使用 Shortest CLI 添加它
  7. 将终端显示的2FA代码输入Github的Authenticator设置页面,完成流程
shortest --github-code --secret=<OTP_SECRET>

环境设置

在 .env.local 中需要:

ANTHROPIC_API_KEY=your_api_key
GITHUB_TOTP_SECRET=your_secret  # Only for GitHub auth tests

最短 CLI 开发

NPM 包 位于 packages/shortest/。请参阅 CONTRIBUTING 指南。

Web 应用开发

本指南将帮助你为本地开发设置 Shortest Web 应用。

先决条件

  • React >=19.0.0(如果与 Next.js 14 或 Server Actions 一起使用)
  • Next.js >=14.0.0(如果使用 Server Components/Actions)

[!警告]
在 Next.js 14 项目中使用 React 18 可能会导致与 Server Actions 和 useFormStatus 类型冲突

如果您在使用表单操作或 React 钩子时遇到类型错误,请确保您使用的是 React 19

入门

  1. 克隆仓库:
git clone https://github.com/antiwork/shortest.git
cd shortest
  1. 安装依赖项:
npm install -g pnpm
pnpm install

环境设置

针对反工作团队成员

拉取 Vercel 环境变量:

pnpm i -g vercel
vercel link
vercel env pull

设置数据库

pnpm drizzle-kit generate
pnpm db:migrate
pnpm db:seed # creates stripe products, currently unused

服务配置

您需要为本地开发设置以下服务。如果您不是 Antiwork Vercel 团队成员,您需要运行设置向导 pnpm run setup 或手动配置每个服务,并将相应的环境变量添加到您的 .env.local 文件中:

职员
  1. 访问 clerk.com 并创建一个新应用。
  2. 随意命名,并且 禁用除 GitHub 之外的所有登录方式。
  3. 创建完成后,将环境变量复制到你的 .env.local 文件中。
  4. In the Clerk dashboard, disable the "Require the same device and browser" setting to ensure tests with Mailosaur work properly.
Vercel Postgres
  1. 访问你的仪表板:vercel.com。
  2. 导航到“存储”标签页,然后点击创建数据库按钮。
  3. 从浏览存储菜单中选择Postgres。
  4. 从快速开始 .env.local标签页复制你的环境变量。
人类学
  1. Go to your dashboard at anthropic.com and grab your API Key.
    • 注意:如果您以前从未做过此操作,您将需要回答一些问题,并可能需要给您的账户充值。测试该应用程序不需要太多资金。
Stripe
  1. 前往你的 Developers 仪表板,网址为 stripe.com。
  2. 开启 测试模式。
  3. 前往 API 密钥 标签页并复制你的 密钥。
  4. 进入你的项目终端并输入 pnpm run stripe:webhooks。它会提示你通过代码登录,然后给你你的 STRIPE_WEBHOOK_SECRET。
GitHub OAuth
  1. 创建一个 GitHub OAuth 应用:

    • 进入你的 GitHub 账户设置。
    • 导航到 开发者设置 > OAuth 应用 > 新建 OAuth 应用。
    • 填写申请详情:
      • 应用名称:为您的应用选择任意名称
      • 首页 URL:本地开发时设置为 http://localhost:3000
      • 授权回调 URL:使用 Clerk 提供的回调 URL(见下图)
  2. 使用 GitHub OAuth 配置 Clerk:

    • 进入你的 Clerk 仪表盘。
    • 导航到 配置 > 单点登录连接 > GitHub。
    • 选择 使用自定义凭据
    • 输入你刚创建的 GitHub OAuth 应用的 客户端 ID 和 客户端密钥。
    • 在 Scopes 中添加 repo
Mailosaur
  1. 注册一个 Mailosaur 账户。
  2. 创建一个新的收件箱/服务器。
  3. 访问 API 密钥 并创建一个标准密钥。
  4. 更新环境变量:
    • MAILOSAUR_API_KEY:您的 API 密钥
    • MAILOSAUR_SERVER_ID:您的服务器 ID

用于测试登录流程的电子邮件格式为 shortest@<MAILOSAUR_SERVER_ID>.mailosaur.net,其中 MAILOSAUR_SERVER_ID 是您的服务器 ID。请确保将该电子邮件作为新用户添加到 Clerk 应用中。

本地运行

运行开发服务器:

pnpm dev

在你的浏览器中打开 http://localhost:3000 来查看应用的运行情况。

本站来源与版权声明
  • 本文标题:shortest - 通过自然语言人工智能进行的问答测试
  • 本文链接:https://www.cn121.com/automation/antiwork-shortest.html
  • 原项目:antiwork/shortest 版权归原作者 antiwork 及贡献者所有
  • 收录信息:本站于 2026-10-28 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
  • 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。
  • 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 antiwork/shortest。
  • 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
  • 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
  • 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。