JUnit5 TestSuite替代

JUnit4具有TestSuite类来聚合多个测试。 这在JUnit 5中不可用。通常,通过套件中的一堆命名测试进行的测试发现有些糟透了。 但是,如果目标不是测试发现,而是不同测试类之间的资源共享,那么创建父对象是有意义的。

JUnit 5提供了@Nested批注,以允许子类在其父类的上下文中运行。 假定子类是非静态的,因此可以访问其父类的实例值。 如果要共享测试资源,则可能需要考虑测试套件的类级别设置,并以某种方式将其连接到子类的类级别设置中。

让我们设计一个伪造的例子来说明问题:

 @Testcontainers // use docker images @Testcontainers // use docker images  class MyTest { // make a DB at the start of the test in a docker container // takes a few minutes to boot up @Container private static final DatabaseContainer DB = createDbContainer(); private static MyDao dao; @BeforeAll static void beforeAll() { dao = createDaoFrom(DB); } @Test void daoFeatureOne() { assertThat(dao.find( "no data" )).isEmpty(); }  } 

上面是一个测试,它在测试类的全局生命周期中启动数据库。 它将一个dao对象连接到它,并且可以有多个测试可以重用该dao

在理想情况下,我们可以为每个测试重置所有内容,但是数据库是启动的昂贵资源。 也许我们可以添加一些beforeEachafterEach挂钩来清理其数据,但是我们不想对数据库进行退回。 每一次。 类似地,如果每次运行,我们的dao一些框架启动成本可能是不希望的。

上面作为我们项目中的唯一测试是可以的,但是如果还有其他需要该数据库的测试又该怎么办呢?如果真的需要运行AGES呢?

JUnit 5中没有套件

是不是很烦 如果我们可以做的话:

 @JUnit5TestSuite // not real  @Children ({MyDaoTest. class , MyOtherDaoTest. class })  @Testcontainers  class MyTestSuite { @Container private static final DatabaseContainer DB = createDbContainer();  } 

那将是很棒的……但是这会给我们带来一些问题:

  • 我们如何确保测试不在套件之外运行?
  • 这些测试如何访问`DB`对象?

套房的替代选择

假设我们有一个静态方法getDb在需要时提供数据库。

现在,让我们重写原始的DaoTest以使用它,并使其抽象化,以便测试运行器不会将其拾取:

 abstract class MyTestImpl implements DbProvider { private static MyDao dao; @BeforeAll static void beforeAll() { // access to the database container // from the static method (statically imported) dao = createDaoFrom(getDb()); } @Test void daoFeatureOne() { assertThat(dao.find( "no data" )).isEmpty(); }  } 

现在我们可以在套件中运行部分测试,让我们定义套件。 我们还使用@Nested来插入子类:

 @Testcontainers // use docker images @Testcontainers // use docker images  class MyTest { // make a DB at the start of the test in a docker container // takes a few minutes to boot up @Container private static final DatabaseContainer DB = createDbContainer(); // provide the getDb function to access the container public static DatabaseContainer getDb() { return DB; } // test suite members are just nested classes that extend // the abstract class of each member of the suite @Nested class MyTest extends MyTestImpl { } // ... add more suite members with more @Nested  } 

缺点

由于类在彼此的静态位上运行,因此存在产生混淆的风险。

每个嵌套类都必须是子类的事实也有点时髦……

但这有效并且构成了有效的测试套件。

翻译自: https://www.javacodegeeks.com/2020/04/junit5-testsuite-alternative.html

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

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

相关文章

oracle 日志丢失,Oracle联机日志文件丢失解决方法一例

由于丢失的当前的联机日志文件,所以可能会丢失部分数据,破坏数据库的完整性,而且普通的重建日志文件的方式是不可行的,这个时候我们需要借助隐含参数_ALLOW_READ_ONLY_CORRUPTION或者_ALLOW_RESETLOGS_CORRUPTION打开数据库。打开…

junit:junit_简而言之,JUnit:测试隔离

junit:junit作为顾问,我仍然经常遇到程序员,他们对JUnit及其正确用法的理解最多。 这使我有了编写多部分教程的想法,以从我的角度解释要点。 尽管存在一些有关使用该工具进行测试的好书和文章,但是也许可以通过本动手实践系列中的…

python基本模块中的对象_Python 学习笔记 -- OS模块的常用对象方法

1 #这里列举在os模块中关于文件/目录常用的函数使用方法23 #这里需要注意下,在使用这些方法前记得导入os模块4 import os #导入os模块5 """6 os对象方法:7 os.getcwd() #返回当前工作目录8 os.chdir(path) #改变工作目录9 os.listdir(pat…

OCA第2部分中的Java难题

欢迎使用OCA的Java Puzzlers的第二部分。 在这一部分中,我们将看到一个有趣的案例,涉及Java 7附带的数字文字中的下划线分隔符。 在下面的类中,您可以在十进制文字中看到分隔符下划线。 还请注意,该类现在可以正常编译。 八进制是…

msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...

点击上面蓝色字体关注!装修图例 | 别墅装修 | 装潢装饰 | 样板楼梯 | 装修设计很多复式或者别墅的房子,楼梯是不可缺少的建筑,大部分楼梯是连接客厅以及卧室的,很多朋友都选择在楼梯上面铺地板,木地板的改装空间大&…

php程序xml有必要学习吗,对初学者非常有用的PHP技巧

对初学者非常有用的PHP技巧echo "I is : $i ;}echo print_footer();那么,为什么你应该做输出缓冲呢:你可以在将输出发送给浏览器之前更改它,如果你需要的话。例如做一些str_replaces,或者preg_replaces,又或者是在…

OCA第1部分中的Java难题

我在业余时间正在阅读Mala Gupta的Oracle认证Java SE程序员助理书,我对所学到的一些新知识感到惊讶。 有时候他们真的没有任何意义,有时候他们虽然有道理,但确实令人惊讶。 因此,在本系列文章中,我想将它们共享为“ Ja…

oracle创建数据库用户并授权,oracle创建数据库、表空间、用户并授权

1、创建数据库简单的方式是使用Database Configuration Assistant数据库配置工具根据向导创建2、创建表空间在实际使用中需要创建自定义的表空间和临时表空间2.1、创建表空间create tablespace tabspace_nameloggingdatafile E:\app\oratable_space\ tabspace_name_temp.dbfsiz…

mysql 查询 系统字段 自然日_Mysql查询用户留存/留存率问题用户n日(内)留存、某日新增用户n日(内)留存...

Mysql查询用户留存/留存率语法计算某日的客户在第n日再次出现的概率--用户n日留存率。计算某日的客户在某个时间段内再次出现的概率--用户n日内留存率。计算某日新增的用户在第n日再次出现的概率--新用户n日留存率。计算某日新增的用户在某个时间段内再次出现的概率--新用户n日…

ajax 示例_通过示例了解挥发

ajax 示例我们已经花了几个月的时间来稳定Plumbr中的锁定检测功能 。 在此期间,我们遇到了许多棘手的并发问题。 许多问题是独特的,但是一种特殊类型的问题一直反复出现。 您可能已经猜到了–滥用volatile关键字。 我们已经发现并解决了许多问题&#x…

oracle long转为string,实现全局拦截前端传入的Long类型id转String

1遇到的问题在开发过程中存在这样一种问题,我们使用的id主键主要有long类型和varchar类型当主键id为long类型并且长度超过16位,当返回给前端时,前端会出现js解析的参数如果是Long类型的并且长度过大就会出现精度丢失。这就会造成后台返回的值…

springboot 多线程_redis官方推荐:SpringBoot用这个,一键多线程

Lettuce是一个可伸缩的线程安全的Redis客户端,提供了同步,异步和响应式使用方式。 如果多线程避免阻塞和事务操作(如BLPOP和MULTI / EXEC),则多个线程可共享一个连接。 Lettuce使用通信使用netty。 支持先进的Redis功能,如Sentine…

oracle查询最高一条记录,oracle 查询已有记录,上一条记录,下一条记录

oracle可以使用 lead、lag 函数来查询已有记录的下一条、上一条记录。表结构如下:如要查询Staffno是6-1102的前一条记录select * from staff where staff_no(select c.p from (select staff_no,lag(staff_no,1,0) over (order by staff_no) as p from staff) c wh…

使用Maven进行增量构建

这是2020年,如果您要启动任何新的基于Java的项目,则应优先选择gradle,但由于某些原因,如果您仍然对Maven感兴趣,那么您可能会发现这篇文章有用。 Maven Java / scala编译器插件对增量编译提供了不错的支持&#xff0c…

夏末浅笑_2014年夏末大Java新闻

夏末浅笑正如即将到来的JavaOne那样 ,最近在Java社区中已经有很多重大新闻。 这篇文章简要地引用了其中的三个项目(Java SE 8更新,Java SE 9和Java EE 8),并对我发现是我在类路径/类加载器问题上见过的更清晰的文章之一…

php删除菜单栏,如何删除WordPress站点健康状态面板和菜单项

下面由WordPress教程栏目给大家介绍删除WordPress站点健康状态面板和菜单项的方法,希望对需要的朋友有所帮助!删除 WordPress 站点健康状态面板和菜单项WordPress站点健康功能始于 5.2 版,如不想显示这玩意,可以使用本文的方法删除…

colspan会影响内部单元格宽度失效_电感失效分析

电感失效分析01电感的作用我们通常所说的电感指的是电感器件,它是用绝缘导线(例如漆包线,沙包线等)绕制而成的电磁感应元件。在电路中,当电流流过导体时,会产生电磁场,电磁场的大小除以电流的大小就是电感。电感是衡量线圈产生电磁…

linux清空redis命令,使用Linux管道批量删除Redis的key

------------------------------------------------------Redis并没有提供批量删除记录的方法,这有时候很不方便,特别是重新初始化数据的时候。一般有两种做法:如果业务场景明确,可以通过DBID进行区分,Redis默认的DBID…

ZeptoN正在将程序放入Java

1.简介 Java编程语言或“ Java”于1995年引入。然而,在近25年的时间里,它增加了最初不是核心语言所具有的功能。 此类功能包括枚举,泛型,对基本C样式功能开关语句的许多增强,断言等。 Java是一种编程语言,随…

深入理解python面向对象_转:Python3 面向对象,较为深入的两个理解

一,1. 类的声明和创建对于 Python 函数来说,声明与定义类没什么区别,因为他们是同时进行的,定义(类体)紧跟在声明(含 class 关键字的头行[header line])和可选(但总是推荐使用)的文档字符串后面。同时,所有的方法也必须…