为Openshift + MongoDb应用程序编写验收测试
驗收測試用于確定是否滿足規范要求。 它應該在與生產環境盡可能相似的環境中運行。 因此,如果您的應用程序已部署到Openshift中,則您將需要一個與生產環境中使用的帳戶平行的帳戶,以運行測試。 在這篇文章中,我們將為部署到Openshift的應用程序編寫驗收測試,該應用程序使用MongoDb作為數據庫后端。
部署的應用程序是一個非常非常簡單的庫,它返回所有可借出的書。 該應用程序使用MongoDb來存儲與書籍有關的所有信息。
因此,讓我們開始描述先前應用程序的目標,功能,用戶故事和接受標準。
目標 :擴大對大多數人的授課范圍。
功能 :顯示可用的書。
用戶故事 :瀏覽目錄->為了查找我想借的書,作為用戶,我希望能夠瀏覽所有書。 驗收標準 :應該查看所有可用的書。
場景:
鑒于我想借一本書
當我在目錄頁面時
然后,我應該會看到可用的書籍信息:罐子之王– 1299 – LOTRCoverUrl,霍比特人– 293 – HobbitCoverUrl
注意,這是一個非常簡單的應用程序,因此接受標準也很簡單。
對于此示例,我們需要兩個測試框架,第一個用于編寫和運行驗收測試,另一個用于管理NoSQL后端。 在這篇文章中,我們將使用修昔底德的ATDD和NoSQLUnit對付MongoDB的 。
該應用程序已經部署在Openshift中 ,您可以查看https://books-lordofthejars.rhcloud.com/GetAllBooks
Thucydides是一種工具,旨在簡化編寫自動驗收和回歸測試的過程。
Thucydides使用WebDriver API訪問HTML頁面元素。 而且還可以幫助您通過使用具體的編程模型來組織測試和用戶故事,創建已執行測試的報告,最后還可以測量功能覆蓋率。
要用Thucydides編寫驗收測試,應遵循以下步驟。
- 首先,選擇您的功能之一的用戶故事。
- 然后實現PageObject類。 PageObject是一種將Web應用程序的用戶界面元素建模為對象的模式,因此測試可以以編程方式與其交互。 請注意,在這種情況下,我們正在編碼“如何”訪問HTML頁面。
- 下一步是實現步驟庫。 此類將包含執行操作所需的所有步驟。 例如,創建新書需要打開addnewbook頁面,插入新數據,然后單擊提交按鈕。 在這種情況下,我們正在編碼“什么”來實現驗收標準。
- 最后,按照定義的驗收標準并使用先前的步驟類對選定的用戶故事進行編碼。
NoSQLUnit是一個JUnit擴展,旨在使我們能夠管理所需的NoSQL引擎的生命周期,幫助我們將數據庫維護為已知狀態并簡化為NoSQL應用程序編寫測試的方式。
NoSQLUnit由兩組JUnit規則和兩個注釋組成。 在當前情況下,我們不需要管理NoSQL引擎的生命周期,因為它是由外部實體( Openshift )管理的。
因此,讓我們開始工作:
我們要做的第一件事是創建一個不包含測試代碼的要素類。 它用作表示需求結構的一種方式。
public class Application {@Featurepublic class Books {public class ListAllBooks {}}}請注意,每個實現的功能都應包含在帶有@Feature注釋的類中。 特色類的每種方法都代表一個用戶故事。
下一步是創建PageObject類。 請記住,PageObject模式將Web應用程序的用戶界面建模為對象。 因此,讓我們看一下html文件,以檢查必須映射的元素。
<table id='listBooks' cellspacing='0' cellpadding='5'><caption>List of Available Books<caption><tr><th>Title<th><th>Number Of Pages<th><th>Cover<th><tr>.....<table>這里最重要的是表標記具有一個名為listBooks的ID ,將在PageObject類中使用該ID以獲得對其參數和數據的引用。 讓我們編寫頁面對象:
@DefaultUrl('http:books-lordofthejars.rhcloud.comGetAllBooks')public class FindAllBooksPage extends PageObject {@FindBy(id = 'listBooks')private WebElement tableBooks;public FindAllBooksPage(WebDriver driver) {super(driver);}public TableWebElement getBooksTable() {Map<String, List<String>> tableValues = new HashMap<String, List<String>>();tableValues.put('titles', titles());tableValues.put('numberOfPages', numberOfPages());tableValues.put('covers', coversUrl());return new TableWebElement(tableValues);}private List<String> titles() {List<WebElement> namesWebElement = tableBooks.findElements(By.className('title'));return with(namesWebElement).convert(toStringValue());}private List<String> numberOfPages() {List<WebElement> numberOfPagesWebElement = tableBooks.findElements(By.className('numberOfPages'));return with(numberOfPagesWebElement).convert(toStringValue());}private List<String> coversUrl() {List<WebElement> coverUrlWebElement = tableBooks.findElements(By.className('cover'));return with(coverUrlWebElement).convert(toImageUrl());}private Converter<WebElement, String> toImageUrl() {return new Converter<WebElement, String>() {@Overridepublic String convert(WebElement from) {WebElement imgTag = from.findElement(By.tagName('img'));return imgTag.getAttribute('src');}};}private Converter<WebElement, String> toStringValue() {return new Converter<WebElement, String>() {@Overridepublic String convert(WebElement from) {return from.getText();}};}}使用@DefaultUrl我們設置要映射的URL,使用@FindBy我們映射ID為listBooks的Web元素,最后映射返回生成的html表內容的getBooksTable()方法。
接下來要做的是實現步驟類。 在這種簡單的情況下,我們只需要兩步,第一步打開GetAllBooks頁面,另一步斷言該表包含期望的元素。
public class EndUserSteps extends ScenarioSteps {public EndUserSteps(Pages pages) {super(pages);}private static final long serialVersionUID = 1L;@Steppublic void should_obtain_all_inserted_books() {TableWebElement booksTable = onFindAllBooksPage().getBooksTable();List<String> titles = booksTable.getColumn('titles');assertThat(titles, hasItems('The Lord Of The Rings', 'The Hobbit'));List<String> numberOfPages = booksTable.getColumn('numberOfPages');assertThat(numberOfPages, hasItems('1299', '293'));List<String> covers = booksTable.getColumn('covers');assertThat(covers, hasItems('http:upload.wikimedia.orgwikipediaen662Jrrt_lotr_cover_design.jpg', 'http:upload.wikimedia.orgwikipediaen44aTheHobbit_FirstEdition.jpg'));}@Steppublic void open_find_all_page() {onFindAllBooksPage().open();}private FindAllBooksPage onFindAllBooksPage() {return getPages().currentPageAt(FindAllBooksPage.class);}}最后是驗證驗收標準的課程:
@Story(Application.Books.ListAllBooks.class)@RunWith(ThucydidesRunner.class)public class FindBooksStory {private final MongoDbConfiguration mongoDbConfiguration = mongoDb().host('127.0.0.1').databaseName('books').username(MongoDbConstants.USERNAME).password(MongoDbConstants.PASSWORD).build();@Rulepublic final MongoDbRule mongoDbRule = newMongoDbRule().configure(mongoDbConfiguration).build();@Managed(uniqueSession = true)public WebDriver webdriver;@ManagedPages(defaultUrl = 'http:books-lordofthejars.rhcloud.com')public Pages pages;@Stepspublic EndUserSteps endUserSteps;@Test@UsingDataSet(locations = 'books.json', loadStrategy = LoadStrategyEnum.CLEAN_INSERT)public void finding_all_books_should_return_all_available_books() {endUserSteps.open_find_all_page();endUserSteps.should_obtain_all_inserted_books();}}在上一堂課中應該考慮一些事項:
- @Story應該收到一個使用@Feature批注定義的類,以便Thucydides可以正確創建報告。
- 我們使用MongoDbRule建立與遠程MongoDb實例的連接。 請注意,由于端口轉發具有Openshift功能,因此我們可以使用本地主機地址,因此盡管使用了本地主機,但實際上我們正在管理遠程MongoDb實例。
- 使用@Steps Thucydides將創建先前步驟庫的實例。
- 最后使用@UsingDataSet批注在運行測試之前將數據填充到MongoDb數據庫中。
請注意, NoSQLUnit通過在每次測試執行之前清理數據庫并將其定義為json文件中的已知數據來填充數據庫, 從而將數據庫保持為已知狀態。
還請記住,此示例非常簡單,因此僅顯示了Thucydides和NoSQLUnit功能的一小部分。 繼續觀看兩個網站: http : //thucydides.info和https://github.com/lordofthejars/nosql-unit
我們不斷學習, 亞歷克斯參考:來自我們的JCG合作伙伴 Alex Soto的Openshift + MongoDb應用程序的編寫驗收測試,位于One Jar To Rule All All博客上。
翻譯自: https://www.javacodegeeks.com/2012/12/writing-acceptance-tests-for-openshift-mongodb-applications.html
總結
以上是生活随笔為你收集整理的为Openshift + MongoDb应用程序编写验收测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全球购买电脑(全球电脑市场)
- 下一篇: 怎么使用360安全卫士升级Win10系统