8. maven test

絮絮叨叨

  • 在学习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!错误
    在这里插入图片描述

巧妙跳过测试
  • 这时我们可以通过-DfailIfNoTests=false配置,让maven在无测试类时不报错,这样也就可以跳过test阶段了

    mvn clean test -Dtest -DfailIfNoTests=false
    
  • 成功完成测试,并未执行任何测试类

  • 当然,这种跳过不像前两种方式是真正的跳过,而是说在test阶段没有需要测试的类,却不抛出 No tests were executed!错误

  • 这是跳过测试的曲线救国 方法 😂

1.3 如何在pom中包含或排除测试用例
  • 有时,已有的测试类命名并不符合默认规范,但我们又想执行这些测试类

  • 这时,可以在pom文件中通过配置maven-surefire-plugin来实现包含这些测试类

  • 包含指定命名规范的测试类:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  • 有时,有可能不想执行具有某测试类,则配置maven-surefire-plugin来实现排除这些测试类

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <excludes>
                        <exclude>**/*Tests.java</exclude>
                        <exclude>**/HelloTest.java</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
1.4 测试报告
  • maven在测试阶段会生成两个测试报告:
    ① 简单的txt格式的测试报告
    ② 详细的、与junit兼容的xml格式的测试报告

  • 目录是target/surefire-reports
    在这里插入图片描述

  • 测试成功,这些测试报告其实用处不大。 真正的用处是在测试失败是,根据失败信息快速实现代码修复

  • 书中还介绍了,测试覆盖率报告,需要执行以下命令:

    mvn cobertura:cobertura
    
  • 它会在target/site/cobertura目录下生成名为index.html的测试覆盖率报告

1.5 重用测试代码
  • 我们对项目进行打包时,默认打包的是主代码。

  • 但我们可能这样的需求:项目的测试代码中,积累了很多优秀的、供测试类继承的抽象类。若干这些类,可以在其他项目中使用,这样能能大大减少我们复制或重新开发的工作。

  • 因此,我们需要将测试代码也打包

  • package阶段默认绑定的是maven-jar-plugin:jar,用于将主代码打包

  • maven-jar-plugin:test-jar,可以将测试代码打包。

  • 在pom文件将maven-jar-plugin:test-jar目标与package阶段绑定,由于默认阶段是package,因此未指定阶段。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.0</version>
        <executions>
            <execution>
                <goals>
                    <goal>test-jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

2. TestNG

  • 自己并没有使用过TestNG框架,书中对TestNG框架的介绍非常少
  • 与junit不同的是:指定测试集合或测试组

3. 总结

  • 本篇博客,主要与maven的test生命阶段有关
  • maven-surefire-plugin插件实质是一个测试运行器,并非单元测试框架
  • 跳过单元测试的三种方法、如何在pom文件中包含或排除测试类
  • 测试报告、测试覆盖率
  • 如何打包测试代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值