【JUnit实战3_18】第十章:用 Maven 3 运行 JUnit 测试(上)

《JUnit in Action》全新第3版封面截图
写在前面
结束了前面两个大板块共九章的内容,从第十章开始,全书将进入另一个新的板块,重点探讨构建和集成的相关话题。五年过去了,软件构建和集成的热度还在逐年攀升。这不仅得益于作者对技术趋势的高敏感度,更源于各类基于云平台云原生应用技术的日渐成熟与完善,而这背后几乎都有 AI 技术浪潮的推波助澜。相信 AI 还会进一步深刻重塑今后的软件开发范式,倒逼企业组织形态的深刻变革。暗潮涌动下,一个崭新的时代即将破晓。此刻正处在风口浪尖的每一位开发者们:你准备好了吗?
文章目录
- 第十章 用 Maven 3 运行 JUnit 测试
- 10.1 Maven 解决的痛点问题
- 10.2 从命令行新建一个 Maven 项目
- 10.3 pom.xml 中的主要标签
第十章 用 Maven 3 运行 JUnit 测试
本章概要
- 从零创建
Maven项目- 用
JUnit 5测试Maven项目Maven插件的用法Maven Surefire插件的用法
第 10 ~ 13 章为本书的第三个模块,重点探讨 JUnit 5 与其他工具的协同。其中,本章介绍 Maven,第 11 章介绍 Gradle,第 12 章介绍 JUnit 5 与当前主流 IDE 的集成,第 13 章精讲持续集成工具。学习本章需结合附录 A,以加深对 Maven 基础概念和基本流程的了解。对熟悉 Maven 的开发者而言,本章难度不大,也可以作为复习材料查漏补缺。
10.1 Maven 解决的痛点问题
Maven 官网:https://maven.apache.org/。发音:/ˈmeɪvn/。
主要有两个:
- 定义了软件的基础构建方式;
- 对项目依赖实现了统一管理。
Maven 遵循 约定优于配置(Convention Over Configuration) 的设计原则,始终认为一个项目的构建系统应当尽可能简单好用,能让开发者从繁琐枯燥又严格的各种配置规则中解放出来,转而只对个别特殊情况进行说明。Maven 用一个 pom.xml 文件记录项目配置,包含项目的元信息、外部依赖、所需插件等。
约定优于配置的原则从 Maven 构建的文件夹结构体现出来,例如:
src/main/java/:存放Java源文件;src/test/java:存放项目的各类单元测试文件;target/:项目构建的根目录。
10.2 从命令行新建一个 Maven 项目
本地安装 Maven 后,可以从命令行创建一个默认的 Maven 项目:
首先确认 Maven 的版本:
> mvn --version
Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b)
Maven home: D:\apache-maven-3.9.11
Java version: 11.0.10, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-11.0.10
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
然后新建一个示例文件夹 C:\junitbook,并在该目录下运行如下命令:
> mvn archetype:generate -DgroupId="com.manning.junitbook" -DartifactId="maven-sampling" -DarchetypeArtifactid="maven-artifact-mojo"
若中途遇到停顿,一律按回车键(保持默认配置)继续,最后就会得到一个名为 maven-sampling 的 Maven 骨架项目。
上述命令的各参数含义:
-DgroupId=com.manning.junitbook:定义变量groupId,变量值为com.manning.junitbook。通常使用公司或组织的反向域名命名规则;-DartifactId=maven-sampling:定义变量artifactId,变量值为maven-sampling。这是项目的 构件 ID,也是项目的唯一标识符,通常为项目名称;-DarchetypeArtifactId=maven-archetype-mojo:定义变量archetypeArtifactId,变量值为maven-archetype-mojo。这是在指定要使用的archetype模板,maven-archetype-mojo是一个专门用于创建Maven项目的模板,其中预设了Maven项目的目录结构和必要的依赖项。
和原书不同的是,Maven 版本越新,生成的默认依赖版本越新。例如实测时的 JUnit 版本就升级到了 5.11:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.manning.junitbook</groupId><artifactId>maven-sampling</artifactId><version>1.0-SNAPSHOT</version><name>maven-sampling</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.release>17</maven.compiler.release></properties><dependencyManagement><dependencies><dependency><groupId>org.junit</groupId><artifactId>junit-bom</artifactId><version>5.11.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><scope>test</scope></dependency><!-- Optionally: parameterized tests support --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><scope>test</scope></dependency></dependencies><!-- snip -->
</project>
上述配置中,dependencyManagement 通过 BOM(Bill of Materials)的方式管理了 JUnit 的版本;当中的 junit-bom 是一个特殊的 POM 文件,里面定义了所有 JUnit 相关组件的版本号。因此,实际 JUnit 各依赖项的版本都可以省略不写,统一为 junit-bom 指定的版本。
此外,实测过程中,部分插件可能 IDEA 无法顺利解析,比如这个 maven-project-info-reports-plugin 插件:
<build><pluginManagement><plugins><!-- snip --><plugin><artifactId>maven-project-info-reports-plugin</artifactId><version>3.6.1</version></plugin></plugins></pluginManagement>
</build>
首次导入 IDEA 时上述代码 L4 - L5 都有红色报错标记,提示 IDEA 无法解析该插件。
解决办法:从 Maven 线上的 中央仓库 手动导入该插件的 dependency 依赖,重新加载项目触发 IDEA 自动下载:
<dependency><groupId>org.apache.maven.plugins</groupId><artifactId>maven-project-info-reports-plugin</artifactId><version>3.6.1</version>
</dependency>
下载成功后,删除该 dependency 节点即可(慎重升级到最新版 3.9.0,后续生成文档时有兼容性报错)。
将该骨架项目导入 IDEA 的最终效果:

10.3 pom.xml 中的主要标签
从第二行开始,该项目的所有 Maven 配置都在 <project> 标签内,起到 唯一标识作用 的是这三个标签的组合(相当于位置坐标):
groupId:通常充当文件系统Java包的分组标识;artifactId:项目的名称标识;version:构件当前的版本号。带SNAPSHOT后缀标识的表明该构件还处于开发模式,尚未对外发布。
其他常见的标签还有 <modelVersion>,它是 POM 模型的版本号,一般为 4.0.0;以及 <dependencies> 标签,用于描述项目需要的所有依赖包。
此外也可以在 <project> 标签下补充其他增强项目元信息的标签,例如 developers、description、organization、inceptionYear 等:
<developers><developer><name>Catalin Tudose</name><id>ctudose</id><organization>Manning</organization><roles><role>Java Developer</role></roles></developer><!-- snip -->
</developers>
<description>“JUnit in Action III” book, the sample project for the “Running JUnittests from Maven” chapter.
</description>
<organization><name>Manning Publications</name><url>http://manning.com/</url>
</organization>
<inceptionYear>2019</inceptionYear>
这些补充内容不仅能让 pom.xml 更加完善,后期构件项目网站时也会包含这些关键信息。
POM 标签不是完全自定义的
Maven的POM规范定义了一系列标准元素,不是完全自定义的。通常是为后期发布该构件设计,以便在发布后联系到相关维护人员。常见的选填标签有:
项目基本信息:
<name>maven-sampling</name> <description>项目描述信息</description> <url>http://www.example.com</url>项目组织信息:
<organization><name>公司/组织名称</name><url>组织官网</url> </organization>开发者信息:
<developers><developer><id>developer-id</id><name>开发者姓名</name><email>email@example.com</email><url>http://developer-website.com</url><organization>所属组织</organization><organizationUrl>组织网址</organizationUrl><roles><role>architect</role><role>developer</role></roles><timezone>+8</timezone></developer> </developers>项目许可信息:
<licenses><license><name>Apache License, Version 2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0.txt</url><distribution>repo</distribution></license> </licenses>源码管理相关:
<scm><connection>scm:git:https://github.com/username/repo.git</connection><developerConnection>scm:git:https://github.com/username/repo.git</developerConnection><url>https://github.com/username/repo</url> </scm>问题追踪系统:
<issueManagement><system>GitHub Issues</system><url>https://github.com/username/repo/issues</url> </issueManagement>
(未完待续)
