当前位置: 首页 > news >正文

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

JUnit in Action, Third Edition

《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-samplingMaven 骨架项目。

上述命令的各参数含义:

  • -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 通过 BOMBill 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 的最终效果:

Fig10.1

10.3 pom.xml 中的主要标签

从第二行开始,该项目的所有 Maven 配置都在 <project> 标签内,起到 唯一标识作用 的是这三个标签的组合(相当于位置坐标):

  • groupId:通常充当文件系统 Java 包的分组标识;
  • artifactId:项目的名称标识;
  • version:构件当前的版本号。带 SNAPSHOT 后缀标识的表明该构件还处于开发模式,尚未对外发布。

其他常见的标签还有 <modelVersion>,它是 POM 模型的版本号,一般为 4.0.0;以及 <dependencies> 标签,用于描述项目需要的所有依赖包。

此外也可以在 <project> 标签下补充其他增强项目元信息的标签,例如 developersdescriptionorganizationinceptionYear 等:

<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 标签不是完全自定义的

MavenPOM 规范定义了一系列标准元素,不是完全自定义的。通常是为后期发布该构件设计,以便在发布后联系到相关维护人员。常见的选填标签有:

  • 项目基本信息:

    <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>
    

(未完待续)

http://www.dtcms.com/a/540347.html

相关文章:

  • SQLite 核心知识点讲解
  • JAiRouter v1.1.0 发布:把“API 调没调通”从 10 分钟压缩到 10 秒
  • 自建网站如何赚钱c2c模式为消费者提供了便利和实惠
  • Lua-编译,执行和错误
  • Lua与LuaJIT的安装与使用
  • 数独生成题目lua脚本
  • 影响网站加载速度wordpress获得当前文章的相关文章
  • Hive 技术深度解析与 P7 数据分析架构师多行业全场景实战课程合集(视频教程)
  • 嘉兴高端网站建设公司网络安全等级保护
  • HOW - localstorage 超时管理方案
  • java如何判断上传文件的类型,不要用后缀名判断
  • 【Linux】系统备份与恢复:rsync 与 tar 的完整使用教程
  • ROS2系列(3):第一个C++节点
  • zookeeper是什么
  • 构建“全链路解决方案”:解决集团化医院信创的三重难题
  • 网站建设区别广安市邻水建设局网站
  • 网站中的文字滑动怎么做化妆品网站建设策略
  • 【Netty4核心原理⑮】【Netty 编解码的艺术】
  • PHP-Casbin 在分布式服务中利用 Watcher 做策略同步
  • OCP考试必须培训吗?费用多少?
  • SpringBoot + 百度内容安全实战:自定义注解 + AOP 实现统一内容审核(支持文本 / 图片 / 视频 + 白名单 + 动态开关)
  • 心智结构与组织学习
  • NAS 私有云零信任部署:cpolar 加密访问 + 本地存储,破解安全与便捷难题
  • C++面向对象继承全面解析:不能被继承的类、多继承、菱形虚拟继承与设计模式实践
  • 只做财经的网站厦门高端网站建设公
  • 星宿网站建设系统开发过程中原型有哪些作用
  • Angular 入门项目
  • 架构解析:衡石科技如何基于AI+Data Agent重构智能数据分析平台
  • 云栖实录:重构可观测 - 打造大模型驱动的云监控 2.0 与 AIOps 新范式
  • AR技术如何确保数据准确无误?