在 Vibe Coding(氛围编程)语境下,Harness 不是传统意义上的测试脚手架,而是一套完整的 AI 代码生成约束与验证体系,用来让 AI 写的代码可控、可验证、可长期迭代。
Harness 的四层核心结构(Go 项目通用)
1. 环境约束(最基础)
定义 AI 能操作的边界,防止乱改项目。
| 约束类型 |
具体规则 |
| 目录白名单 |
只允许修改 internal/、api/、tests/ |
| 文件黑名单 |
禁止碰 go.mod、main.go、配置文件、Dockerfile |
| 依赖约束 |
只能使用项目已有的依赖,禁止新增未审核依赖 |
| 权限约束 |
AI 无生产环境权限,仅在测试 / 开发环境运行 |
2. 任务约束(生成前)
给 AI 明确的「任务说明书」,而不是模糊需求。
| 约束类型 |
具体规则 |
| 目标清晰 |
做什么、不做什么、边界在哪里 |
| 验收标准 |
必须通过哪些测试、lint、覆盖率 |
| 技术栈约束 |
必须用 Gin、GORM、Redis、特定目录结构 |
| 代码规范 |
必须遵循 Go 官方规范、团队 lint 规则、注释规范 |
3. 验证约束(生成后,最关键)
AI 写完代码,自动做「三道安检」,不合格直接打回。
| 验证阶段 |
具体内容 |
| 静态检查 |
golangci-lint、go vet、格式化、依赖审计 |
| 测试验证 |
必须通过单元测试、集成测试、API 测试(用你之前的 Go Harness) |
| 运行验证 |
本地启动、冒烟测试、无 panic、无内存泄漏 |
| 架构校验 |
不破坏分层、不循环依赖、符合项目架构规范 |
4. 反馈闭环(长期迭代)
把 AI 成功 / 失败的经验沉淀下来,让 AI 越写越好。
| 反馈类型 |
具体内容 |
| 成功案例库 |
记录符合规范、通过验证的 AI 代码片段 |
| 失败案例库 |
记录 AI 常犯错误(如错误处理、并发、边界) |
| 提示词模板 |
标准化 Prompt,让 AI 每次都按正确格式输出 |
| 版本控制 |
AI 代码必须走 PR、Code Review、CI/CD 流程 |
三、项目结构与配置示例
1. 目录结构(Go 项目标准)
1 2 3 4 5 6 7 8 9 10 11 12 13
| your-go-project/ ├── .harness/ # Harness 核心配置(AI 约束) │ ├── rules/ # 规则文件(lint、依赖、架构) │ ├── prompts/ # 标准化提示词模板 │ ├── scripts/ # 自动化验证脚本 │ └── config.yaml # Harness 全局配置 ├── internal/ │ ├── testutil/harness/ # 传统 Go 测试 Harness(你之前的) │ └── ... # 业务代码 ├── tests/ # 集成/API 测试 ├── .golangci.yml # 严格 lint 规则 ├── Makefile # Harness 一键执行 └── go.mod
|
2. 核心配置:.harness/config.yaml(AI 行为约束)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| env: allowed_dirs: ["internal/", "api/", "tests/", "pkg/"] forbidden_files: ["go.mod", "main.go", "configs/*.yaml", "Dockerfile"] forbidden_deps: ["github.com/unsafe/*", "unmaintained/*"]
task: required_tests: ["unit", "integration", "api"] min_coverage: 80 code_style: "go fmt + golangci-lint strict" architecture: "clean architecture, no circular deps"
verify: pre_commit: ["golangci-lint run", "go test ./... -cover"] ci_required: ["test", "lint", "smoke"]
|
3. 标准化提示词模板:.harness/prompts/go-service.txt
给 AI 固定格式的 Prompt,确保输出一致。
1 2 3 4 5 6 7 8 9 10 11 12 13
| # Go 服务开发任务(严格遵循 Harness 约束) ## 需求 实现用户服务:创建、查询、更新、删除用户 ## 约束(必须遵守) 1. 目录:internal/service/user_service.go 2. 依赖:仅使用 gin、gorm、redis(项目已有) 3. 规范:Go 官方规范、错误处理、注释、单元测试 4. 验证:必须通过 tests/service/user_service_test.go 5. 架构:遵循 Clean Architecture,不直接操作 DB ## 输出要求 - 完整代码 + 单元测试 - 符合 .golangci.yml 所有规则 - 无 panic、无内存泄漏
|
4. 自动化验证脚本:.harness/scripts/verify.sh(AI 代码自动安检)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #!/bin/bash set -e
echo "=== Harness 验证开始 ==="
golangci-lint run ./... --timeout 5m echo "✅ Lint 检查通过"
go test ./internal/... -coverprofile=coverage.out go tool cover -func=coverage.out | grep "total:" | awk '{print "覆盖率: " $3}' if [ $(go tool cover -func=coverage.out | grep "total:" | awk '{print $3}' | sed 's/%//g') -lt 80 ]; then echo "❌ 覆盖率不足 80%" exit 1 fi echo "✅ 单元测试通过"
go test ./tests/... -v echo "✅ 集成测试通过"
go run cmd/api/main.go & sleep 2 curl -s http://localhost:8080/health | grep "ok" kill $! echo "✅ 冒烟测试通过"
echo "=== Harness 验证全部通过 ==="
|
5. Makefile(一键执行 Harness 流程)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| harness-deps: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest go install gotest.tools/gotestsum@latest
harness-verify: bash .harness/scripts/verify.sh
ai-generate: @echo "AI 生成代码中..." make harness-verify
|
四、Go 项目 Vibe Coding 完整工作流(落地步骤)
1. 准备阶段(1 次搭建,长期使用)
- 搭建上述 Harness 目录结构
- 配置 config.yaml、prompts、verify.sh
- 写好传统 Go 测试 Harness(internal/testutil/harness)
- 配置严格的 .golangci.yml
2. 日常开发流程(AI 写代码,Harness 把关)
- 写需求:用标准化 Prompt 描述需求(复制 .harness/prompts 模板)
- AI 生成:用 Cursor/Claude/GPT-4 生成代码
- Harness 验证:执行
make ai-generate,自动做 lint、测试、冒烟
- 人工 Review:快速看代码逻辑、架构、边界处理
- CI/CD:提交代码,CI 自动运行 Harness 验证
- 反馈闭环:把成功 / 失败案例更新到 .harness/prompts 和规则中
3. 关键实践(Go 项目必做)
- AI 只写业务逻辑:Harness、配置、基础设施由人类写
- 测试必须人类写:AI 写测试不可靠,人类写测试 + AI 写实现
- 严格分层:AI 不能跨层调用,必须遵循 Clean Architecture
- 禁止 AI 修改核心文件:
go.mod、main.go、配置文件必须人类审核
- 覆盖率强制 80%+:确保 AI 代码有足够测试覆盖