NoSQLUnit 0.3.0发布
单元测试是一种验证应用程序中可测试的最小部分的方法。 单元测试必须遵循FIRST规则; 这些是快速,隔离,可重复,自我验证和及时的。
考虑到没有持久层(典型的关系数据库或新的NoSQL数据库)的JEE应用程序很奇怪,因此编写持久层的单元测试也应该很有趣。 当我们编写持久层的单元测试时,我们应该专注于不破坏FIRST规则的两个主要概念,即快速规则和隔离规则。
如果他们不访问网络或文件系统,则我们的测试将很快,并且在持久性系统的情况下,网络和文件系统是最常用的资源。 对于RDBMS (SQL),存在许多Java内存数据库,例如Apache Derby , H2或HSQLDB 。 顾名思义,这些数据库已嵌入到您的程序中,并且数据存储在内存中,因此您的测试仍然很快。 问题在于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支持的引擎将是Neo4J , Cassandra , HBase和CouchDb 。
另请阅读文档 ,您将在此处找到对每个功能的完整说明。
最后,您的任何建议,任何建议或任何建议都将受到欢迎。
保持学习!
完整代码
参考: NoSQLUnit 0.3.0从我们的JCG合作伙伴 Alex Soto在“ 一个罐子统治所有”博客上发布。
翻译自: https://www.javacodegeeks.com/2012/06/nosqlunit-030-released.html
NoSQLUnit 0.3.0发布相关推荐
- StartOS 5.0 正式版发布
StartOS 5.0正式版发布了. StartOS -- 是由东莞瓦力网络科技有限公司发行的开源操作系统,符合国人的使用习惯,预装常用的精品软件,操作系统具有运行速度快,安全稳定,界面美观,操作简洁 ...
- Linux下的Silverlight:Moonlight 1.0 Beta 1发布了
Moonlight是微软Silverlight的一个开源实现,其目标平台是Linux与Unix/X11系统.自从2007年9月开始,Moonlight就在Mono项目下进行了开发,它是由Novell发 ...
- Silverlight 3发布新版3.0.50106.0
微软1月19日发布Silverlight 3新版本3.0.50106.0. 该版本主要修复以下几个问题: 问题一: 当使用图形硬件加速功能(GPU)的时候,如果GPU驱动报错,Silverlight ...
- TensorFlow2.0正式版发布,极简安装TF2.0(CPUGPU)教程
作者 | 小宋是呢 转载自CSDN博客 [导读]TensorFlow 2.0,昨天凌晨,正式放出了2.0版本. 不少网友表示,TensorFlow 2.0比PyTorch更好用,已经准备全面转向这个新 ...
- 禅道设置bug模板_JPress v3.0 beta.2 发布,修复 bug 和完善产品细节
JPress 是一个使用 Java 开发的类似 WordPress 的系统,但更加侧重于企业营销和微信运营.支持模块化和插件化二次开发,国外对标 WordPress.国内对标 微擎 . 这个版本主要是 ...
- 分享:Arcadia 0.12.1 发布,Ruby 集成开发环境
Arcadia 0.12.1 发布,Ruby 集成开发环境 http://www.oschina.net/news/35942/arcadia-0-12-1
- PouchContainer 发布 0.3.0 版本,支持 Kubernetes 拥抱 CNCF 生态
划重点 PouchContainer 是一款轻量级.开源的富容器技术,拥有快速高效.隔离性强.可移植性高.资源占用少等特性,可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用 ...
- Linux Kernel 5.0 RC 7 发布
百度智能云 云生态狂欢季 热门云产品1折起>>> Linux 5.0 RC 7 发布了,此版本没什么特别之处,更新内容主要包括: 关于驱动程序的,包括网络.声音.block.gp ...
- Apache Libcloud 0.12.3 发布
Libcloud 0.12.3 发布了,该版本主要是 bug 修复,修复了 Python 3.3 相关的一些问题. 安装:pip install apache-libcloud libcloud 是一 ...
最新文章
- 【DOM编程艺术】动态创建标记(签)---创建和插入节点
- Linux内存映射mmap原理分析
- button 样式_实战PyQt5: 111-可以使用QSS样式表的部件
- import的用法python_Python导入模块,Python import用法(超级详细)
- 探寻安全管理平台(SOC)项目的关键成功因素
- Android ProgressBar手动控制开始和停止
- mysql++3307,mysql多实例配置方法
- 使得电脑成为通用计算机器,为什么电脑显示器变成通用非即插即用监视器?
- 【主动轮廓模型(一)】《Snakes: Active Contour Models》算法原理与OpenCV实现
- 联想拯救者Y7000P拆机清灰学习
- 印度人为什么立刀切菜_印度人的刀功有多厉害?看到一刀刮掉的鱼鳞和碎洋葱,我彻底服了...
- python 集合字典_frozenset defaultdict MD5在线加密解密工具
- 初识ANSI C标准
- 面试必问 K8S 的经典题目,来看看你会几个?
- 周期和频率之间的换算
- 前端如何实现搜索记录展示以及清楚历史搜索记录
- 探秘varian:优雅的发布部署程序
- 如是古籍数字化工具平台介绍---自动秒级识别古籍OCR
- 速取,3D建模速成入门到高级教程(附软件安装包)
- 直扩 单音干扰抑制 matlab,单频干扰在直扩系统中的误码性能分析
热门文章
- 编译报错+解决方法:错误: 找不到符号
- kafka mirror_SSL Kafka经纪人从Kafka Mirror Maker迁移到Brooklin的挑战
- cuba 平台_CUBA 7的新功能
- rest端点_REST:使用Controller端点?
- 忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...
- java开发常见异常_最常见的Java异常及其对Java开发人员的评价
- maven与spring_与Spring和Maven签约首个SOAP服务
- java8 函数式编程_Java 8函数式编程:延迟实例化
- 图片大小 媒体大小自适应_自适应堆大小
- Java –缺少字体–崩溃的应用程序!