在雅加达EE TCK中使用Arquillian的可能方法

最近,我们讨论了如何创建独立的Jakarta Batch测试套件(TCK)。 对于大多数提交者而言,使用Arquillian将测试从实现中如何执行抽象化是很自然的。 但是Romain提出了一个有趣的想法,即使用纯JUnit5引起了我的思考。 它并没有止步于思考。 经过数小时的黑客攻击后,我现在可以提出概念证明,并提出如何将普通的JUnit5用于TCK的建议,以及如何使用优良的Arquillian将容器与之集成,以避免重新发明轮子。

当前的独立Batch TCK的问题在于它基于TestNG,并且仅支持在与测试套件相同的类路径上运行的Batch实现。 因此,它不支持在Java容器(如应用程序服务器)中运行测试。 现在,此类容器仅受Jakarta测试套件(CTS)支持,该套件包含批处理TCK测试的副本,该测试使用专有技术在容器中运行测试。

还有其他带有独立TCK或计划创建它的Jakarta EE规范:

  • CDI TCK –与Arquillian一起使用TestNG
  • Bean验证 –与Arquillian一起使用TestNG
  • JSON-B –正在进行中,与Arquillian一起使用JUnit 4
  • DI TCK – JUnit 4

显然Arquillian在其中很受欢迎。 只有DI TCK不使用它。 但是DI TCK本身也不支持在远程容器中执行,它仅支持设置本地容器,例如,如果实现支持,则使用CDI SE API。

我的概念证明有3个目标:

  1. 改进TCK,使其可以与Java容器集成
  2. 修改现有示例项目以使用TCK运行JBatch
  3. 创建另一个将TCK与典型的Jakarta EE服务器(例如Payara Server)集成的示例

如果可以的话,我更喜欢逐步进化,而不是爆炸式发展。 而且我意识到,即使我找到了使用JUnit 5的解决方案,无论如何我还是都需要Arquillian与Payara Server集成来实现我的第三个目标。因此,我首先在当前的Batch TCK中添加了对Arquillian的支持,后来希望重用它将Payara Server与JUnit 5集成在一起。事实证明,这是一种很好的方法,不会浪费任何代码。

添加对Arqullian的支持

在批处理TCK中添加对Arquillian的支持非常简单,因为测试已经使用TestNG,而Arquillian开箱即用地支持TestNG。 唯一棘手的部分是为Arquillian所需的每个测试创建一个部署程序包。 最后,这非常简单,不需要修改测试源。 Arquillian允许创建扩展以为每个测试定义部署程序包,因此我能够将部署程序包的创建移至单独的扩展程序。 需要在容器中运行测试的实现可以使用此扩展,但是TCK本身不需要。

TCK唯一需要的更改是更改每个测试以扩展Arquillian TestNG基类,仅此而已。

在测试套件的顶部,批处理TCK包含一个示例TCK运行器项目,该项目针对JBatch实现运行TCK。 这也需要稍作更改。 我添加了Arquillian Weld SE连接器,该连接器在Weld CDI容器中运行Arquillian TestNG测试。 这意味着测试将在与测试套件相同的类路径上执行,并且不需要Arquillian部署。

您可以在这里在我的叉子上看到最终结果: https : //github.com/OndroMih/batch-tck/pull/1 。 总之,我向每个TCK测试添加了一行代码,并修改了批处理TCK和JBatch的TCK运行器的pom.xml。

这使我可以创建一个示例项目 ,以使用远程服务器(如Payara Server)运行TCK。 这个示例项目包含我上面提到的Arquillian扩展。 此扩展使用Maven解析器库来解析项目的pom.xml文件中的JAR依赖项,并将其打包到Arquillian的WAR部署中。 它并不复杂,只需要几行代码: MavenTestDependenciesDeploymentPackager.java

将TCK转换为JUnit5

将基于TestNG的TCK转换为JUnit 5非常简单。 除了用等效的JUnit 5替换所有TestNG注释外,我还需要用标准Java JUL日志记录替换TestNG报告。

您可以在这里查看我转换的最终结果: https : //github.com/OndroMih/batch-tck/pull/2 。 更改了TCK,并且JBatch调谐器项目也使用了它,并且运行无测试失败。 这解决了我的前两个目标。

最难的事情是将JUnit 5测试套件与Payara Server连接起来以满足我的第3个目标。 为此,我需要解决以下问题:

  • 创建一个部署程序包以将测试部署到Payara Server
  • 创建一个JUnit 5扩展以在Payara Server中运行测试并向后报告结果

在上一步中,我已经使用Arquillian扩展解决了第一个问题。 似乎有一个非正式的JUnit 5扩展可以运行Arquillian测试。 是的,它确实有效,我能够将所有这些合并为最终实现我所有3个目标的解决方案。

使用Arquillian运行JUnit 5 TCK

幸运的是,Arquillian社区一直在为JUnit 5提供支持 。 尽管在等待仅在JUnit 5.5中添加的基本扩展点时花了一些时间,但现在有一个非正式的arquillian-junit5扩展 ,其中对该fork进行了一些修复。

因此,我尝试将所有已经拥有的东西汇总起来,以尝试是否可以对Payara Server运行转换后的JUnit 5 Batch TCK:

  • 使用JUnit 5 Batch TCK作为依赖项
  • 添加arquillian-junit5扩展名(从本地本地构建)
  • 添加我之前创建的Arquillian部署扩展
  • 将Arquillian配置为与Payara连接器一起运行,就像我之前所做的那样

因此,我做到了,启动了Payara Server,配置了必要的JDBC资源,并执行了以下操作:

Java

 mvn verify 

……并祈祷。

几分钟后:

Java

 Results:  Tests run: 164 , Failures: 0 , Errors: 0 , Skipped: 3 

一切正常! 这包括所有TCK测试,包括要求具有Jakarta EE功能的测试,并且这些测试无法针对独立的Batch实现(如JBatch)运行。 TCK目前正在跳过这3个被跳过的测试,而不是我的配置正在跳过这些测试。

摘要

我能够演示有多种方法可以改进现有的独立Jakarta EE TCK或以现代方式从完整的Jakarta CTS套件中创建新的。

其中之一是将Arquillian添加到JUnit 4或TestNG测试套件中的一种行之有效的方法,并且期望所有实现都提供Arquillian容器来运行它们的测试。 如所演示的,用几行代码,这很容易,编写了一个简单的Arquillian扩展来定义所有测试的部署。

但是,还有一种有趣的新方法可以使用JUnit 5,它是Java最现代的测试框架之一。 JUnit 5提供了足够的扩展点,并且还允许全局启用所有测试的扩展。 这意味着测试不需要包括启用扩展所需的任何模板代码。 正式发布后,实现者可以使用Arquillian通过现有的JUnit 5 Arquillian扩展来运行测试,也可以创建自己的JUnit 5扩展以将测试与其实现连接。 或者他们可以自由使用现有的非官方JUnit 5 Arquillian扩展,甚至可以根据需要进行修改,因为他们可以真正使用他们想要的任何东西。

翻译自: https://www.javacodegeeks.com/2020/04/possible-ways-to-use-arquillian-in-jakarta-ee-tcks.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言怎么循环输入单个字符,c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,...

c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,0HIDE152019.04.28浏览4次分享举报c语言输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束&#xf…

gradle发布jar_使用Gradle将JAR工件发布到Artifactory

gradle发布jar因此,我浪费了一两天(只是投资)来了解如何使用Gradle将JAR发布到本地运行的Artifactory服务器。 我使用Gradle Artifactory插件进行发布。 我迷失在无穷循环中,包括各种版本的各种插件和执行各种任务。 是的&#xf…

c++语言 自己构造函数 成员对象构造函数 调用顺序,C++类成员构造函数和析构函数顺序示例详细讲解...

对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。C遵循如下的创建顺序:(1)如果某个类具体基类,执行基类的默认构造函数。(2)类的非静态数据成员,按照声明的顺序创建。(3)执行该类的构造函数。即构…

最新的20多个JMS面试问答(2020)

快速浏览JMS(Java消息服务)常见问题面试问题和答案。 2020年以来的最新问题已添加到列表中。 1.简介 在本教程中,我们将了解2020年常见的JMS面试问题。作为面试的一部分,如果您有6年以上的经验,就有机会在JMS领域提出…

【学习笔记】SAR相关概念

文章目录 1. 基础SAR—复数据转换—多视处理—自适应滤波—地理编码—斜地距转换—地形辐射校正—转DB影像 2. SAR 平差—自动匹配—区域网平差—几何精校正—镶嵌线编辑 3.干涉 SAR(InSAR/DInSAR)—配准—干涉图计算—基线计算—去除平地相位—相干性计算—干涉图滤波—相位解…

c语言逆序输出6A8F,【C语言】将二进制数逆序输出。比如6为000...0110,逆序后为0110....

//将二进制数逆序输出。比如6为000...0110,逆序后为0110...000#include unsigned int reverse_bit(int num){int i;int bit;unsigned new_num 0;for (i 0; i//将二进制数逆序输出。比如6为000...0110,逆序后为0110...000#include unsigned int reverse_bit(int num){int i;in…

加载dll api_运行时类加载以支持不断变化的API

加载dll api我维护一个IntelliJ插件 ,可以改善编写Spock规范的体验。 这个项目的挑战是在单个代码库中支持多个且不兼容的IntelliJ API版本。 回想起来,该解决方案很简单(这是野外适配器模式的一个示例),但是最初它需要…

12生肖 c语言设计,语言十二生肖教案

十二生肖中班教案十二生肖教案反思语言教案十二生肖点击进入查看全文2010虎年运势测算,走好运,发大财!宝宝三个月,来说一说之前购买的海量的婴儿用品的使用况(配合图片),大家可以都来讨论一下吧。太败了,之…

Quarkus的其他(非标准)CDI功能

Quarkus支持CDI(上下文和依赖注入)2.0,但并非全部,仅支持最常见的功能。 但是,Quarkus确实包含一些非标准功能,这些功能对于开发人员非常方便,我想在下面的视频中进行展示。 不管您是否熟悉CDI…

c语言输出星期几的英语表达,C语言程序设计: 输入年月日 然后输出是星期几...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include main(){int year,month,day0,a,b,week,c,i,sum0,days,d;printf("please input year,month,days\n");scanf("%d,%d,%d",&year,&month,&days);for(i1;i{if (year%40){if(year%1000){if (ye…

将Visual Studio Code设置为jshell中的默认编辑器

Java Shell( jshell )是用于在Java中学习和进行原型制作的交互式工具。 它是在Java 9中引入的,从那以后,我在演示过程中偶尔使用它来进行一些快速原型制作,或者只是为了验证Java语言中的新功能。 由于jshell是命令行工…

c语言中组合函数,排列组合c怎么算 公式是什么

排列有两种定义,但计算方法只有一种,凡是符合这两种定义的都用这种方法计算。定义的前提条件是m≦n,m与n均为自然数。下面介绍排列组合c的计算方法及公式,供参考。排列组合中A和C怎么算排列A(n,m)n(n-1).(n-m1)n!/(n-m)!(n为下标,…

使用Spring WebFlux构建反应性REST API –第1部分

在本文中,我们将看到如何使用Spring WebFlux构建响应式REST API。 在进入反应式API之前,让我们看看系统是如何发展的,传统REST实现遇到的问题以及现代API的需求。 如果您查看从旧版系统到下文所述的现代系统的期望, 现代系统的期…

c语言中大写a对应的数字,123456789a

大写数字网今天精心准备的是《123456789a》,下面是详解!html里,怎么把<a>123456789</a>弄到中间来例如把a标签的字移到中间来<a123456789><&#…

gradle引入依赖:_Gradle善良:获得更多的依赖性见解

gradle引入依赖:在我们的大多数项目中,我们都依赖于其他代码,例如库或其他项目。 Gradle有一个不错的DSL来定义依赖关系。 依赖性在依赖性配置中分组。 这些配置可以自己创建,也可以通过插件添加。 一旦定义了依赖关系,我们就可以…

android popupwindow 调用方法,Android PopUpWindow使用详解

释放双眼,带上耳机,听听看~!一、概述1、PopupWindow与AlertDialog的区别最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置…

高效应用程序的7个JVM参数

在撰写本文时(2020年3月),围绕垃圾收集和内存,您可以将600多个参数传递给JVM。 如果您包括其他方面,则JVM参数总数将很容易超过1000个。 😊。 任何人都无法消化和理解太多的论据。 在本文中,我们…

junit:junit_简而言之,JUnit:另一个JUnit教程

junit:junit为什么还要另一个JUnit教程? 对于Java世界中的开发人员而言, JUnit似乎是最受欢迎的测试工具 。 因此,难怪就此主题已经写了一些好书 。 但是我仍然经常遇到程序员,他们至多对这个工具及其正确用法都不太了解。 因此&…

16.04编译android 7.0,ubuntu16.04 编译Android5.1报错

hi kylin team,我使用 ubuntu16.04 构建 android 编译环境后编译 android5.1 时出现如下报错。请向开发团队反馈看能否给出解决方案,谢谢!当我使用 ubuntu16.04 构建 Android 编译环境后, 编译报错. 报错信息如下:/home/.../proj/.../anroidsrcroot/preb…

用Java将文件读入字节数组的7个示例

嗨,大家好,Java程序员经常在现实世界中遇到编程问题,他们需要将文件中的数据加载到字节数组中,该文件可以是文本或二进制文件。 一个示例是将文件的内容转换为String以便显示。 不幸的是,用于表示文件和目录的Java的Fi…