Springboot Verification

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

Bucle de verificación para proyectos Spring Boot: build, análisis estático, pruebas con cobertura, escaneos de seguridad y revisión de diff antes del lanzamiento o PR.

AI 生成的概览

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

功能
为 Spring Boot 项目提供分阶段的 PR 前与部署前验证循环,涵盖构建、静态分析、带覆盖率的测试、安全扫描和差异审查。它给出具体的 Maven 与 Gradle 命令,以及单元测试、Testcontainers 集成测试和 MockMvc API 测试的 Java 示例。最后提供输出报告模板和重复运行循环的建议。
适用场景
适用于为 Spring Boot 服务提交拉取请求之前、重大重构或依赖升级之后,或面向预发布与生产环境的部署前验证。也适合用于确认测试覆盖率是否达到阈值。
运行要求
需要 Maven 或 Gradle 构建的 Spring Boot 项目,以及可选的 SpotBugs、PMD、Checkstyle、JaCoCo、Spotless、OWASP dependency-check 和 git-secrets 等插件。Testcontainers 示例需要 Docker。不附带脚本,仅为说明文档。

Bucle de Verificación Spring Boot

Ejecutar antes de PRs, después de cambios importantes y antes del despliegue.

Cuándo Activar

  • Antes de abrir un pull request para un servicio Spring Boot
  • Después de refactorizaciones importantes o actualizaciones de dependencias
  • Verificación previa al despliegue para staging o producción
  • Ejecutar el pipeline completo de build → lint → test → escaneo de seguridad
  • Validar que la cobertura de pruebas cumpla los umbrales

Fase 1: Build

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

Si el build falla, detener y corregir.

Fase 2: Análisis Estático

Maven (plugins comunes):

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

Gradle (si está configurado):

bash
./gradlew checkstyleMain pmdMain spotbugsMain

Fase 3: Pruebas + Cobertura

bash
mvn -T 4 testmvn jacoco:report   # verificar cobertura 80%+# o./gradlew test jacocoTestReport

Reporte:

  • Total de pruebas, pasadas/fallidas
  • % de cobertura (líneas/ramas)

Pruebas Unitarias

Probar la lógica del servicio en aislamiento con dependencias mockeadas:

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);  }}

Pruebas de Integración con Testcontainers

Probar contra una base de datos real en lugar de 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");  }}

Pruebas de API con MockMvc

Probar la capa controller con el contexto completo de 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());  }}

Fase 4: Escaneo de Seguridad

bash
# CVEs de dependenciasmvn org.owasp:dependency-check-maven:check# o./gradlew dependencyCheckAnalyze
# Secretos en código fuentegrep -rn "password\s*=\s*\"" src/ --include="*.java" --include="*.yml" --include="*.properties"grep -rn "sk-\|api_key\|secret" src/ --include="*.java" --include="*.yml"
# Secretos (historial de git)git secrets --scan  # si está configurado

Hallazgos Comunes de Seguridad

bash
# Verificar System.out.println (usar logger en su lugar)grep -rn "System\.out\.print" src/main/ --include="*.java"
# Verificar mensajes de excepción en bruto en respuestasgrep -rn "e\.getMessage()" src/main/ --include="*.java"
# Verificar CORS comodíngrep -rn "allowedOrigins.*\*" src/main/ --include="*.java"

Fase 5: Lint/Formato (compuerta opcional)

bash
mvn spotless:apply   # si se usa el plugin Spotless./gradlew spotlessApply

Fase 6: Revisión de Diff

bash
git diff --statgit diff

Lista de verificación:

  • Sin logs de depuración residuales (System.out, log.debug sin guardias)
  • Errores y códigos HTTP con significado
  • Transacciones y validación presentes donde se necesitan
  • Cambios de configuración documentados

Plantilla de Salida

REPORTE DE VERIFICACIÓN=======================Build:      [PASS/FAIL]Estático:   [PASS/FAIL] (spotbugs/pmd/checkstyle)Pruebas:    [PASS/FAIL] (X/Y pasadas, Z% cobertura)Seguridad:  [PASS/FAIL] (hallazgos CVE: N)Diff:       [X archivos modificados]
General:    [LISTO / NO LISTO]
Problemas a Corregir:1. ...2. ...

Modo Continuo

  • Volver a ejecutar las fases ante cambios significativos o cada 30–60 minutos en sesiones largas
  • Mantener un bucle corto: mvn -T 4 test + spotbugs para retroalimentación rápida

Recuerda: La retroalimentación rápida supera las sorpresas tardías. Mantener la compuerta estricta — tratar las advertencias como defectos en sistemas de producción.

来源与署名

来源:affaan-m/ecc位于docs/es/skills/springboot-verification提交ef648e0

许可证: 无许可证

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

举报或申请下架