打赏

claude code+openspec开发java代码基本流程

下面这份「一步一截图」教程,带你从 0 到 1 跑通
「OpenSpec 需求 → Claude Code 生成 feature/StepDefinition/业务代码 → Cucumber-JVM + JUnit5 执行 → Allure 报告 → OpenSpec 归档」
全程 15 分钟,复制即可运行。


0️⃣ 前置检查(2 分钟)

  1. JDK 17+
    java -version 出现 17+ 即可。
  2. Maven 3.9+
    mvn -v 出现 3.9+ 即可。
  3. Node 20+
    node -v 出现 v20+ 即可。

1️⃣ 创建空项目(1 分钟)

mvn archetype:generate \
  -DgroupId=com.example \
  -DartifactId=demo-cucumber-junit5 \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false
cd demo-cucumber-junit5

2️⃣ 一键引入依赖(复制即用)

把下面整块粘进 pom.xml覆盖原来的 <dependencies><build>

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <cucumber.version>7.21.1</cucumber.version>
    <junit-platform.version>1.11.3</junit-platform.version>
    <allure.version>2.29.0</allure.version>
</properties>

<dependencies>
    <!-- Cucumber -->
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit-platform-engine</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>

    <!-- JUnit5 平台 -->
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-suite</artifactId>
        <version>${junit-platform.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.11.3</version>
        <scope>test</scope>
    </dependency>

    <!-- Allure 报告 -->
    <dependency>
        <groupId>io.qameta.allure</groupId>
        <artifactId>allure-cucumber7-jvm</artifactId>
        <version>${allure.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- 让 mvn test 能发现 Cucumber -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>3.2.5</version>
            <configuration>
                <includes>
                    <include>**/*Test.java</include>
                    <include>**/*Cucumber.java</include>
                </includes>
            </configuration>
        </plugin>

        <!-- Allure 命令行 -->
        <plugin>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-maven</artifactId>
            <version>2.12.0</version>
        </plugin>
    </plugins>
</build>

保存后执行
mvn dependency:resolve 确保无红字。


3️⃣ 安装 OpenSpec + Claude Code(全局一次)

npm i -g @fission-ai/openspec@latest
npm i -g claude-code@latest

4️⃣ 需求阶段:1 句话 → 生成 feature

# 在项目根目录
echo "用户登录:输入正确用户名 admin 和密码 123456 后能跳到首页" > login.req

# 让 Claude Code 帮你生成 feature 文件
claude-code --prompt "请把 login.req 转成标准 Gherkin 语法的 login.feature,并存放到 src/test/resources/com/example/cucumber/features/"

✅ 生成完你会得到:
src/test/resources/com/example/cucumber/features/login.feature

Feature: 用户登录
  Scenario: 正确登录
    Given 用户在登录页
    When  输入用户名 "admin" 和密码 "123456"
    Then  应跳转到首页并显示欢迎信息

5️⃣ 实现阶段:AI 帮你写 StepDefinition + 业务代码

claude-code --prompt "请按 login.feature 生成:
 1. StepDefinition 类,放在 src/test/java/com/example/cucumber/steps/
 2. 对应的 LoginPage/LoginService 代码,放在 src/main/java/
 3. JUnit5 单元测试
 4. 确保 mvn test 能直接通过"

⚠️ 出现提示时连续回车 3 次,确认写入。
生成示例:

src/test/java/com/example/cucumber/steps/LoginStepDef.java  
src/main/java/com/example/service/LoginService.java  
src/test/java/com/example/service/LoginServiceTest.java

6️⃣ 创建 JUnit5 入口(让 Maven 能扫到 Cucumber)

新建文件 src/test/java/com/example/cucumber/RunCucumberTest.java

package com.example.cucumber;

import org.junit.platform.suite.api.ConfigurationParameter;
import org.junit.platform.suite.api.SelectClasspathResource;
import org.junit.platform.suite.api.Suite;

import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME;

@Suite
@SelectClasspathResource("com/example/cucumber/features")   // 对应 feature 目录
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME,
                        value = "pretty," +
                                "html:target/cucumber.html," +
                                "io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm")
public class RunCucumberTest {
}

7️⃣ 第一次跑:看场景是否通过

mvn test

控制台最后应出现:

Tests run: 1, Failures: 0, Errors: 0

同时生成:

  • target/cucumber.html(Cucumber 原生)
  • target/allure-results(Allure 原始数据)

8️⃣ 生成 Allure 漂亮报告

mvn allure:serve

浏览器自动打开 http://localhost:63342/ → 左侧能看到「正确登录」场景 ✅/❌。


9️⃣ 归档:把「需求+代码+报告」一起上锁

# 登记本次需求
openspec init               # 第一次才需要
openspec add login.req      # 把需求文件收进 spec 仓库

# 归档(自动打 Tag:v2025-11-03-login)
openspec archive login --tag --yes

以后随时:
git checkout v2025-11-03-login 即可回到「当时的需求 + 代码 + cucumber.json」。


🔟 常用命令速查(收藏即可)

场景 命令
需求→feature claude-code --prompt "把 xxx.req 转成 feature"
feature→代码 claude-code --prompt "按 xxx.feature 生成 StepDef+业务+单测"
本地跑 mvn test
看报告 mvn allure:serve
归档 openspec archive 需求名 --tag --yes

🎉 至此,你已经拥有:

  • 会读需求的 AI(Claude Code)
  • 会管规范的仓库(OpenSpec)
  • 会跑场景的引擎(Cucumber-JVM + JUnit5)
  • 会出漂亮报告的插件(Allure)

下次只要改一行需求描述,再跑一遍相同命令,新代码、新测试、新报告全自动产出!

我们再来看看配合claude skill和subagent来做到更高效的自动化:

结论先行

  1. 把「写需求 → 生成 feature → 生成代码 → 跑测试 → 归档」5 个步骤做成 Claude Skill(/slash 命令) 最轻量,小白 10 分钟就能搭好。
  2. 如果团队并行需求多、还要「同时维护需求文档 + 代码 + 测试」三线,SubAgent 分工 才会显出效率优势;配置时间≈30 min,之后可 5 分钟走完一个完整闭环。
    下面给出「Skill 版」与「SubAgent 版」两套完整可复制的教程,按场景直接挑一种落地即可。

A 面:Skill 版(推荐个人 / 小团队)

适合:需求频率 ≤ 3 个/天,单仓库,无复杂审批流。
目标:一条 /bddlogin 命令完成「需求→feature→代码→测试→报告→归档」。

1 一次性安装(2 分钟)

npm i -g claude-code          # ≥ 0.9.1
npm i -g @fission-ai/openspec # ≥ 1.4

2 建立 Skill 文件

在项目根建目录 .claude/commands/ 并新建 bddlogin.md

---
name: /bddlogin
description: 需求一句话→Cucumber-JVM+JUnit5 跑通并归档
arguments:
  - name: req
    description: 需求描述(中文也行)
    required: true
---

# 步骤 1  需求→feature
echo "{{req}}" > .claude/tmp.req
claude-code -p "把 .claude/tmp.req 转成标准 Gherkin,输出到 src/test/resources/features/login.feature"

# 步骤 2  生成 StepDef + 业务代码 + 单测
claude-code -p "按 login.feature 生成:
 1. src/test/java/steps/LoginStepDef.java
 2. src/main/java/service/LoginService.java
 3. src/test/java/service/LoginServiceTest.java
 4. 保证 mvn test 能过"

# 步骤 3  运行并出报告
mvn test -Dcucumber.plugin="pretty,html:target/cucumber.html,io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm"
mvn allure:report

# 步骤 4  归档
openspec add .claude/tmp.req
openspec archive login --tag --yes

# 清理
rm .claude/tmp.req
echo "✅ 一条链完成!报告:target/site/allure-maven-plugin/index.html"

3 使用(10 秒)

claude
/bddlogin "用户登录:输入正确用户名 admin 密码 123456 后跳到首页"

15 秒后浏览器自动弹出 Allure 报告,Git 历史里也多了一个 v2025-11-03-login 标签。

4 再扩展

login.feature 改成通配 {{feature}}.feature,即可 /bdd xxx 跑任意需求——Skill 文件不变,只换参数。


B 面:SubAgent 版(推荐 5 人+ 团队)

适合:并行需求多、需要「需求 Agent + 代码 Agent + 测试 Agent」同时干活,且有人专职维护规格文档。

1 目录结构(一次建好)

.claude/
 ├─ agents/
 │   ├─ product_manager.md   # 负责维护 OpenSpec
 │   ├─ cucumber_dev.md      # 负责 feature & StepDef
 │   └─ tester.md            # 负责补充单元测试、CI 脚本
 ├─ commands/
 │   └─ full_bdd.md          # 总入口 /fullbdd
 └─ settings.json            # 自动触发钩子

2 定义三个子代理

product_manager.md(需求 Agent)

# Agent: ProductManager
---
context: 独立维护需求文档,把任何一句话扩展成 OpenSpec 标准提案
---
收到需求后:
1. 生成 `openspec/changes/<需求名>/proposal.md`
2. 输出 `tasks.md` 给下游

cucumber_dev.md(Cucumber 编码 Agent)

# Agent: CucumberDev
---
context: 只关注 Cucumber-JVM + JUnit5 代码生成
---
输入:tasks.md + proposal.md
输出:
  - src/test/resources/features/<需求>.feature
  - src/test/java/steps/<需求>StepDef.java
  - src/main/java/service/<需求>Service.java
  - 保证 mvn test 能过

tester.md(测试/CI Agent)

# Agent: Tester
---
context: 补充边界用例、生成 Allure 报告、归档
---
1. 读取 cucumber.json
2. 补充 JUnit5 参数化测试
3. 调用 `mvn allure:report`
4. 执行 `openspec archive <需求> --tag --yes`

3 总入口命令

.claude/commands/fullbdd.md

---
name: /fullbdd
args:
  - name: req
    required: true
---

# 并行启动三个子代理
@parallel ProductManager,CucumberDev,Tester
# 上游需求
@input ProductManager: "{{req}}"
# 下游自动衔接(Agent 内部用 tasks.md 传递)

Claude Code 会自动:

  • 派三个独立上下文窗口 → 互不干扰
  • 等 ProductManager 写完 proposal → 自动触发 CucumberDev
  • CucumberDev 跑通测试 → 自动触发 Tester 归档 & 出报告

4 使用(30 秒)

claude
/fullbdd "作为管理员,我可以在后台禁用某用户,该用户再次登录时应看到‘账号已停用’提示"

回车后去喝杯咖啡,全过程无人值守。大约 2 分钟浏览器弹出 Allure 报告,Git 上已打好 v2025-11-03-disable-user 标签,OpenSpec 里也归档了完整 proposal + cucumber.json。

5 加速技巧

  • .claude/settings.json 加钩子,Push 代码后自动/fullbdd regression,实现「需求-代码-回归」全夜无人值守。
  • cucumber.execution.parallel.enabled=true 写进 junit-platform.properties,并行后 20 条场景只需 30 秒。

如何选型一句话

  • 只想「一句话需求→可运行测试」:用 Skill 10 分钟搞定。
  • 还要「多人并行、需求-实现-测试三线并进」:上 SubAgent,一次配置,永久 5 分钟闭环。

照着上面 A/B 面抄作业,你就能把「Claude Code + OpenSpec + Cucumber-JVM + JUnit5」整条链路压成一条命令,开发自测归档一键完成。

posted @ 2025-11-03 21:57  gyc567  阅读(22)  评论(0)    收藏  举报