测试开发基础 mvn test | 利用 Maven Surefire Plugin 做测试用例基础执行管理

本文介绍了如何使用Maven-Surefire-Plugin在自动化测试场景中,通过命令行指定执行特定的测试类和方法。内容包括使用Maven命令行执行单个或多个测试类,使用通配符匹配测试类,以及指定测试方法。此外,还提到了Maven的失败重试功能以及在Junit5中遇到的不支持问题。最后展示了如何在pom.xml中配置排除不执行的测试类。

在测试工作场景中,经常会遇到下面的问题:

  • 1、执行自动化测试用例的时候,只想指定某个测试类,或者某个方法,又或者某一类用例等,怎么办?
  • 2、想要和 Jenkins 一起进行持续集成,可是用例又不可能在 IDE 里面执行,怎么办?
    这个时候就需要 Maven 登场了,利用 Maven 的Maven-Surefire-Plugin插件可以帮助我们完成上述的目标!它可以通过命令行的形式来管理我们要执行的用例。
  • Maven 3.x +
  • JDK 1.7 +
    对于我们测试来说,常接触的几个用例管理框架都支持(这里指 Java 技术栈)
  • Using TestNG
  • Using JUnit 5 Platform
  • Using JUnit
    常用到的 Junit5 相关依赖:
    Maven-Surefire-Plugin:
    指定编译 JDK 版本:
    现有如下结构的测试类,在此基础上进行演示:
    使用 mvn test 命令可以一次性执行所有的用例,执行完之后可以看到控制台中的结果:
    执行完之后我们打开 target,所有 maven 执行完的结果都会在 target 目录下的 surefire-reports 下:
    其中:
  • xml:可用于 Jenkins 解析,文件与测试类对应,里面的内容代表了测试用例的执行情况。
  • txt:测试结果的命令行输出。
    使用 mvn -Dtest=${TestClass} 命令可以指定运行测试类,例如
    我这里要运行 MavenDemo1Test 下的用例,就可以使用 mvn -Dtest=MavenDemo1Test test:
    import org.junit.jupiter.api.Test; ¨K31K
    执行测试:
    $ mvn -Dtest=MavenDemo1Test test
    测试结果:
    我们还可以以 逗号 分隔指定多个测试类执行,例如这里我想执行 MavenDemo1Test 和 MavenDemo2Test:
    mvn -Dtest=MavenDemo1Test,MavenDemo2Test test
    测试结果:
    我们可以使用通配符来匹配要执行的测试类,例如这里我利用通配符同时指定测试类 MavenDemo1Test 和 MavenDemo2Test:
    $ mvn -Dtest=MavenDemoTest test
    测试结果:
    当然,上述的测试方式组合起来也是可以的,例如这里利用通配符执行 MavenDemo1Test 和 MavenDemo2Test,再精确指定执行 MavenPackageDemoTest:
    $ mvn -Dtest=MavenDemo
    Test,MavenPackageDemoTest test
    测试结果:
    除了可以指定执行测试类,还可以指定测试方法,测试类 和 测试方法 之间用 # 隔开即可例如这个我想要指定执行 MavenDemo1Test 中的 test2 方法:
    $ mvn -Dtest=MavenDemo1Test#test2 test
    测试结果:
    方法依然可以使用通配符,例如这里要执行 MavenPackageDemoTest 中的方法 MavenPackageTest,可以匹配以 Test 结尾:
    $ mvn -Dtest=MavenPackageDemoTest#*Test test
    测试结果:
    mvn 也可以指定某个测试类下面的多个方法,使用+号分隔方法,例如指定 MavenDemo1Test 下的方法 test1() 和 test2()。
    $ mvn -Dtest=MavenDemo1Test#test1+test2 test
    mvn 还提供了失败重试,设置失败重试的次数,当用例执行时直到用例成功或者失败次数达到上限,命令如下:
    mvn -Dsurefire.rerunFailingTestsCount=2 test
    可是遗憾的是,此功能只支持 Junit4,官网给出的说明如下:
    在 Junit5 中,我们其实是可以利用 @RunWith(JUnitPlatform.class) 运行测试套件的,具体内容可参考文章:[Junit5简介、构成、新特性及基本使用-常用注解、套件执行] 。
    然而当我们使用mvn来执行套件时,
    套件:
    mvn 命令:
    mvn -Dtest=TestSuite test
    会出现如下报错:
    据说是因为 surefire 插件的版本问题,当切换到 2.19 版本的时候,套件执行成功了,可是 mvn test 命令又失败了,这显然不是我们想要的结果,于是乎开始了 Google 之路。。。
    最终找到了一个相对合理的解释!抱歉,又要失望了,Google 到别人的解释如下(已翻译完成~):
    简单的说就是 surefire 插件暂时还不支持在 Junit5 下执行继承至 Junit4 的 @RunWith,所以还是需要有心人出来解决这个问题才行了~~
    例如这里我默认只想执行 MavenPackageDemoTest ,而另外两个 MavenDemo 开头的测试类我都不想执行,这个时候可以在 pom 中做如下配置,在 surefire 插件下添加 configuration:
    执行 mvn test ,查看结果:
    从结果中可以看到仅仅执行了我们默认指定的 MavenPackageDemoTest 中的 case,其余以 MavenDemo 开头的测试类均未被执行。
    这里介绍了 maven-surefire-plugin 插件在测试执行中的一些常见用法,还有很多其他的用法,例如:
  • 使用很复杂的格式匹配
  • 控制在不同级别上的多线程和多进程执行
    后续将慢慢研究补充,有兴趣也可直接参考官网学习。

推荐霍格沃兹 《Python 测试开发实战进阶》班,可能是业界最具深度、最贴近大厂一线实践的测试开发课程。

14 期班热招中
4 个月由浅入深,强化集训,测试大咖思寒领衔主讲,授之以渔,通过 10+ 企业级项目实战演练,带你一站式掌握 BAT 测试开发工程师必备核心技能(对标阿里巴巴P6+,挑战年薪50W+)!学员直推 BAT 名企测试经理,普遍涨薪 50%+!

提升自己的核心竞争力吧

<think>好的,用户的问题是“mvn test执行测试用例的原因及解决方案”。首先,我需要分析可能的原因,并给出对应的解决方案。根据提供的引用资料,特别是引用[1]和引用[2],以及常见的Maven使用经验,可能有几个原因导致测试用例执行。 首先,测试类命名不符合Maven Surefire Plugin的默认约定。Surefire默认执行符合**/Test*.java、**/*Test.java、**/*Tests.java、**/*TestCase.java的类。如果用户的测试类命名不符合这些模式,Surefire不会执行它们。这时候需要检查测试类名称是否符合规范,或者在pom.xml中配置includes来包含其他命名模式。 其次,测试方法中存在返回值。根据引用[1],TestNG测试方法如果有返回值(即非void),会导致测试用例不被执行。需要确保所有测试方法的返回类型是void,并且没有参数。例如,将public String testMethod()改为public void testMethod()。 接下来,测试配置问题。比如testng.xml文件路径不正确,或者maven-surefire-plugin未正确配置。用户需要检查testng.xml的位置是否在src/test/resources,并在pom.xml中正确配置suiteXmlFiles路径。同时,确保使用了正确版本的插件。 另外,跳过测试的配置也可能导致问题。比如命令行参数-DskipTests=true或者pom.xml中配置了skipTests为true,这会跳过测试执行。需要检查这些配置项,并确保它们设为false。 还有依赖冲突或版本问题。比如Maven Surefire Plugin版本过旧或与其他插件冲突。建议升级到最新稳定版本,并排除冲突的依赖。 最后,测试代码本身的问题,比如没有正确的TestNG或JUnit注解,或者测试方法为非public。需要检查测试类是否有@Test注解,方法是否为public void,以及是否正确导入测试框架的注解。 在解决方案部分,需要分步骤说明,包括检查命名规范、修正测试方法签名、配置插件、检查跳过配置、处理依赖冲突等。同时,引用相关的资料来支持建议,比如引用[1]提到的测试方法返回值问题,引用[2]关于Surefire Plugin的配置,以及引用[3]中的编码问题(虽然用户的问题不是乱码,但可能相关)。 可能需要提醒用户检查控制台输出是否有错误信息,比如编译错误或初始化错误,这些也会导致测试未执行。另外,建议用户运行mvn test -X获取详细日志,帮助诊断问题。 总结起来,需要从多个角度分析可能的原因,并逐一提供解决方案,同时结合用户提供的引用资料,确保回答准确且有依据。</think>### Maven执行测试用例执行的原因及解决方案 #### 一、常见原因分析 1. **测试类命名不符合默认约定** Maven Surefire Plugin默认仅执行符合特定命名规则的测试类,例如:`**/Test*.java`、`**/*Test.java`、`**/*Tests.java`、`**/*TestCase.java`[^2]。若测试类命名不符合这些模式,会导致用例未执行。 2. **测试方法中存在返回值** TestNG框架要求测试方法必须为`void`类型且无参数。若方法包含返回值(如`public String testMethod()`),则用例会被直接跳过[^1]。 3. **测试配置问题** - `testng.xml`文件路径错误或未在`pom.xml`中正确配置。 - `maven-surefire-plugin`插件未正确声明或版本过低。 4. **跳过测试的配置生效** 若通过`-DskipTests=true`参数或`pom.xml`中配置`<skipTests>true</skipTests>`,会直接跳过所有测试。 5. **依赖冲突或版本问题** Maven插件版本与其他依赖冲突,或测试框架(如TestNG/JUnit)版本不兼容。 --- #### 二、解决方案 ##### 1. 检查测试类命名规范 - **操作步骤**: 重命名测试类,例如`UserServiceTest.java`或`TestLogin.java`。 若需自定义命名规则,在`pom.xml`中配置`includes`: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <configuration> <includes> <include>**/*Spec.java</include> <!-- 自定义命名模式 --> </includes> </configuration> </plugin> ``` ##### 2. 修正测试方法签名 - **示例**: ```java // 错误:方法有返回值 @Test public int testCalculation() { ... } // 正确:返回类型改为void @Test public void testCalculation() { ... } ``` 需确保所有测试方法均为`public void`且无参数。 ##### 3. 配置测试插件 - **TestNG配置**: 若使用`testng.xml`,需在`pom.xml`中指定路径: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <configuration> <suiteXmlFiles> <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile> </suiteXmlFiles> </configuration> </plugin> ``` ##### 4. 检查跳过测试的配置 - **命令行**: 执行命令时避免使用`-DskipTests`或`-Dmaven.test.skip=true`。 正确命令:`mvn test -DskipTests=false`。 - **POM文件检查**: 确保`<skipTests>`标签值为`false`: ```xml <configuration> <skipTests>false</skipTests> </configuration> ``` ##### 5. 处理依赖冲突 - **升级插件版本**: 将`maven-surefire-plugin`升级至最新稳定版本(如3.0.0-M7)。 - **排除冲突依赖**: 使用`<exclusions>`排除冲突的库: ```xml <dependency> <groupId>com.example</groupId> <artifactId>conflicting-lib</artifactId> <exclusions> <exclusion> <groupId>org.junit</groupId> <artifactId>junit-legacy</artifactId> </exclusion> </exclusions> </dependency> ``` --- #### 三、验证方法 1. **查看控制台输出** 执行`mvn test`后,检查是否输出`Tests run: N`,确认测试实际执行。 2. **启用调试模式** 运行`mvn test -X`查看详细日志,定位具体错误(如类未加载、配置错误等)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值