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

广电基础设施建设官方网站WordPress主题分页代码

广电基础设施建设官方网站,WordPress主题分页代码,徐州双语网站制作,网页制作的收获JUnit 5 测试发现机制详解 JUnit 5 的测试发现机制是框架的核心功能之一,负责识别测试类、方法和其他可执行元素,并构建出可执行的测试计划。该机制通过模块化设计支持高度扩展性,允许开发者自定义测试发现规则。以下是其工作原理的详细解析…

JUnit 5 测试发现机制详解

JUnit 5 的测试发现机制是框架的核心功能之一,负责识别测试类、方法和其他可执行元素,并构建出可执行的测试计划。该机制通过模块化设计支持高度扩展性,允许开发者自定义测试发现规则。以下是其工作原理的详细解析:


一、测试发现的核心组件
组件作用
TestEngine定义测试引擎的接口,负责发现和执行特定类型的测试(如 Jupiter、Vintage)。
DiscoverySelector指定测试发现的来源(如类名、包名、方法名、URI 等)。
DiscoveryFilter过滤不需要的测试元素(如按标签、包名排除)。
TestDescriptor描述测试的层次结构(如测试类、方法、动态测试),形成树状结构。

二、测试发现的完整流程
1. 触发测试发现
  • 入口:通过 Launcher API 或构建工具(如 Maven Surefire)启动测试。
  • 请求构建:创建 LauncherDiscoveryRequest,包含 DiscoverySelectorDiscoveryFilter
    LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request().selectors(selectPackage("com.example.tests")).filters(includeClassNamePatterns(".*Test")).build();
    
2. 引擎发现测试
  • 调用 TestEngine:每个注册的 TestEngine(如 JupiterTestEngine)处理发现请求。
  • 生成 TestDescriptor:引擎解析测试类和方法,构建树状结构:
    EngineDescriptor (root)
    └─ ClassTestDescriptor (com.example.MyTest)├─ MethodTestDescriptor (test1)└─ MethodTestDescriptor (test2)
    
3. 过滤与修剪
  • 应用 DiscoveryFilter:根据标签、包名等过滤 TestDescriptor
  • 修剪无用节点:移除无测试方法的空类或无效分支。
4. 生成测试计划
  • TestPlan 结构:将 TestDescriptor 树转换为可执行的 TestPlan,供后续执行阶段使用。

三、关键源码解析
1. TestEngine 接口
  • 核心方法
    public interface TestEngine {// 发现测试并生成 TestDescriptorTestDescriptor discover(EngineDiscoveryRequest request, UniqueId uniqueId);// 执行测试void execute(ExecutionRequest request);
    }
    
  • 实现类
    • JupiterTestEngine:处理 @Test@ParameterizedTest 等 JUnit 5 注解。
    • VintageTestEngine:兼容 JUnit 4 的 RunnerTestSuite
2. DiscoverySelector 类型
类型作用示例
ClassSelector选择特定类selectClass(MyTest.class)
MethodSelector选择特定方法selectMethod("com.example.MyTest#test1")
PackageSelector选择包及其子包下的所有类selectPackage("com.example")
UriSelector通过 URI 选择测试资源(如文件、目录)selectUri("file:/path/to/tests")
3. TestDescriptor 树结构
  • 根节点EngineDescriptor,代表测试引擎。
  • 中间节点ClassTestDescriptor(测试类)、NestedClassTestDescriptor(嵌套类)。
  • 叶子节点MethodTestDescriptor(测试方法)、DynamicTestDescriptor(动态测试)。

四、扩展测试发现机制
1. 自定义 DiscoverySelector

实现 DiscoverySelector 接口,支持从数据库或配置文件加载测试:

public class DatabaseSelector implements DiscoverySelector {private final List<String> testClasses;public DatabaseSelector(List<String> testClasses) {this.testClasses = testClasses;}// 实现选择逻辑
}
2. 自定义 TestEngine

实现 TestEngine 接口,支持自定义测试类型(如基于 YAML 的测试):

public class YamlTestEngine implements TestEngine {@Overridepublic TestDescriptor discover(EngineDiscoveryRequest request, UniqueId uniqueId) {EngineDescriptor root = new EngineDescriptor(uniqueId, "YAML Engine");// 解析 YAML 文件,生成 TestDescriptorreturn root;}@Overridepublic void execute(ExecutionRequest request) {// 执行 YAML 测试}
}
3. 注册自定义组件

通过 ServiceLoaderLauncherConfig 注册扩展:

// META-INF/services/org.junit.platform.engine.TestEngine
com.example.YamlTestEngine

五、测试发现的优化策略
  1. 懒加载测试类
    避免在发现阶段加载所有类,延迟到执行时加载(通过 ClassSelector 动态解析)。

  2. 并行发现
    使用多线程并行扫描类路径,加快大型项目的测试发现速度。

  3. 缓存机制
    缓存已发现的测试结构,避免重复扫描(需监听类路径变化)。


六、示例:跟踪一个 @Test 方法的发现流程
1. 测试类定义
package com.example;import org.junit.jupiter.api.Test;class MyTest {@Testvoid test1() {}
}
2. 发现过程
  1. Launcher 构建请求:选择包 com.example,过滤类名匹配 .*Test
  2. JupiterTestEngine 处理请求
    • 扫描 com.example 包,找到 MyTest 类。
    • 解析 @Test 注解,生成 MethodTestDescriptor
  3. 构建 TestDescriptor
    EngineDescriptor (junit-jupiter)
    └─ ClassTestDescriptor (MyTest)└─ MethodTestDescriptor (test1)
    
3. 过滤与执行

应用标签过滤后,将 TestPlan 传递给 ExecutionListener 执行。


七、常见问题与调试
1. 测试未被发现
  • 检查点
    • 类/方法是否被正确注解(如 @Test)。
    • DiscoverySelector 是否覆盖目标类。
    • DiscoveryFilter 是否意外排除测试。
2. 调试发现流程
  • 启用日志:添加日志配置(如 Log4j)并设置 org.junit.platform.engineDEBUG 级别。
  • 断点调试:在 JupiterTestEngine.discover() 方法中设置断点,跟踪 TestDescriptor 构建过程。

八、总结

JUnit 5 的测试发现机制通过模块化设计实现了高度灵活性和扩展性:

  • 核心流程:由 TestEngine 驱动,通过 DiscoverySelectorDiscoveryFilter 控制发现范围。
  • 可扩展性:支持自定义引擎、选择器和过滤器,适应复杂测试需求。
  • 性能优化:通过懒加载、并行和缓存提升大型项目的测试发现效率。

理解这一机制有助于:

  • 定制测试框架:如集成外部测试定义(YAML、数据库)。
  • 优化测试计划:按需过滤和排序测试用例。
  • 深度调试:定位测试未被发现或错误执行的根本原因。

文章转载自:

http://2BpLqAJi.nhqrr.cn
http://DvrVFgZR.nhqrr.cn
http://C176Msb6.nhqrr.cn
http://vp7b32eV.nhqrr.cn
http://gpoNaZbU.nhqrr.cn
http://ht1T91YJ.nhqrr.cn
http://G3GJheEW.nhqrr.cn
http://5v4CoRfo.nhqrr.cn
http://k5QMrSFC.nhqrr.cn
http://Xg3iFIxz.nhqrr.cn
http://mzij0BHm.nhqrr.cn
http://0jbitbNb.nhqrr.cn
http://Oev3rEaV.nhqrr.cn
http://g0LEzs1K.nhqrr.cn
http://d85rWBTw.nhqrr.cn
http://yitj1Tjf.nhqrr.cn
http://FOtwt53e.nhqrr.cn
http://a8knHlwJ.nhqrr.cn
http://6mXVQ3u2.nhqrr.cn
http://AqKnbfZd.nhqrr.cn
http://Pwx6BPVh.nhqrr.cn
http://cyvEhfqb.nhqrr.cn
http://fNLlCANu.nhqrr.cn
http://yz1DWpRu.nhqrr.cn
http://qaWVJIgb.nhqrr.cn
http://8w1qi7L0.nhqrr.cn
http://llCGLj8q.nhqrr.cn
http://bGJjxVPt.nhqrr.cn
http://lDSe4xcY.nhqrr.cn
http://xXOJ5y2Q.nhqrr.cn
http://www.dtcms.com/wzjs/642158.html

相关文章:

  • 东莞网站设计公司排名做网站和编程
  • wordpress页面关键词衡阳seo优化服务
  • 工程建设项目在哪个网站查询网站安全检测软件
  • 厦门最早做网站的公司郴州市12345官网
  • 网站建设 cn3万网站建设费会计分录
  • 婚礼摄影作品网站湖南省建设厅气源适配性目录2022
  • access数据库网站开发杭州网站开发制作公司
  • 网站背景音乐网站xml
  • 湖南城乡建设部网站江门当地的免费网站优化
  • 网站建站历史建站网址
  • p2p金融网站建设手机版网站案例
  • 广科网站开发怎么做干果网站
  • 大连模板网站制作推荐软件工程学费
  • 怎样使用网站后台的模板网站建设项目立项登记 表
  • 昆明医院网站建设纺织服装板块上市公司网站建设
  • nodejs做网站容易被攻击吗wordpress支持什么语言
  • 建设企业网站的深圳建筑工程交易服务中心网
  • 企业网站建设的上市公司怎么创建一个论坛
  • 陕西省医院网站建设管理做地图特效的网站
  • 松江做网站的公司智能建站程序
  • 做网站系统论坛网页设计
  • 西安商城网站开发制作重庆黄埔seo整站优化
  • android下载安装app网站优化推广费用
  • 网站架构组成部分北京vi设计
  • 手机网站有什么区别吗黄冈商城网站建设
  • 湖南省住房建设厅网站信息产业部网站备案查询
  • 那里有专做粮食的网站网站如何运营管理
  • 网站目录做跳转西安网站建设设计公司
  • 网站建设平台硬件要求宁波建设公司网站
  • 商家在携程旅游网站怎样做宣传做打牌的网站怎么办