摘要:完成應用測試我們已經完成了我們想要創建的博客引擎。當然我們已經完成了測試所有模型層的功能。評估代碼覆蓋率當然我們還沒有完成應用所需的所有測試用例。如你所見,我們遠遠沒有完成對應用的全面測試。
完成應用測試
我們已經完成了我們想要創建的博客引擎。不過這個項目尚未完全結束。為了保證代碼的質量,我們需要添加更多的測試。
當然我們已經完成了測試所有模型層的功能。所以博客引擎的核心功能已經被測試過了。但是一個Web應用并不只有模型層。我們需要確保Web交互界面是否完好。這需要測試引擎的控制層。但是我們甚至需要測試UI界面,比如我們的Javascript代碼。
測試控制層通過JUnit,你可以直接測試應用的控制層。我們將這些測試稱之為功能測試。因為我們會測試應用完整的功能。
一個功能測試會調用Play的ActionInvoker,模擬一個HTTP請求。我們需要提供HTTP方法,一個URI和HTTP參數。Play會根據這個請求,找到路由,接著調用對應的action,最后返回一個響應。你可以分析它,看看響應是否在意料之中。
先寫第一個功能測試。打開yabe/test/ApplicationTest.java:
import org.junit.*; import play.test.*; import play.mvc.*; import play.mvc.Http.*; import models.*; public class ApplicationTest extends FunctionalTest { @Test public void testThatIndexPageWorks() { Response response = GET("/"); assertIsOk(response); assertContentType("text/html", response); assertCharset("utf-8", response); } }
看上去像是一般的JUnit測試。注意我們使用Play的Functionaltest父類來獲取輔助函數。這個測試僅僅是用于檢測主頁是否正常(一般/URL會渲染一個HTML文件,并返回‘200 OK’狀態碼)。
現在我們將檢測管理面板的安全是否禁得住考驗。給ApplicationTest.java添加新的測試:
… @Test public void testAdminSecurity() { Response response = GET("/admin"); assertStatus(302, response); assertHeaderEquals("Location", "/login", response); } …
使用play test命令運行你的yabe應用,打開http://localhost:9000/@tests,選擇ApplicationTest.java用例,然后運行它。
變綠了嗎?
現在,我們可以對應用的全部功能進行同樣的測試,但這并不是測試一個基于HTML的Web應用的最佳方式,我們的博客引擎需要在Web瀏覽器中執行,如果能夠在真實的瀏覽器中進行測試,這就是Play的Selenium測試所做的事情。
一個Selenium測試套件一般是個HTML文件。Selenium所使用的HTML語法有點令人乏味(就像是一個HTML表格元素一樣)。好消息是,Play可以讓你使用模板引擎以及一些支持簡化的Selenium語法的標簽來生成它。這也意味著,你可以利用Play模板的表達能力(條件語句,循環語句等等)來生成許多復雜的測試。
當然,如果需要的話,你也可以不用模板的生成功能,直接撰寫Selenium頁面。其實,使用Selenium專用工具,比如Selenium IDE,來生成Selenium測試頁面也是不錯的選擇。
一個剛創建的Play應用已經自帶了一個Selenium測試。打開yabe/test/Application.test.html:
*{ You can use plain Selenium commands using the selenium tag }* #{selenium} // Open the home page, and check that no error occurred open("/") waitForPageToLoad(1000) assertNotTitle("Application error") #{/selenium}
在yabe上運行這個測試應該不會出現任何問題。它只是打開主頁,然后檢測頁面中是否包括"Application error"文本。
不過,一如任何復雜的測試,在瀏覽應用并進行測試之前,你都需要設置一些初始數據。我們將重用之前用過的Fixture和yabe/test/data,yml。要在測試開始之前引入數據,僅需使用#{fixture /}標簽:
#{fixture delete:"all", load:"data.yml" /} #{selenium} // Open the home page, and check that no error occurred open("/") waitForPageToLoad(1000) assertNotTitle("Application error") #{/selenium}
還需要檢查另一個重要的事情,就是在每個測試開始之前要有一個新的用戶會話。這個會話將保持在瀏覽器的持久cookie中,如果不做清理,它會在兩個連續的測試之間保持。
所以我們的測試之前,先添加一個特殊的命令:
#{fixture delete:"all", load:"data.yml" /} #{selenium} clearSession() // Open the home page, and check that no error occurred open("/") waitForPageToLoad(1000) assertNotTitle("Application error") #{/selenium}
運行這個測試,確保一切安好。應該會是全綠的結果。
所以我們可以開始寫更復雜的測試了。打開主頁面,檢查是否展示了默認的文章。
#{fixture delete:"all", load:"data.yml" /} #{selenium "Check home page"} clearSession() // Open the home page open("/") // Check that the front post is present assertTextPresent("About the model layer") assertTextPresent("by Bob, 14 Jun 09") assertTextPresent("2 comments , latest by Guest") assertTextPresent("It is the domain-specific representation") // Check older posts assertTextPresent("The MVC application") assertTextPresent("Just a test of YABE") #{/selenium}
我們使用的是標準的Selenium語法,叫做Selenese。
運行它。(通過在新的標簽頁打開鏈接,你可以在一個不同的窗口中運行)。
現在我們開始測試評論框。添加一個新的#{selenium /}標簽到模板中:
#{selenium "Test comments"} // Click on "The MVC application post" clickAndWait("link=The MVC application") assertTextPresent("The MVC application") assertTextPresent("no comments") // Post a new comment type("content", "Hello") clickAndWait("css=input[type=submit]") // Should get an error assertTextPresent("no comments") assertTextPresent("Author is required") type("author", "Me") clickAndWait("css=input[type=submit]") // Check assertTextPresent("Thanks for posting Me") assertTextPresent("1 comment") assertTextPresent("Hello") #{/selenium}
然后運行它。啊,出錯了;看來這里有點問題。
原來是驗證碼的問題。這個可模擬不了……只好作弊了嘿嘿。在測試模式中,我們可需要把任何針對驗證碼的輸入都當做正確的。而在測試模式下,框架的id是test。所以修改掉yabe/app/controllers/Application.java的postComment action來跳過測試模式下的驗證:
… if(!Play.id.equals("test")) { validation.equals(code, Cache.get(randomID)).message("Invalid code. Please type it again"); } …
現在修改下測試用例。驗證碼那一欄就隨便亂寫好了:
… type("author", "Me") type("code", "XXXXX") clickAndWait("css=input[type=submit]") …
然后重新運行測試,這下應該通過了。
評估代碼覆蓋率當然我們還沒有完成應用所需的所有測試用例。但是對于我們的教程來說已經足夠了。在現實的應用中,我們怎么知道是否已經寫了足夠的測試用例?我們需要一個代碼覆蓋率的概念。
Cobertura 模塊使用Cobertura工具生成代碼覆蓋率報告。使用install命令安裝這個模塊:
play install cobertura-{version}
我們僅需在測試模式下啟動這個模塊。所以在application.conf文件下添加這一行:
# Import the cobertura module in test mode %test.module.cobertura=${play.path}/modules/cobertura
現在在測試模式下重新啟動應用,打開http://localhost:9000/@tests,選中所有測試并運行。應該是綠光滿面的節奏。
在所有的測試結束后,停止應用,cobertura將生成代碼覆蓋率報告。接著你可以在瀏覽器打開yabe/test-result/code-coverage/index.html,看一下那份報告。
如果重新啟動應用,你也可以在http://localhost:9000/@cobertura看到它。
如你所見,我們遠遠沒有完成對應用的全面測試。一個好的測試覆蓋率應該盡量達到100%,即使檢查所有的代碼是幾乎不可能的。畢竟我們有時候不得不在測試模式下做一些變通,正如我們曾對驗證碼做過的一樣。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64094.html
摘要:所以任務會在第一個請求時同步執行。修改來展示這些對象你可以閱讀模板是怎么工作的。標簽只有兩個參數用于展示的文章對象以及展示的模式可以是全文,全文附評論,預告中的一種現在我們可以將冗余代碼替換成標簽,重寫主頁重載頁面,檢查是否一切安好。 建立第一個頁面 既然我們完成了數據模型的初步定義,是時候開始創建應用的頁面了。這個頁面將僅僅展示最近的博文,以及一個舊文章的列表。 下面是我們想要實...
摘要:確保你的文本編輯器已經做了相應的配置。第一個,會自動監測源代碼的改變并在運行時自動重載。檢查下面的一行是否出現在應用日志中使用版本控制系統來追蹤變化當你開發一個項目時,最好使用版本控制系統來存儲你的源代碼。 Play是一個Java Web敏捷開發的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個教程,是因...
摘要:數據模型的首次迭代接下來我們要開始完成我們的博客引擎的模型部分。一個普遍的選擇是使用關系型數據庫。不要認為生成的成員變量是函數變量,其實它是技術變量。當你在中運行應用時,會自動切換到框架并加載對應的。再次運行測試并檢查是否一切安好。 數據模型的首次迭代 接下來我們要開始完成我們的博客引擎的模型部分。 JPA入門 模型層是一個Play應用的核心(對于其他Web框架也同樣成立)。它是...
摘要:對的詳細配置已經超出了本教程的范圍,但大體上看上去像這樣然后在中加入下面一行,讓本地的反向代理能夠連接上你的應用這才只是個開始如果一路上你一直跟著本教程,你應該已經懂得如何開發一個應用了。 部署應用 如今我們已經完成了博客引擎了。讓我們來看一下一些部署Play應用的步驟。 定義一個框架ID 一般,你需要部署你的應用到一臺跟開發時不一樣的電腦。這臺電腦(很有可能是臺服務器)上面的P...
摘要:設置驗證碼任何人都可以在我們的博客下發布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。然后我們修改表單來顯示驗證碼,并把寫入隱藏的域里面。檢查驗證碼功能是否完成了。 設置驗證碼 任何人都可以在我們的博客下發布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。 生成驗證碼 如何利用Play框架來生成驗證碼?簡單來說,我們需要增...
閱讀 3427·2021-11-12 10:36
閱讀 2734·2021-11-11 16:55
閱讀 2958·2021-09-27 13:36
閱讀 1615·2021-08-05 10:01
閱讀 3556·2019-08-30 15:55
閱讀 765·2019-08-30 13:01
閱讀 1906·2019-08-29 17:16
閱讀 2376·2019-08-29 16:40