介绍

单元测试是一种验证应用程序中可测试的最小部分的方法。 单元测试必须遵循FIRST规则; 这些是快速,隔离,可重复,自我验证和及时的。
考虑到没有持久层(典型的关系数据库或新的NoSQL数据库)的JEE应用程序很奇怪,因此编写持久层的单元测试也应该很有趣。 当我们编写持久层的单元测试时,我们应该专注于不破坏FIRST规则的两个主要概念,即快速规则和隔离规则。

如果他们不访问网络或文件系统,则我们的测试将很快,并且在持久性系统的情况下,网络和文件系统是最常用的资源。 对于RDBMS (SQL),存在许多Java内存数据库,例如Apache DerbyH2HSQLDB 。 顾名思义,这些数据库已嵌入到您的程序中,并且数据存储在内存中,因此您的测试仍然很快。 问题在于NoSQL系统,因为它们具有异质性。 一些系统使用Document方法(例如MongoDb ),其他Column(例如Hbase )或Graph(例如Neo4J )工作。 因此,供应商应提供内存模式,没有通用的解决方案。

我们的测试必须与自己隔离。 一种测试方法修改另一种测试方法的结果是不可接受的。 在持久性测试的情况下,当前一个测试方法向数据库插入一个条目,而下一个测试方法执行找到更改时,就会发生这种情况。 因此,在执行每个测试之前,应该以已知状态找到数据库。 请注意,如果您的测试发现数据库处于已知状态,则测试将是可重复的,如果测试断言取决于先前的测试执行,则每个执行都是唯一的。 对于RDBMS之类的同类系统,存在DBUnit来在每次执行之前将数据库保持在已知状态。 但是还没有用于异构NoSQL系统的DBUnit框架。

NoSQLUnit通过提供一个JUnit扩展来解决此问题,该扩展可以帮助我们管理NoSQL系统的生命周期,并有助于将数据库维护为已知状态。

NoSQLUnit

NoSQLUnit是一个JUnit扩展,它使使用NoSQL后端的系统的编写单元测试和集成测试更加容易,它由两组规则和一组注释组成。
第一组规则是负责管理数据库生命周期的规则 ; 每个受支持的后端都有两个。

  • 第一个(如果可能的话)它是内存模式。 此模式负责以“内存中”模式启动和停止数据库系统。 此模式通常在单元测试执行期间使用。
  • 第二个是托管模式。 此模式负责启动NoSQL服务器,但作为远程进程(在本地计算机中)并停止它。 通常在集成测试执行期间使用。

第二组规则是负责将数据库保持为已知状态的规则 。 每个受支持的后端都有自己的后端,可以理解为与已定义数据库的连接,该数据库将用于执行所需的操作以维护系统的稳定性。

请注意,由于NoSQL数据库是异构数据库,因此每个系统都需要自己的实现。
最后提供了两个注释, @UsingDataSet@ShouldMatchDataSet (非常感谢Arquillian的名字),用于指定数据集和预期数据集的位置。

MongoDb示例

现在,我将解释一个非常简单的示例,说明如何使用NoSQLUnit,要全面了解所提供的所有功能,请阅读链接中的文档或以pdf格式下载 。
要使用MongoDB的使用NoSQLUnit你只需要添加下一依赖性:

<dependency><groupId>com.lordofthejars<groupId><artifactId>nosqlunit-mongodb<artifactId><version>0.3.0<version><dependency>

第一步是定义测试所需的生命周期管理策略。 根据您要实施的测试类型(单元测试,集成测试,部署测试等),您将需要内存方式, 托管方式或远程方式。

对于此示例,我们将使用通过ManagedMongoDb规则使用托管方法),但请注意,还支持内存中 MongoDb管理(请参见文档说明)。

下一步是配置Mongodb规则, 规则负责通过插入和删除定义的数据集来将MongoDb数据库保持在已知状态。 您必须注册MongoDbRule JUnit规则类,该类需要一个配置参数,其中包含主机,端口或数据库名称之类的信息。

为了简化开发人员的生活并使代码更易读,可以使用流畅的界面来创建这些配置对象。

让我们看一下代码:

首先是一个简单的POJO类,它将用作模型类:

public class Book {private String title;private int numberOfPages;public Book(String title, int numberOfPages) {super();this.title = title;this.numberOfPages = numberOfPages;}public void setTitle(String title) {this.title = title;}public void setNumberOfPages(int numberOfPages) {this.numberOfPages = numberOfPages;}public String getTitle() {return title;}public int getNumberOfPages() {return numberOfPages;}}

下一业务类负责管理对MongoDb服务器的访问:

public class BookManager {private static final Logger LOGGER = LoggerFactory.getLogger(BookManager.class);private static final MongoDbBookConverter MONGO_DB_BOOK_CONVERTER = new MongoDbBookConverter();private static final DbObjectBookConverter DB_OBJECT_BOOK_CONVERTER = new DbObjectBookConverter();private DBCollection booksCollection;public BookManager(DBCollection booksCollection) {this.booksCollection = booksCollection;}public void create(Book book) {DBObject dbObject = MONGO_DB_BOOK_CONVERTER.convert(book);booksCollection.insert(dbObject);}}

现在该进行测试了。 在下一个测试中,我们将验证一本书是否已正确插入数据库。

package com.lordofthejars.nosqlunit.demo.mongodb;public class WhenANewBookIsCreated {@ClassRulepublic static ManagedMongoDb managedMongoDb = newManagedMongoDbRule().mongodPath('optmongo').build();@Rulepublic MongoDbRule remoteMongoDbRule = new MongoDbRule(mongoDb().databaseName('test').build());@Test@UsingDataSet(locations='initialData.json', loadStrategy=LoadStrategyEnum.CLEAN_INSERT)@ShouldMatchDataSet(location='expectedData.json')public void book_should_be_inserted_into_repository() {BookManager bookManager = new BookManager(MongoDbUtil.getCollection(Book.class.getSimpleName()));Book book = new Book('The Lord Of The Rings', 1299);bookManager.create(book);}}

看到首先,我们正在使用ClassRule注释创建与MongoDb服务器的托管连接。 在这种情况下,我们将以编程方式配置MongoDb路径,但也可以从MONGO_HOME环境变量进行设置。 请参见此处所有可用参数的完整说明。

加载测试时将执行此规则 ,并将启动MongoDb实例。 执行完所有测试后,还将关闭服务器。

Next Rule在任何测试方法之前执行,负责将数据库保持在已知状态。 注意,我们仅配置工作数据库,在本例中为测试数据库。

最后,我们用@UsingDataSet注释方法测试,指示执行每个测试之前要在哪里找到要插入的数据,并@ShouldMatchDataSet定位预期的数据集。

{'Book':[{'title':'The Hobbit','numberOfPages':293}]}
{'Book':[{'title':'The Hobbit','numberOfPages':293},{'title':'The Lord Of The Rings','numberOfPages':1299}]}

我们正在设置文件initialData.json初始数据集位于classpath中COM / lordofthejars / nosqlunit /演示/ MongoDB的/ initialData.json和预期的数据集叫expectedData.json。

最后说明

虽然NoSQLUnit是在早期阶段,MongoDB中的部分几乎已经完成,在接下来的版本中的新功能,当然还有新的数据库将得到支持。 下一个NoSQL支持的引擎将是Neo4JCassandraHBaseCouchDb

另请阅读文档 ,您将在此处找到对每个功能的完整说明。

最后,您的任何建议,任何建议或任何建议都将受到欢迎。

保持学习!

完整代码

参考: NoSQLUnit 0.3.0从我们的JCG合作伙伴 Alex Soto在“ 一个罐子统治所有”博客上发布。

翻译自: https://www.javacodegeeks.com/2012/06/nosqlunit-030-released.html

NoSQLUnit 0.3.0发布相关推荐

  1. StartOS 5.0 正式版发布

    StartOS 5.0正式版发布了. StartOS -- 是由东莞瓦力网络科技有限公司发行的开源操作系统,符合国人的使用习惯,预装常用的精品软件,操作系统具有运行速度快,安全稳定,界面美观,操作简洁 ...

  2. Linux下的Silverlight:Moonlight 1.0 Beta 1发布了

    Moonlight是微软Silverlight的一个开源实现,其目标平台是Linux与Unix/X11系统.自从2007年9月开始,Moonlight就在Mono项目下进行了开发,它是由Novell发 ...

  3. Silverlight 3发布新版3.0.50106.0

    微软1月19日发布Silverlight 3新版本3.0.50106.0. 该版本主要修复以下几个问题: 问题一: 当使用图形硬件加速功能(GPU)的时候,如果GPU驱动报错,Silverlight ...

  4. TensorFlow2.0正式版发布,极简安装TF2.0(CPUGPU)教程

    作者 | 小宋是呢 转载自CSDN博客 [导读]TensorFlow 2.0,昨天凌晨,正式放出了2.0版本. 不少网友表示,TensorFlow 2.0比PyTorch更好用,已经准备全面转向这个新 ...

  5. 禅道设置bug模板_JPress v3.0 beta.2 发布,修复 bug 和完善产品细节

    JPress 是一个使用 Java 开发的类似 WordPress 的系统,但更加侧重于企业营销和微信运营.支持模块化和插件化二次开发,国外对标 WordPress.国内对标 微擎 . 这个版本主要是 ...

  6. 分享:Arcadia 0.12.1 发布,Ruby 集成开发环境

    Arcadia 0.12.1 发布,Ruby 集成开发环境 http://www.oschina.net/news/35942/arcadia-0-12-1

  7. PouchContainer 发布 0.3.0 版本,支持 Kubernetes 拥抱 CNCF 生态

    划重点 PouchContainer 是一款轻量级.开源的富容器技术,拥有快速高效.隔离性强.可移植性高.资源占用少等特性,可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用 ...

  8. Linux Kernel 5.0 RC 7 发布

    百度智能云 云生态狂欢季 热门云产品1折起>>>   Linux 5.0 RC 7 发布了,此版本没什么特别之处,更新内容主要包括: 关于驱动程序的,包括网络.声音.block.gp ...

  9. Apache Libcloud 0.12.3 发布

    Libcloud 0.12.3 发布了,该版本主要是 bug 修复,修复了 Python 3.3 相关的一些问题. 安装:pip install apache-libcloud libcloud 是一 ...

最新文章

  1. 【DOM编程艺术】动态创建标记(签)---创建和插入节点
  2. Linux内存映射mmap原理分析
  3. button 样式_实战PyQt5: 111-可以使用QSS样式表的部件
  4. import的用法python_Python导入模块,Python import用法(超级详细)
  5. 探寻安全管理平台(SOC)项目的关键成功因素
  6. Android ProgressBar手动控制开始和停止
  7. mysql++3307,mysql多实例配置方法
  8. 使得电脑成为通用计算机器,为什么电脑显示器变成通用非即插即用监视器?
  9. 【主动轮廓模型(一)】《Snakes: Active Contour Models》算法原理与OpenCV实现
  10. 联想拯救者Y7000P拆机清灰学习
  11. 印度人为什么立刀切菜_印度人的刀功有多厉害?看到一刀刮掉的鱼鳞和碎洋葱,我彻底服了...
  12. python 集合字典_frozenset defaultdict MD5在线加密解密工具
  13. 初识ANSI C标准
  14. 面试必问 K8S 的经典题目,来看看你会几个?
  15. 周期和频率之间的换算
  16. 前端如何实现搜索记录展示以及清楚历史搜索记录
  17. 探秘varian:优雅的发布部署程序
  18. 如是古籍数字化工具平台介绍---自动秒级识别古籍OCR
  19. 速取,3D建模速成入门到高级教程(附软件安装包)
  20. 直扩 单音干扰抑制 matlab,单频干扰在直扩系统中的误码性能分析

热门文章

  1. 编译报错+解决方法:错误: 找不到符号
  2. kafka mirror_SSL Kafka经纪人从Kafka Mirror Maker迁移到Brooklin的挑战
  3. cuba 平台_CUBA 7的新功能
  4. rest端点_REST:使用Controller端点?
  5. 忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...
  6. java开发常见异常_最常见的Java异常及其对Java开发人员的评价
  7. maven与spring_与Spring和Maven签约首个SOAP服务
  8. java8 函数式编程_Java 8函数式编程:延迟实例化
  9. 图片大小 媒体大小自适应_自适应堆大小
  10. Java –缺少字体–崩溃的应用程序!