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 從公開儲存庫中收錄這些內容。

檢舉或申請下架