<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 193,  comments - 520,  trackbacks - 0
    我們從一個最簡單的登錄例子開始。

    最開始我們需要驗證在用戶名和密碼都正確的情況下,能夠正常登錄系統,我們這樣編寫測試代碼(以下都是偽代碼,使用TestNG和Selenium):

    @Test
    def should_login_success_with_exist_username_and_correct_password(){
        LoginPage page 
    = user.open(LoginPage,"/login.html")
        user.perform(
    "login",['user1','1234'],on(page))
        
    assert page.successLogin
    }


    恩,很不錯,運行一下,出現紅條。為什么呢?原來測試數據庫里沒有用戶名為user1的用戶,好吧,寫個數據庫數據初始化腳本。再運行,OK,綠條!

    那么,接下來我們再增加一個測試,需要覆蓋密碼錯誤時不能登錄系統的情況,很快測試就完成了:

    @Test
    def should_login_success_with_exist_username_and_incorrect_password(){
        LoginPage page 
    = user.open(LoginPage,"/login.html")
        user.perform(
    "login",['user1','4321'],on(page))
        
    assert page.successLogin,false
    }


    再運行一下測試,綠條。好啦,現在可以看下這段代碼,恩,有些重復,重構一下:

    @Test
    def should_login_success_with_exist_username_and_correct_password(){
        
    assert login('user1','1234')
    }

    @Test
    def should_login_success_with_exist_username_and_incorrect_password(){
        
    assert login('user1','4321'),false
    }

    def login(username,password){
        LoginPage page 
    = user.open(LoginPage,"/login.html")
        user.perform(
    "login",[username,password],on(page))
        
    return page.successLogin
    }


    重構完成,可以看到,我們的測試方法里現在沒有了任何行為,僅僅是數據!這樣讓我感覺有點怪,不管了,先用TestNG提供的@dataProvider整理一下:

    @Test(dataProvider="testdata")
    def testLogin(username,password,expected){
        LoginPage page 
    = user.open(LoginPage,"/login.html")
        user.perform(
    "login",[username,password],on(page))
        
    assert page.successLogin,expected
    }

    @DataProvider(name
    ="testdata")
    def Object[][] dataForLogin(){
        def data
    =new Object[2][]
        data[
    0]=['user1','1234',true] as Object[]
        data[
    1]=['user1','4321',false] as Object[]
    }


    測試方法只剩下了一個!如果要測試不存在的用戶不能登錄系統呢?很簡單,增加數據即可!

    @DataProvider(name="testdata")
    def Object[][] dataForLogin(){
        def data
    =new Object[2][]
        data[
    0]=['user1','1234',true] as Object[]
        data[
    1]=['user1','4321',false] as Object[]
        data[
    1]=['inexistuser','1234',false] as Object[]
    }


    在我們的測試方法里,測試數據和測試的行為進行了完全的分離。從系統的功能來說,功能一旦實現,那么就是一個黑盒,我們只要提供數據即可進行測試,這個數據包括兩部分:輸入和期待的輸出。我開始暗自嘀咕:難道我以前那么多的洋洋得意測試方法很多都是不需要的嗎?這些方式為什么會存在呢?恩,想起來了,這些方法是為了覆蓋功能的各個路徑的,是提高測試覆蓋率的。那么為什么會產生這么多的測試方法呢?哦,在這些測試方法里,測試數據和測試行為是耦合在一起的!

    我伸了個懶腰,突然想,這下好了,我已經封裝好了功能行為,QA想增加測試用例只需要自己增加數據就可以了,嘿嘿,爽啊。說曹操,QA到。QA mm說,你的某個功能實現有問題。我瞅了一眼,說,不可能啊(這是dev面對bug的第一反應),俺有測試的,持續集成一直是綠條的。QA mm說,在你的開發環境下測試是沒有問題的,但是在QA環境,因為數據庫變了,數據變了,應用服務器變了,所以會有些問題。我極不情愿的登錄到QA環境,一測試,還真是,郁悶。

    怎么辦?修復完BUG,第一反應就是自動化測試能不能跑在QA環境呢?一般情況下,這些測試需要干凈的測試環境,我們會制造很多的測試數據,可是在QA環境下,QA有她自己的測試數據,這些數據都不存在了哈。恩,看看剛才的測試代碼,哈,就用QA的數據也可以啊,心情愉悅的改下:

    @DataProvider(name="testdata")
    def Object[][] dataForLogin(){
        def data
    =new Object[2][]
        data[
    0]=['hrong','1234',true] as Object[]
        data[
    1]=['hrong','4321',false] as Object[]
        data[
    1]=['rhao','1234',false] as Object[]
    }


    OK,完成!為了該測試既能在開發測試環境運行又能在QA環境下運行,我們可以引入一個環境變量,將測試數據扔到文件里,通過環境變量來加載不同的測試數據(測試文件)。

    好吧,喝點東西(甲流很厲害,喝板藍根好了),總結一下:

    數據驅動測試:測試數據與測試行為分離,通過數據來驅動測試。

    好處:在對測試行為封裝好的情況下,QA mm能夠自己通過數據修改自動化測試;
          自動化測試能夠運行在多個環境下(開發環境、QA環境、產品環境)
          測試的可讀性
          測試方法大量壓縮


    適用范圍:功能測試(selenium測試)
              通過環境準備測試數據(非測試用例自己準備數據)


    可能存在的問題:比一般的測試編寫困難,特別是在靜態語言里

    最后:該文章的思考來自于徐昊在團隊內部的相應Session.






    http://www.tkk7.com/ronghao 榮浩原創,轉載請注明出處:)
    posted on 2010-01-17 12:08 ronghao 閱讀(2578) 評論(0)  編輯  收藏 所屬分類: 工作日志
    <2010年1月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    關注工作流和企業業務流程改進。現就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久亚洲国产精品123区| 亚洲美女在线国产| 亚洲国产电影在线观看| 在线涩涩免费观看国产精品 | 久久国产免费一区二区三区| 久久精品国产精品亚洲下载| 一级视频免费观看| 亚洲Av无码国产情品久久| 一级毛片正片免费视频手机看| 免费人成网站在线高清| 一级特黄a免费大片| 亚洲成a人一区二区三区| 黄视频在线观看免费| 亚洲综合av永久无码精品一区二区| 9久热精品免费观看视频| 亚洲中文字幕无码爆乳AV| 免费在线看黄的网站| 亚洲欧洲精品国产区| 日韩免费观看视频| 深夜A级毛片视频免费| 激情综合色五月丁香六月亚洲| 最近国语视频在线观看免费播放 | 成在线人永久免费视频播放| 男男gay做爽爽的视频免费| 国产成人高清亚洲| 久9热免费精品视频在线观看| 91亚洲自偷在线观看国产馆| 日韩激情无码免费毛片| gogo免费在线观看| 中文字幕亚洲免费无线观看日本| 成人免费无码大片A毛片抽搐色欲 成人免费无码大片a毛片 | 日本亚洲国产一区二区三区| 最近2022中文字幕免费视频| 国产AV旡码专区亚洲AV苍井空| 亚洲福利在线播放| 精品女同一区二区三区免费站| 亚洲av日韩aⅴ无码色老头| 亚洲精品无码Av人在线观看国产| 四虎在线视频免费观看视频| 男女男精品网站免费观看| 亚洲色图黄色小说|