为 Spring Boot 项目执行构建、测试、安全扫描与变更审查的发布前校验流程
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "springboot-verification" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/tr/skills/springboot-verification/SKILL.md 2. 保存为 ~/.claude/skills/springboot-verification/SKILL.md 3. 装好后重载技能,告诉我可以用了
请对这个 Spring Boot 项目执行发布前校验:先构建项目,再运行静态分析、单元测试与覆盖率统计,然后做依赖与代码安全扫描,最后基于当前分支与主分支的 diff 做风险审查,并输出按严重级别排序的问题清单和发布建议。
一份包含构建结果、测试覆盖率、安全风险、diff 审查结论和是否建议发布的综合报告。
请检查这个 Spring Boot 功能分支是否适合提交 PR:执行构建、代码静态检查、相关测试与覆盖率分析,扫描常见安全问题,并重点审查本次提交的 diff,指出可能的空指针、事务、异常处理和配置风险。
一份面向 PR 的检查结果,列出阻塞合并的问题、改进建议和需要补充的测试点。
这个 Spring Boot 项目的校验流程失败了。请分析构建日志、测试失败信息、覆盖率结果和安全扫描输出,定位根因,按优先级给出修复建议,并说明修复后应重新验证哪些步骤。
一份故障诊断与修复方案,包含根因分析、优先级排序和后续验证清单。
PR'lardan önce, büyük değişikliklerden sonra ve deployment öncesi çalıştırın.
mvn -T 4 clean verify -DskipTests
# veya
./gradlew clean assemble -x test
Build başarısız olursa, durdurun ve düzeltin.
Maven (yaygın plugin'ler):
mvn -T 4 spotbugs:check pmd:check checkstyle:check
Gradle (yapılandırılmışsa):
./gradlew checkstyleMain pmdMain spotbugsMain
mvn -T 4 test
mvn jacoco:report # 80%+ kapsam doğrula
# veya
./gradlew test jacocoTestReport
Rapor:
Mock bağımlılıklarla izole olarak servis mantığını test edin:
@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);
}
}
H2 yerine gerçek bir veritabanına karşı test edin:
@SpringBootTest
@Testcontainers
class 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");
}
}
Tam Spring context ile controller katmanını test edin:
@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());
}
}
…
通过双评审智能体对结果进行对抗式校验,提升输出发布前的可靠性
为 Quarkus 项目执行发布前验证闭环,涵盖构建、测试、扫描与差异审查。