成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[翻譯]Play框架1.2.7版本教程(10) - 完成應(yīng)用測試

_Dreams / 1167人閱讀

摘要:完成應(yīng)用測試我們已經(jīng)完成了我們想要?jiǎng)?chuàng)建的博客引擎。當(dāng)然我們已經(jīng)完成了測試所有模型層的功能。評估代碼覆蓋率當(dāng)然我們還沒有完成應(yīng)用所需的所有測試用例。如你所見,我們遠(yuǎn)遠(yuǎn)沒有完成對應(yīng)用的全面測試。

完成應(yīng)用測試

我們已經(jīng)完成了我們想要?jiǎng)?chuàng)建的博客引擎。不過這個(gè)項(xiàng)目尚未完全結(jié)束。為了保證代碼的質(zhì)量,我們需要添加更多的測試。

當(dāng)然我們已經(jīng)完成了測試所有模型層的功能。所以博客引擎的核心功能已經(jīng)被測試過了。但是一個(gè)Web應(yīng)用并不只有模型層。我們需要確保Web交互界面是否完好。這需要測試引擎的控制層。但是我們甚至需要測試UI界面,比如我們的Javascript代碼。

測試控制層

通過JUnit,你可以直接測試應(yīng)用的控制層。我們將這些測試稱之為功能測試。因?yàn)槲覀儠?huì)測試應(yīng)用完整的功能。

一個(gè)功能測試會(huì)調(diào)用Play的ActionInvoker,模擬一個(gè)HTTP請求。我們需要提供HTTP方法,一個(gè)URI和HTTP參數(shù)。Play會(huì)根據(jù)這個(gè)請求,找到路由,接著調(diào)用對應(yīng)的action,最后返回一個(gè)響應(yīng)。你可以分析它,看看響應(yīng)是否在意料之中。

先寫第一個(gè)功能測試。打開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ù)。這個(gè)測試僅僅是用于檢測主頁是否正常(一般/URL會(huì)渲染一個(gè)HTML文件,并返回‘200 OK’狀態(tài)碼)。

現(xiàn)在我們將檢測管理面板的安全是否禁得住考驗(yàn)。給ApplicationTest.java添加新的測試:

…
@Test
public void testAdminSecurity() {
    Response response = GET("/admin");
    assertStatus(302, response);
    assertHeaderEquals("Location", "/login", response);
}
…

使用play test命令運(yùn)行你的yabe應(yīng)用,打開http://localhost:9000/@tests,選擇ApplicationTest.java用例,然后運(yùn)行它。

變綠了嗎?

現(xiàn)在,我們可以對應(yīng)用的全部功能進(jìn)行同樣的測試,但這并不是測試一個(gè)基于HTML的Web應(yīng)用的最佳方式,我們的博客引擎需要在Web瀏覽器中執(zhí)行,如果能夠在真實(shí)的瀏覽器中進(jìn)行測試,這就是Play的Selenium測試所做的事情。

一個(gè)Selenium測試套件一般是個(gè)HTML文件。Selenium所使用的HTML語法有點(diǎn)令人乏味(就像是一個(gè)HTML表格元素一樣)。好消息是,Play可以讓你使用模板引擎以及一些支持簡化的Selenium語法的標(biāo)簽來生成它。這也意味著,你可以利用Play模板的表達(dá)能力(條件語句,循環(huán)語句等等)來生成許多復(fù)雜的測試。

  

當(dāng)然,如果需要的話,你也可以不用模板的生成功能,直接撰寫Selenium頁面。其實(shí),使用Selenium專用工具,比如Selenium IDE,來生成Selenium測試頁面也是不錯(cuò)的選擇。

一個(gè)剛創(chuàng)建的Play應(yīng)用已經(jīng)自帶了一個(gè)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ùn)行這個(gè)測試應(yīng)該不會(huì)出現(xiàn)任何問題。它只是打開主頁,然后檢測頁面中是否包括"Application error"文本。

不過,一如任何復(fù)雜的測試,在瀏覽應(yīng)用并進(jìn)行測試之前,你都需要設(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}

還需要檢查另一個(gè)重要的事情,就是在每個(gè)測試開始之前要有一個(gè)新的用戶會(huì)話。這個(gè)會(huì)話將保持在瀏覽器的持久cookie中,如果不做清理,它會(huì)在兩個(gè)連續(xù)的測試之間保持。

所以我們的測試之前,先添加一個(gè)特殊的命令:

#{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ùn)行這個(gè)測試,確保一切安好。應(yīng)該會(huì)是全綠的結(jié)果。

所以我們可以開始寫更復(fù)雜的測試了。打開主頁面,檢查是否展示了默認(rèn)的文章。

#{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。

運(yùn)行它。(通過在新的標(biāo)簽頁打開鏈接,你可以在一個(gè)不同的窗口中運(yùn)行)。

現(xiàn)在我們開始測試評論框。添加一個(gè)新的#{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}

然后運(yùn)行它。啊,出錯(cuò)了;看來這里有點(diǎn)問題。

原來是驗(yàn)證碼的問題。這個(gè)可模擬不了……只好作弊了嘿嘿。在測試模式中,我們可需要把任何針對驗(yàn)證碼的輸入都當(dāng)做正確的。而在測試模式下,框架的id是test。所以修改掉yabe/app/controllers/Application.javapostComment action來跳過測試模式下的驗(yàn)證:

…
if(!Play.id.equals("test")) {
    validation.equals(code, Cache.get(randomID)).message("Invalid code. Please type it again");
}
…

現(xiàn)在修改下測試用例。驗(yàn)證碼那一欄就隨便亂寫好了:

…
type("author", "Me")
type("code", "XXXXX")
clickAndWait("css=input[type=submit]")
…

然后重新運(yùn)行測試,這下應(yīng)該通過了。

評估代碼覆蓋率

當(dāng)然我們還沒有完成應(yīng)用所需的所有測試用例。但是對于我們的教程來說已經(jīng)足夠了。在現(xiàn)實(shí)的應(yīng)用中,我們怎么知道是否已經(jīng)寫了足夠的測試用例?我們需要一個(gè)代碼覆蓋率的概念。

Cobertura 模塊使用Cobertura工具生成代碼覆蓋率報(bào)告。使用install命令安裝這個(gè)模塊:

play install cobertura-{version}

我們僅需在測試模式下啟動(dòng)這個(gè)模塊。所以在application.conf文件下添加這一行:

# Import the cobertura module in test mode
%test.module.cobertura=${play.path}/modules/cobertura

現(xiàn)在在測試模式下重新啟動(dòng)應(yīng)用,打開http://localhost:9000/@tests,選中所有測試并運(yùn)行。應(yīng)該是綠光滿面的節(jié)奏。

在所有的測試結(jié)束后,停止應(yīng)用,cobertura將生成代碼覆蓋率報(bào)告。接著你可以在瀏覽器打開yabe/test-result/code-coverage/index.html,看一下那份報(bào)告。

如果重新啟動(dòng)應(yīng)用,你也可以在http://localhost:9000/@cobertura看到它。

如你所見,我們遠(yuǎn)遠(yuǎn)沒有完成對應(yīng)用的全面測試。一個(gè)好的測試覆蓋率應(yīng)該盡量達(dá)到100%,即使檢查所有的代碼是幾乎不可能的。畢竟我們有時(shí)候不得不在測試模式下做一些變通,正如我們曾對驗(yàn)證碼做過的一樣。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64094.html

相關(guān)文章

  • [翻譯]Play框架1.2.7版本教程(3) - 建立第一個(gè)頁面

    摘要:所以任務(wù)會(huì)在第一個(gè)請求時(shí)同步執(zhí)行。修改來展示這些對象你可以閱讀模板是怎么工作的。標(biāo)簽只有兩個(gè)參數(shù)用于展示的文章對象以及展示的模式可以是全文,全文附評論,預(yù)告中的一種現(xiàn)在我們可以將冗余代碼替換成標(biāo)簽,重寫主頁重載頁面,檢查是否一切安好。 建立第一個(gè)頁面 既然我們完成了數(shù)據(jù)模型的初步定義,是時(shí)候開始創(chuàng)建應(yīng)用的頁面了。這個(gè)頁面將僅僅展示最近的博文,以及一個(gè)舊文章的列表。 下面是我們想要實(shí)...

    inapt 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(1)

    摘要:確保你的文本編輯器已經(jīng)做了相應(yīng)的配置。第一個(gè),會(huì)自動(dòng)監(jiān)測源代碼的改變并在運(yùn)行時(shí)自動(dòng)重載。檢查下面的一行是否出現(xiàn)在應(yīng)用日志中使用版本控制系統(tǒng)來追蹤變化當(dāng)你開發(fā)一個(gè)項(xiàng)目時(shí),最好使用版本控制系統(tǒng)來存儲(chǔ)你的源代碼。 Play是一個(gè)Java Web敏捷開發(fā)的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個(gè)教程,是因...

    solocoder 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(2) - 數(shù)據(jù)模型的首次迭代

    摘要:數(shù)據(jù)模型的首次迭代接下來我們要開始完成我們的博客引擎的模型部分。一個(gè)普遍的選擇是使用關(guān)系型數(shù)據(jù)庫。不要認(rèn)為生成的成員變量是函數(shù)變量,其實(shí)它是技術(shù)變量。當(dāng)你在中運(yùn)行應(yīng)用時(shí),會(huì)自動(dòng)切換到框架并加載對應(yīng)的。再次運(yùn)行測試并檢查是否一切安好。 數(shù)據(jù)模型的首次迭代 接下來我們要開始完成我們的博客引擎的模型部分。 JPA入門 模型層是一個(gè)Play應(yīng)用的核心(對于其他Web框架也同樣成立)。它是...

    charles_paul 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(11) - 部署應(yīng)用

    摘要:對的詳細(xì)配置已經(jīng)超出了本教程的范圍,但大體上看上去像這樣然后在中加入下面一行,讓本地的反向代理能夠連接上你的應(yīng)用這才只是個(gè)開始如果一路上你一直跟著本教程,你應(yīng)該已經(jīng)懂得如何開發(fā)一個(gè)應(yīng)用了。 部署應(yīng)用 如今我們已經(jīng)完成了博客引擎了。讓我們來看一下一些部署Play應(yīng)用的步驟。 定義一個(gè)框架ID 一般,你需要部署你的應(yīng)用到一臺(tái)跟開發(fā)時(shí)不一樣的電腦。這臺(tái)電腦(很有可能是臺(tái)服務(wù)器)上面的P...

    Binguner 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(5) - 設(shè)置驗(yàn)證碼

    摘要:設(shè)置驗(yàn)證碼任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個(gè)簡單的防范方法是設(shè)置驗(yàn)證碼。然后我們修改表單來顯示驗(yàn)證碼,并把寫入隱藏的域里面。檢查驗(yàn)證碼功能是否完成了。 設(shè)置驗(yàn)證碼 任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個(gè)簡單的防范方法是設(shè)置驗(yàn)證碼。 生成驗(yàn)證碼 如何利用Play框架來生成驗(yàn)證碼?簡單來說,我們需要增...

    姘存按 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<