摘要:完成應(yīng)用測試我們已經(jīng)完成了我們想要創(chuàng)建的博客引擎。當(dāng)然我們已經(jīng)完成了測試所有模型層的功能。評估代碼覆蓋率當(dāng)然我們還沒有完成應(yīng)用所需的所有測試用例。如你所見,我們遠遠沒有完成對應(yīng)用的全面測試。
完成應(yīng)用測試
我們已經(jīng)完成了我們想要創(chuàng)建的博客引擎。不過這個項目尚未完全結(jié)束。為了保證代碼的質(zhì)量,我們需要添加更多的測試。
當(dāng)然我們已經(jīng)完成了測試所有模型層的功能。所以博客引擎的核心功能已經(jīng)被測試過了。但是一個Web應(yīng)用并不只有模型層。我們需要確保Web交互界面是否完好。這需要測試引擎的控制層。但是我們甚至需要測試UI界面,比如我們的Javascript代碼。
測試控制層通過JUnit,你可以直接測試應(yīng)用的控制層。我們將這些測試稱之為功能測試。因為我們會測試應(yīng)用完整的功能。
一個功能測試會調(diào)用Play的ActionInvoker,模擬一個HTTP請求。我們需要提供HTTP方法,一個URI和HTTP參數(shù)。Play會根據(jù)這個請求,找到路由,接著調(diào)用對應(yīng)的action,最后返回一個響應(yīng)。你可以分析它,看看響應(yīng)是否在意料之中。
先寫第一個功能測試。打開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父類來獲取輔助函數(shù)。這個測試僅僅是用于檢測主頁是否正常(一般/URL會渲染一個HTML文件,并返回‘200 OK’狀態(tài)碼)。
現(xiàn)在我們將檢測管理面板的安全是否禁得住考驗。給ApplicationTest.java添加新的測試:
… @Test public void testAdminSecurity() { Response response = GET("/admin"); assertStatus(302, response); assertHeaderEquals("Location", "/login", response); } …
使用play test命令運行你的yabe應(yīng)用,打開http://localhost:9000/@tests,選擇ApplicationTest.java用例,然后運行它。
變綠了嗎?
現(xiàn)在,我們可以對應(yīng)用的全部功能進行同樣的測試,但這并不是測試一個基于HTML的Web應(yīng)用的最佳方式,我們的博客引擎需要在Web瀏覽器中執(zhí)行,如果能夠在真實的瀏覽器中進行測試,這就是Play的Selenium測試所做的事情。
一個Selenium測試套件一般是個HTML文件。Selenium所使用的HTML語法有點令人乏味(就像是一個HTML表格元素一樣)。好消息是,Play可以讓你使用模板引擎以及一些支持簡化的Selenium語法的標(biāo)簽來生成它。這也意味著,你可以利用Play模板的表達能力(條件語句,循環(huán)語句等等)來生成許多復(fù)雜的測試。
當(dāng)然,如果需要的話,你也可以不用模板的生成功能,直接撰寫Selenium頁面。其實,使用Selenium專用工具,比如Selenium IDE,來生成Selenium測試頁面也是不錯的選擇。
一個剛創(chuàng)建的Play應(yīng)用已經(jīng)自帶了一個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上運行這個測試應(yīng)該不會出現(xiàn)任何問題。它只是打開主頁,然后檢測頁面中是否包括"Application error"文本。
不過,一如任何復(fù)雜的測試,在瀏覽應(yīng)用并進行測試之前,你都需要設(shè)置一些初始數(shù)據(jù)。我們將重用之前用過的Fixture和yabe/test/data,yml。要在測試開始之前引入數(shù)據(jù),僅需使用#{fixture /}標(biāo)簽:
#{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中,如果不做清理,它會在兩個連續(xù)的測試之間保持。
所以我們的測試之前,先添加一個特殊的命令:
#{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}
運行這個測試,確保一切安好。應(yīng)該會是全綠的結(jié)果。
所以我們可以開始寫更復(fù)雜的測試了。打開主頁面,檢查是否展示了默認的文章。
#{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}
我們使用的是標(biāo)準(zhǔn)的Selenium語法,叫做Selenese。
運行它。(通過在新的標(biāo)簽頁打開鏈接,你可以在一個不同的窗口中運行)。
現(xiàn)在我們開始測試評論框。添加一個新的#{selenium /}標(biāo)簽到模板中:
#{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}
然后運行它。啊,出錯了;看來這里有點問題。
原來是驗證碼的問題。這個可模擬不了……只好作弊了嘿嘿。在測試模式中,我們可需要把任何針對驗證碼的輸入都當(dāng)做正確的。而在測試模式下,框架的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"); } …
現(xiàn)在修改下測試用例。驗證碼那一欄就隨便亂寫好了:
… type("author", "Me") type("code", "XXXXX") clickAndWait("css=input[type=submit]") …
然后重新運行測試,這下應(yīng)該通過了。
評估代碼覆蓋率當(dāng)然我們還沒有完成應(yīng)用所需的所有測試用例。但是對于我們的教程來說已經(jīng)足夠了。在現(xiàn)實的應(yīng)用中,我們怎么知道是否已經(jīng)寫了足夠的測試用例?我們需要一個代碼覆蓋率的概念。
Cobertura 模塊使用Cobertura工具生成代碼覆蓋率報告。使用install命令安裝這個模塊:
play install cobertura-{version}
我們僅需在測試模式下啟動這個模塊。所以在application.conf文件下添加這一行:
# Import the cobertura module in test mode %test.module.cobertura=${play.path}/modules/cobertura
現(xiàn)在在測試模式下重新啟動應(yīng)用,打開http://localhost:9000/@tests,選中所有測試并運行。應(yīng)該是綠光滿面的節(jié)奏。
在所有的測試結(jié)束后,停止應(yīng)用,cobertura將生成代碼覆蓋率報告。接著你可以在瀏覽器打開yabe/test-result/code-coverage/index.html,看一下那份報告。
如果重新啟動應(yīng)用,你也可以在http://localhost:9000/@cobertura看到它。
如你所見,我們遠遠沒有完成對應(yīng)用的全面測試。一個好的測試覆蓋率應(yīng)該盡量達到100%,即使檢查所有的代碼是幾乎不可能的。畢竟我們有時候不得不在測試模式下做一些變通,正如我們曾對驗證碼做過的一樣。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64094.html
摘要:所以任務(wù)會在第一個請求時同步執(zhí)行。修改來展示這些對象你可以閱讀模板是怎么工作的。標(biāo)簽只有兩個參數(shù)用于展示的文章對象以及展示的模式可以是全文,全文附評論,預(yù)告中的一種現(xiàn)在我們可以將冗余代碼替換成標(biāo)簽,重寫主頁重載頁面,檢查是否一切安好。 建立第一個頁面 既然我們完成了數(shù)據(jù)模型的初步定義,是時候開始創(chuàng)建應(yīng)用的頁面了。這個頁面將僅僅展示最近的博文,以及一個舊文章的列表。 下面是我們想要實...
摘要:確保你的文本編輯器已經(jīng)做了相應(yīng)的配置。第一個,會自動監(jiān)測源代碼的改變并在運行時自動重載。檢查下面的一行是否出現(xiàn)在應(yīng)用日志中使用版本控制系統(tǒng)來追蹤變化當(dāng)你開發(fā)一個項目時,最好使用版本控制系統(tǒng)來存儲你的源代碼。 Play是一個Java Web敏捷開發(fā)的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個教程,是因...
摘要:數(shù)據(jù)模型的首次迭代接下來我們要開始完成我們的博客引擎的模型部分。一個普遍的選擇是使用關(guān)系型數(shù)據(jù)庫。不要認為生成的成員變量是函數(shù)變量,其實它是技術(shù)變量。當(dāng)你在中運行應(yīng)用時,會自動切換到框架并加載對應(yīng)的。再次運行測試并檢查是否一切安好。 數(shù)據(jù)模型的首次迭代 接下來我們要開始完成我們的博客引擎的模型部分。 JPA入門 模型層是一個Play應(yīng)用的核心(對于其他Web框架也同樣成立)。它是...
摘要:對的詳細配置已經(jīng)超出了本教程的范圍,但大體上看上去像這樣然后在中加入下面一行,讓本地的反向代理能夠連接上你的應(yīng)用這才只是個開始如果一路上你一直跟著本教程,你應(yīng)該已經(jīng)懂得如何開發(fā)一個應(yīng)用了。 部署應(yīng)用 如今我們已經(jīng)完成了博客引擎了。讓我們來看一下一些部署Play應(yīng)用的步驟。 定義一個框架ID 一般,你需要部署你的應(yīng)用到一臺跟開發(fā)時不一樣的電腦。這臺電腦(很有可能是臺服務(wù)器)上面的P...
摘要:設(shè)置驗證碼任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設(shè)置驗證碼。然后我們修改表單來顯示驗證碼,并把寫入隱藏的域里面。檢查驗證碼功能是否完成了。 設(shè)置驗證碼 任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設(shè)置驗證碼。 生成驗證碼 如何利用Play框架來生成驗證碼?簡單來說,我們需要增...
閱讀 3482·2021-11-12 10:36
閱讀 2833·2021-11-11 16:55
閱讀 3059·2021-09-27 13:36
閱讀 1682·2021-08-05 10:01
閱讀 3636·2019-08-30 15:55
閱讀 847·2019-08-30 13:01
閱讀 1967·2019-08-29 17:16
閱讀 2432·2019-08-29 16:40