Springboot Verification

affaan-m/ECC/docs/zh-CN/skills/springboot-verification

作者 affaan-mef648e01899ba3e8dc6371642deaaf64b4477775无许可证275K 个星标收录于 2026年10月9日更新于 2026年10月9日仓库4天前更新

Spring Boot项目验证循环:构建、静态分析、测试覆盖、安全扫描,以及发布或PR前的差异审查。

AI 生成的概览

为 Spring Boot 项目执行验证循环:构建、静态分析、测试覆盖率、安全扫描与差异审查。

功能
该技能定义了一套分阶段的 Spring Boot 项目验证流程,涵盖构建、静态分析、测试与覆盖率、安全扫描、可选的代码格式化以及差异审查。它提供具体的 Maven 和 Gradle 命令,以及单元测试、Testcontainers 集成测试和 MockMvc API 测试的 Java 示例。最后给出验证报告模板,并建议在长时间会话中重复运行各阶段。
适用场景
适用于为 Spring Boot 服务提交拉取请求之前、重大重构或依赖升级之后,以及面向预发布或生产环境的部署前验证。也适合用于确认测试覆盖率是否达到阈值。
运行要求
需要 Maven 或 Gradle 构建的 Spring Boot 项目,以及相关插件(SpotBugs、PMD、Checkstyle、JaCoCo、OWASP dependency-check、Spotless)和 JDK。集成测试可能需要 Docker 以运行 Testcontainers;差异审查和可选的密钥扫描需要 git。该技能不附带脚本。

Spring Boot 验证循环

在提交 PR 前、重大变更后以及部署前运行。

何时激活

  • 为 Spring Boot 服务开启拉取请求之前
  • 在重大重构或依赖项升级之后
  • 用于暂存或生产环境的部署前验证
  • 运行完整的构建 → 代码检查 → 测试 → 安全扫描流水线
  • 验证测试覆盖率是否满足阈值

阶段 1:构建

bash
mvn -T 4 clean verify -DskipTests# or./gradlew clean assemble -x test

如果构建失败,停止并修复。

阶段 2:静态分析

Maven(常用插件):

bash
mvn -T 4 spotbugs:check pmd:check checkstyle:check

Gradle(如果已配置):

bash
./gradlew checkstyleMain pmdMain spotbugsMain

阶段 3:测试 + 覆盖率

bash
mvn -T 4 testmvn jacoco:report   # verify 80%+ coverage# or./gradlew test jacocoTestReport

报告:

  • 总测试数,通过/失败
  • 覆盖率百分比(行/分支)

单元测试

使用模拟的依赖项来隔离测试服务逻辑:

java
@ExtendWith(MockitoExtension.class)class UserServiceTest {
  @Mock private UserRepository userRepository;  @InjectMocks private UserService userService;
  @Test  void createUser_validInput_returnsUser() {    var dto = new CreateUserDto("Alice", "[email protected]");    var expected = new User(1L, "Alice", "[email protected]");    when(userRepository.save(any(User.class))).thenReturn(expected);
    var result = userService.create(dto);
    assertThat(result.name()).isEqualTo("Alice");    verify(userRepository).save(any(User.class));  }
  @Test  void createUser_duplicateEmail_throwsException() {    var dto = new CreateUserDto("Alice", "[email protected]");    when(userRepository.existsByEmail(dto.email())).thenReturn(true);
    assertThatThrownBy(() -> userService.create(dto))        .isInstanceOf(DuplicateEmailException.class);  }}

使用 Testcontainers 进行集成测试

针对真实数据库(而非 H2)进行测试:

java
@SpringBootTest@Testcontainersclass UserRepositoryIntegrationTest {
  @Container  static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")      .withDatabaseName("testdb");
  @DynamicPropertySource  static void configureProperties(DynamicPropertyRegistry registry) {    registry.add("spring.datasource.url", postgres::getJdbcUrl);    registry.add("spring.datasource.username", postgres::getUsername);    registry.add("spring.datasource.password", postgres::getPassword);  }
  @Autowired private UserRepository userRepository;
  @Test  void findByEmail_existingUser_returnsUser() {    userRepository.save(new User("Alice", "[email protected]"));
    var found = userRepository.findByEmail("[email protected]");
    assertThat(found).isPresent();    assertThat(found.get().getName()).isEqualTo("Alice");  }}

使用 MockMvc 进行 API 测试

在完整的 Spring 上下文中测试控制器层:

java
@WebMvcTest(UserController.class)class UserControllerTest {
  @Autowired private MockMvc mockMvc;  @MockBean private UserService userService;
  @Test  void createUser_validInput_returns201() throws Exception {    var user = new UserDto(1L, "Alice", "[email protected]");    when(userService.create(any())).thenReturn(user);
    mockMvc.perform(post("/api/users")            .contentType(MediaType.APPLICATION_JSON)            .content("""                {"name": "Alice", "email": "[email protected]"}                """))        .andExpect(status().isCreated())        .andExpect(jsonPath("$.name").value("Alice"));  }
  @Test  void createUser_invalidEmail_returns400() throws Exception {    mockMvc.perform(post("/api/users")            .contentType(MediaType.APPLICATION_JSON)            .content("""                {"name": "Alice", "email": "not-an-email"}                """))        .andExpect(status().isBadRequest());  }}

阶段 4:安全扫描

bash
# Dependency CVEsmvn org.owasp:dependency-check-maven:check# or./gradlew dependencyCheckAnalyze
# Secrets in sourcegrep -rn "password\s*=\s*\"" src/ --include="*.java" --include="*.yml" --include="*.properties"grep -rn "sk-\|api_key\|secret" src/ --include="*.java" --include="*.yml"
# Secrets (git history)git secrets --scan  # if configured

常见安全发现

# 检查 System.out.println(应使用日志记录器)grep -rn "System\.out\.print" src/main/ --include="*.java"
# 检查响应中的原始异常消息grep -rn "e\.getMessage()" src/main/ --include="*.java"
# 检查通配符 CORS 配置grep -rn "allowedOrigins.*\*" src/main/ --include="*.java"

阶段 5:代码检查/格式化(可选关卡)

bash
mvn spotless:apply   # if using Spotless plugin./gradlew spotlessApply

阶段 6:差异审查

bash
git diff --statgit diff

检查清单:

  • 没有遗留调试日志(System.out、log.debug 没有防护)
  • 有意义的错误信息和 HTTP 状态码
  • 在需要的地方有事务和验证
  • 配置变更已记录

输出模板

验证报告===================构建:     [通过/失败]静态分析:    [通过/失败] (spotbugs/pmd/checkstyle)测试:     [通过/失败] (X/Y 通过, Z% 覆盖率)安全性:  [通过/失败] (CVE 发现数: N)差异:      [X 个文件变更]
总体:   [就绪 / 未就绪]
待修复问题:1. ...2. ...

持续模式

  • 在重大变更时或长时间会话中每 30–60 分钟重新运行各阶段
  • 保持短循环:mvn -T 4 test + spotbugs 以获取快速反馈

记住:快速反馈胜过意外惊喜。保持关卡严格——将警告视为生产系统中的缺陷。

来源与署名

来源:affaan-m/ECC位于docs/zh-CN/skills/springboot-verification提交ef648e0

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架