内容
# 测试工具
**安全、离线 API 测试平台**
[](https://github.com/apinizer/testnizer/actions/workflows/build.yml)
[](LICENSE)
[](https://www.testnizer.com/download/)
> **您的数据永远不会离开您的机器。** 每个 API 请求、集合、凭证、证书和令牌都存储在本地加密数据库中。没有云同步。没有遥测。没有 JWT 解码、XML 签名、加密或格式化期间的外部网络调用 — 所有操作都在设备上运行。
Testnizer 是一个免费、完全离线的桌面 API 测试应用程序,适用于无法将生产令牌、签名 SOAP 信封或 PII 粘贴到 Web 工具的团队 — 银行、政府、保险、医疗保健。从头开始构建为 Electron 应用程序,具有与 Postman / SoapUI / Insomnia 相同的人体工程学,但具有严格的仅离线执行模型。
---
## 为什么离线很重要
| 关注点 | 云工具(Postman 等) | Testnizer |
|---|---|---|
| 集合存储在哪里? | 云工作区 | 本地 SQLite 数据库在您的磁盘上 |
| 令牌/密码存储在哪里? | 同步到供应商服务器 | 通过 OS 密钥链(Keychain / DPAPI / libsecret)加密 |
| JWT 解码 | Web 应用程序将令牌发送到远程服务 | 纯本地加密 — 令牌从未离开进程 |
| WS-Security 签名/加密 | 在线工具或单独的桌面应用程序 | 内置,在主进程中运行,带有 `xml-crypto` + Node `crypto` |
| 遥测 | 默认启用 | 无 — 无需选择 |
| 静止网络出口 | 背景同步、分析、登录 ping | 零。渲染器具有 CSP `connect-src 'self'` |
| 空气隔离网络 | 不起作用 | 起作用 |
再次阅读:**渲染器进程具有内容安全策略 `connect-src 'self'`** — 意味着 React UI 在物理上无法访问公共互联网。您发送的每个 API 请求都通过 Node 主进程 IPC 处理程序路由,该处理程序由您(用户)控制。
---
## 亮点
### 🌐 协议
- **HTTP / REST** — 完整的メソッド覆盖,參數/头部/主体/身份验证,cookie,mTLS,代理,重定向,多部分文件上传,原始/urlencoded/form-data/二进制,预/后脚本,断言
- **SOAP** — WSDL 导入(URL 或文件),手动信封模式,多服务/多端口,SOAPAction 提取,自动示例信封生成
- **WebSocket** — ws + wss,自定义头部,消息时间线,JSON/文本编译器
- **GraphQL** — 查询/突变/订阅,模式内省,变量 JSON
- **gRPC** — `.proto` 导入,一元+服务器流+客户端流+双向流,元数据,JSON 骨架从消息字段
- **服务器发送事件** — 带有 `Last-Event-ID` 恢复的长寿命流
- **Socket.IO** *(新)* — `socket.io-client`,命名空间,身份验证(`auth.token`),额外头部,发出+订阅,双向事件时间线
- **MCP(模型上下文协议)** *(新)* — Testnizer 是一个 MCP **客户端**:通过 Streamable HTTP、SSE(旧版)或 stdio(本地子进程)连接到 MCP 服务器;列出并调用带有 JSON 参数的工具。构建在 `@modelcontextprotocol/sdk` 上。
- **AI 聊天** — 14 个提供商(OpenAI、Anthropic、Google、xAI、DeepSeek、Mistral、Groq、Perplexity、Cerebras、Cohere、Fireworks、DeepInfra、Together、OpenRouter)+ 自定义 URL、流式传输、多轮、环境变量解析
### 🔐 WS-Security(XML 签名和加密)
- UsernameToken:密码文本 + 密码摘要,带有 nonce/created
- 带有自定义 TTL 的时间戳
- XML 签名(RSA-SHA1 / RSA-SHA256),信封或特定元素
- XML 加密(AES-128/256-CBC,AES-128/256-GCM,RSA-OAEP 密钥包装)
- 验证 + 解密操作作为独立工具,而不仅仅是请求功能
- 所有加密操作都在设备上运行。证书和私钥从未传输。
### 🛠 内置工具(无需互联网)
- **JWT 调试器** — 解码 + 验证 HS/RS/ES 签名,检查声明,无网络调用
- **JSON / XML 格式化和验证工具**
- **编码/解码器** — Base64,URL,十六进制,HTML 实体,Unicode 转义
- **文本差异** — 侧边比较,行/字/字符粒度
- **JSONPath / XPath / XSLT / Jolt** 评估器
- **WS-Security 工作台** — 在任意 XML 上应用/验证/解密/签名
### 📦 本地优先存储
- 您磁盘上的 SQLite 数据库 — 工作区、项目、环境、历史记录、证书、测试套件、调度任务
- 操作系统原生秘密存储(`safeStorage`)用于通行短语和令牌
- 可选的主密码保护本地数据
- 原生 `simple-git` 集成:测试与代码一起存在,由您的正常工作流版本控制 — 无专有云同步
### 🔁 导入/导出(无损轮换)
- **OpenAPI 3.x / Swagger 2.0** — 安全方案映射到身份验证,示例优先于架构,标签 + 操作 ID + 必需参数保留
- **Postman v2.1** — 包括 `event[]`(预/测试脚本),集合变量
- **Insomnia v4** — 包括 form-data 文件字段,环境形状,脚本 shim
- **cURL** — Chrome “复制为 cURL”,Windows cmd.exe插入符号,多部分,ANSI-C 引号
- **WSDL** — 多服务,多端口,SOAP 1.1 + SOAP 1.2 双重绑定
- **`.proto`** — gRPC 服务描述,带有 JSON 骨架主体
- **RAML 1.0** — 嵌套资源,URI 参数,主体内容类型
- **SoapUI / ReadyAPI** 项目(XML)
- **HAR** — 浏览器网络日志
测试套件通过自动检测接受多种格式输入(Testnizer 原生 + Postman + Insomnia)。
---
## 安装
从[下载页面](https://www.testnizer.com/download/)获取预构建的二进制文件:
| 平台 | 格式 | 注意 |
|---|---|---|
| macOS(Apple Silicon) | `Testnizer-X.Y.Z-arm64.dmg` | 首次启动:右键单击 → 打开(临时签名) |
| macOS(Intel) | `Testnizer-X.Y.Z-x64.dmg` | 首次启动:右键单击 → 打开 |
| Windows | `Testnizer Setup X.Y.Z.exe` | 智能屏幕提示在测试期间预期 |
| Linux(deb) | `Testnizer-X.Y.Z-x64.deb` | `sudo dpkg -i ...` |
| Linux(AppImage) | `Testnizer-X.Y.Z-x64.AppImage` | `chmod +x` 然后运行 |
内置自动更新(electron-updater)并从发布仓库拉取签名增量包。您可以在设置中禁用它。
---
## 开发
```bash
# 需求:Node 20+,Git
git clone https://github.com/apinizer/testnizer.git
cd testnizer
npm install # postinstall 重命名 Electron.app → Testnizer.app
npm run dev # 渲染器 @ http://localhost:5173,Electron 应用程序启动
npm run typecheck # tsc --noEmit(主 + 渲染器)
npm run lint # ESLint 扁平配置
npm run test:unit # Vitest(548+ 测试)
npm run test:e2e:smoke # Playwright Electron 烟雾测试
npm run build # 生产包在 out/
```
有关打包,请参见 `.claude/commands/package.md` — 顺序很重要,因为 `better-sqlite3` 是必须为宿主架构重建的原生依赖项。
## 项目布局
```
src/
├── main/ # Node.js — IPC 处理程序,协议引擎,SQLite 仓库
├── preload/ # contextBridge — 单个 window.api 边界
└── renderer/ # React 19 + Tailwind v4 — UI 仅限,无网络
docs/production-readiness/ # 版本化准备跟踪器
.github/workflows/build.yml # CI:质量 + 6 平台构建 + 发布
```
请参阅 [CLAUDE.md](CLAUDE.md) 以获取更深入的架构规则(安全模型,进程分离,开发工作流)。
---
## 安全模型
三个承载规则,由代码强制执行:
1. **渲染器具有 CSP `connect-src 'self'`** — React UI 无法访问公共互联网。每个 API 调用都通过 Node 主进程 IPC 处理程序路由。
2. **`contextIsolation: true`,`nodeIntegration: false`** — 预加载仅公开经过审计的 `window.api` 接口。UI 线程中没有原始 `fetch`、`axios` 或 `require`。
3. **存储的秘密通过 OS 密钥链** — 通行短语,基本身份验证密码,承载令牌,OAuth 刷新令牌,证书密钥全部通过 Electron `safeStorage`(Keychain / DPAPI / libsecret)。加密的二进制数据存储在本地 SQLite 中。原始值从未接触磁盘。
XML 签名和加密使用 Node 的原生 `crypto` 加上 `xml-crypto` / `xml-encryption` — 两者都在主进程中运行。私钥从磁盘加载,在内存中使用,关闭时清零。
要私下报告安全问题,请发送电子邮件至 `security@testnizer.com`。
---
## 贡献
问题和 PR 欢迎。推送前:
1. `npm run lint` + `npm run typecheck` + `npm run test:unit` 清洁
2. 匹配 IPC 模式:每个处理程序返回 `{ success: boolean, data?: T, error?: string }`
3. 保持渲染器无直接网络调用 — 添加主进程引擎 + IPC 处理程序代替
## 许可证
[MIT](LICENSE) — 请参阅文件以获取完整条款。
## 商标
“Testnizer” 是 Apinizer 的项目。其他商标(Postman,SoapUI,jwt.io 等)仅用于兼容性/迁移目的。