絮絮叨叨

  • 在学习maven的生命周期和插件时,我们知道test阶段是与maven-surefire-plugin:test绑定的。

  • 想要创建单元测试,必须添加junit依赖,并且依赖范围是test。

    <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
    </dependencies>
    
  • 如果仔细想想,为啥其他的生命周期阶段不用引入依赖呢,比如package就没有说要引入一个具有打包功能的依赖啊

  • 其实,这是因为maven-surefire-plugin插件并不是一个单元测试框架,而是在执行test阶段的任务时,主动调用其他单元测试框架(如junit)来执行测试用例。

  • 因此,maven需要与其他单元测试框架集成,才能执行单元测试并生成丰富的测试报告。

  • 这也是为什么,需要在pom文件中显式声明junit依赖的原因。

  • 当然,除了junit,TestNG也是比较成熟的单元测试框架。maven能与junit和TestNG集成,从而实现单元测试。

1. 基于junit学习maven test

1.1 一些约定

执行mvn test时,会自动执行src/test/java目录下,所有满足以下命名的测试类:

  1. **/Test*.java: 任何子目录下、命名以Test开头的java类
  2. **/*Test.java:任何子目录下、命名以Test结尾的java类
  3. **/*TestCase.java:任何子目录下、命名以TestCase结尾的java类
  • 这也是为什么我之前喜欢使用Test*命名的测试类,仍然能正常执行单元测试的原因

养成习惯,执行测试时,加上clean !!!

  • 加上clean,会清除target目录的class和resource数据,重新进行代码编译

  • 虽然maven会智能检测是否存在代码变化,为了保险起见,还是手动加上clean比较好

  • 所以使用maven进行测试时,基础的命令为

    mvn clean test
    

1.2 跳过测试

  • 我们在执行项目打包或安装时,总有各种各样的理由跳过单元测试。
  • 跳过测试有三种方法:

-DskipTests

  • 在执行包含test阶段的maven命令时,可以通过添加-DskipTests来跳过单元测试。

  • 更准确的说,是跳过test阶段,但testCompile阶段仍会执行。

    [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-tests ---
    ...
    [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-tests ---
    [INFO] Tests are skipped.
    [INFO]
    

-Dmaven.test.skip=true

  • 之前在介绍如何查看插件信息时,以maven-surefire-plugin插件的test目标为例,介绍了插件目标的参数skip,包括该参数对应的命令行参数maven.test.skip

  • 该参数不仅会跳过test阶段,还会跳过testCompile阶段

    [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-tests ---
    [INFO] Not compiling test sources
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-tests ---
    [INFO] Tests are skipped.
    

-Dtest + -DfailIfNoTests=false

  • -Dtest-DfailIfNoTests选项结合使用,可以达到跳过单元测试的目的

-Dtest选项

  • -Dtest选项用于指定测试类型,且需要指定至少一个测试类。

  • -Dtest用法一:指定一个或多个测试类

    # 指定一个测试类
    mvn clean test -Dtest=HelloTest# 指定多个测试类,测试类之间使用逗号分隔
    mvn test -Dtest=HelloTest,PrintTest
    
  • -Dtest用法二:使用正则表达式,灵活指定测试类

    mvn clean test -Dtest=Random*Test
    
  • -Dtest用法三:正则表达式和明确指定相结合

    mvn clean test -Dtest=Random*Test,HelloTest
    
  • 如果使用-Dtest,却不为其指定任何测试类,执行会报错

    mvn clean test -Dtest
    
  • 报错信息如下,提示使用-DfailIfNoTests=false来忽略 No tests were executed!错误

巧妙跳过测试