
skipTests 只是止痛药病根多在这四处项目引入org.junit.Test写单测之后无论mvn package还是mvn install都报这样一段错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project xxx: There are test failures. Please refer to .../target/surefire-reports for the individual test results.很多人的第一反应是搜“怎么跳过测试”然后在 pom 里加上skipTests。报错消失皆大欢喜。但我的观点是**这条报错的意思不是 Maven 坏了而是“测试跑了而且失败了”。**直接跳过等于把报警器拆掉问题还在原地。正确的顺序是先读报告修病因实在要跳再跳而且要跳得有节制。01第一步读懂报错去看报告报错里已经告诉你该去哪看target/surefire-reports。里面有每个测试类的.txt和.xml报告打开失败的那个看第一个异常和它的Caused by。也可以只运行失败的测试缩小范围mvn test -DtestCouponApplicationTests提示里提到的 dump 文件通常只在 JVM 异常退出时才有大多数情况下没有不必在意。02四类最常见的病根病根典型症状怎么处理Spring 上下文加载失败报告里出现Failed to load ApplicationContext、连不上数据库、Nacos、Redis 等测试环境提供依赖或用MockBean、测试专用配置替代外部依赖真要连外部服务的测试单独归为集成测试JUnit 4 与 JUnit 5 混用Autowired为 null、测试没被执行或直接报错统一框架见下一节环境差异Windows 路径、编码、端口被占用、时区不一致不要写死本机路径和端口用相对路径或随机端口断言真的不成立AssertionError、期望值与实际值不符这是好事说明测试在起作用去修代码或修测试03引入 org.junit.Test 时最容易踩的暗坑JUnit 4/5 混用org.junit.Test是 JUnit 4 的注解。而较新版本的 Spring Boot2.2 及以后里spring-boot-starter-test默认使用的是 JUnit 5它的注解是org.junit.jupiter.api.Test。两套体系的注解、运行器和扩展方式都不一样混着用就会出各种怪问题。有两种干净的做法**做法一推荐**统一用 JUnit 5导入org.junit.jupiter.api.Test在 Spring 测试类上只需要SpringBootTest不再写RunWith。做法二必须保留 JUnit 4 的旧测试就加上 vintage 引擎并在 Spring 测试类上使用RunWith(SpringRunner.class)。!-- 做法二让 JUnit 5 平台也能跑 JUnit 4 的测试 -- dependency groupIdorg.junit.vintage/groupId artifactIdjunit-vintage-engine/artifactId scopetest/scope /dependency具体版本以你项目的 Spring Boot 版本为准。04实在要跳skipTests 可以用但别写死进 pom原文的做法是在 pom 里给 surefire 插件配置skipTeststrue/skipTests。它有效但问题是一旦写进 pom所有人、所有环境包括 CI都永久跳过了测试没人再会发现测试坏了。我的建议是改用命令行临时跳过# 跳过运行测试但仍编译测试代码推荐 mvn clean package -DskipTests # 连测试代码也不编译测试代码本身有编译错误时才用 mvn clean package -Dmaven.test.skiptrue # 测试仍会运行并报告但失败不阻断构建 mvn clean package -Dmaven.test.failure.ignoretrue取本地赶时间打包时用命令行参数临时跳过用完即走。舍别把 skipTests 当作永久方案写进 pomCI 流水线里也应该让测试真跑起来。05原文“场景一”其实不对症原文的场景一建议把skip_maven_deploy置为true。这是 Dubbo 项目自己 pom 里用来控制“部署”环节的属性管的是deploy而不是 surefire 的测试。本文这类There are test failures的报错改它不会有任何作用。如果你的报错确实来自 Dubbo 的 deploy 环节那是另一个问题需要单独看对应的报错信息别混在一起处理。06一个更长远的做法把单元测试和集成测试分开很多“打包就失败”的根源是把需要连数据库、注册中心的集成测试和纯逻辑的单元测试混在一起一起在package阶段运行。更好的做法是分层单元测试不依赖外部服务速度快在package阶段运行必须通过。集成测试依赖外部环境用独立命名如*IT或标签区分在单独的流水线阶段或通过 Failsafe 插件、Maven Profile 来运行。一句话总结**“There are test failures”是在告诉你测试没通过而不是让你去找跳过测试的办法。**先读报告再按四类病根逐个排查确实要跳过用命令行临时跳别把它写死进 pom。说明插件版本与命令参数以你使用的 Maven、Surefire 和 Spring Boot 版本为准。