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你只需要添加下一依賴性:
第一步是定義測試所需的生命周期管理策略。 根據您要實施的測試類型(單元測試,集成測試,部署測試等),您將需要內存方式, 托管方式或遠程方式。
對于此示例,我們將使用通過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发布的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 温泉蛋怎么吃 温泉蛋的吃法
- 下一篇: 关于Java包