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

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

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

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

    移動應(yīng)用測試框架—Calabash Android 簡介

    什么是 Calabash
      Calabash 是一個自動化測試框架,它可以測試 Android 和 iOS 原生應(yīng)用和混合應(yīng)用。
      它有:
      calabash-android
      calabash-ios
      主頁: http://calabash.sh
      Calabash-android介紹
      Calabash-android 是支持 android 的 UI 自動化測試框架,PC 端使用了 cucumber 框架,通過 http 和 json 與模擬器和真機上安裝的測試 apk 通信,測試 apk 調(diào)用 Robotium 的方法來進行 UI 自動化測試,支持 webview 操作。
      Calabash-android 架構(gòu)圖
      Features —— 這里的 feature 就是 cucumber 的 feature,用來描述 user stories 。
      Step Definitions —— Calabash Android 事先已經(jīng)定義了一些通用的 step。你可以根據(jù)自己的需求,定義更加復(fù)雜的步驟。
      Your app —— 測試之前,你不必對你的應(yīng)用修改。(這里其實是有問題,后面我們會說到。)
      Instrumentation Test Server —— 這是一個應(yīng)用,在運行測試的時候會被安裝到設(shè)備中去。 這個應(yīng)用是基于 Android SDK 里的 ActivityInstrumentationTestCase2。它是 Calabash Android 框架的一部分。Robotium 就集成在這個應(yīng)用里。
      Calabash-android 環(huán)境搭建
      ruby 環(huán)境
      rvm
      rbenv
      RubyInstaller.org for windows
      Android 開發(fā)環(huán)境
      JAVA
      Android SDK
      Ant
      指定 JAVA 環(huán)境變量, Android SDK 環(huán)境變量(ANDROID_HOME), Ant 加入到 PATH 中去。
      安裝 Calabash-android
      gem install calabash-android
      sudo gem install calabash-android # 如果權(quán)限不夠用這個。
      如有疑問,請參考: https://github.com/calabash/calabash-android/blob/master/documentation/installation.md
      創(chuàng)建 calabash-android 的骨架
      calabash-android gen
      會生成如下的目錄結(jié)構(gòu):
      ?  calabash  tree
      .
      features
      |_support
      | |_app_installation_hooks.rb
      | |_app_life_cycle_hooks.rb
      | |_env.rb
      |_step_definitions
      | |_calabash_steps.rb
      |_my_first.feature
    寫測試用例
      像一般的 cucumber 測試一樣,我們只要在 feature 文件里添加測試用例即可。比如我們測試 ContactManager.apk (android sdk sample 里面的, Appium 也用這個 apk)。
      我們想實現(xiàn),
      打開這個應(yīng)用
      點擊 Add Contact 按鈕
      添加 Contact Name 為 hello
      添加 Contact Phone 為 13817861875
      添加 Contact Email 為 hengwen@hotmail.com
      保存
     所以我們的 feature 應(yīng)該是這樣的:
      Feature: Login feature  Scenario: As a valid user I can log into my app    When I press "Add Contact"
      Then I see "Target Account"
      Then I enter "hello" into input field number 1    Then I enter "13817861875" into input field number 2    Then I enter "hengwen@hotmail.com" into input field number 3    When I press "Save"
      Then I wait for 1 second    Then I toggle checkbox number 1    Then I see "hello"
      這里 input field number 就針對了 ContactAdder Activity 中輸入框。我現(xiàn)在這樣寫其實不太友好,比較好的方式是進行再次封裝,對 DSL 撰寫者透明。比如:
    When I enter "hello" as "Contact Name"
    step_definition
    When (/^I enter "([^\"]*)" as "([^\"]*)"$/) do | text, target |
    index = case target
    when "Contact Name": 1
    ...
    end
    steps %{
    Then I enter #{text} into input field number #{index}
    }end
      這樣 feature 可讀性會強一點。
      運行 feature
      在運行之前,我們對 apk 還是得處理下,否則會遇到一些問題。
      App did not start (RuntimeError)
      因為calabash-android的client和test server需要通信,所以要在 AndroidManifest.xml 中添加權(quán)限:
      <uses-permission android:name="android.permission.INTERNET" />
      ContacterManager 代碼本身的問題
      由于 ContacerManager 運行時候,需要你一定要有一個賬戶,如果沒有賬戶 Save 的時候會出錯。為了便于運行,我們要修改下。
      源代碼地址在 $ANDROID_HOME/samples/android-19/legacy/ContactManager,大家自己去找。
      需要修改 com.example.android.contactmanager.ContactAdder 類里面的 createContactEntry 方法,我們需要對 mSelectedAccount 進行判斷, 修改地方如下:
    // Prepare contact creation request
    //
    // Note: We use RawContacts because this data must be associated with a particular account.
    //       The system will aggregate this with any other data for this contact and create a
    //       coresponding entry in the ContactsContract.Contacts provider for us.
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    if(mSelectedAccount != null ) {
    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, mSelectedAccount.getType())
    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, mSelectedAccount.getName())
    .build());
    } else {
    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
    .build());
    }....
    if (mSelectedAccount != null) {
    // Ask the Contact provider to create a new contact
    Log.i(TAG,"Selected account: " + mSelectedAccount.getName() + " (" +
    mSelectedAccount.getType() + ")");
    } else {
    Log.i(TAG,"No selected account");
    }
      代碼修改好之后,導(dǎo)出 apk 文件。
      運行很簡單:
      calabash-android run <apk>
      如果遇到簽名問題,請用: calabash-android resign apk。
      可以看看我運行的情況:
    ?  calabash  calabash-android run ContactManager.apk
    Feature: Login feature
    Scenario: As a valid user I can log into my app                # features/my_first.feature:33135 KB/s (556639 bytes in 0.173s)3315 KB/s (26234 bytes in 0.007s)
    When I press "Add Contact"                                   # calabash-android-0.4.21/lib/calabash-android/steps/press_button_steps.rb:17
    Then I see "Target Account"                                  # calabash-android-0.4.21/lib/calabash-android/steps/assert_steps.rb:5
    Then I enter "hello" into input field number 1               # calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5
    Then I enter "13817861875" into input field number 2         # calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5
    Then I enter "hengwen@hotmail.com" into input field number 3 # calabash-android-0.4.21/lib/calabash-android/steps/enter_text_steps.rb:5
    When I press "Save"                                          # calabash-android-0.4.21/lib/calabash-android/steps/press_button_steps.rb:17
    Then I wait for 1 second                                     # calabash-android-0.4.21/lib/calabash-android/steps/progress_steps.rb:18
    Then I toggle checkbox number 1                              # calabash-android-0.4.21/lib/calabash-android/steps/check_box_steps.rb:1
    Then I see "hello"                                           # calabash-android-0.4.21/lib/calabash-android/steps/assert_steps.rb:51 scenario (1 passed)9 steps (9 passed)0m28.304s
    All pass!
      大家看到 gif 是 failed,是因為在模擬器上運行的。而上面全部通過的是我在海信手機上運行的。環(huán)境不一樣,略有差異。
      總結(jié)
      本文是對 calabash-android 的一個簡單介紹,做的是拋磚引玉的活。移動測試框架并非 Appium 一家,TesterHome 希望其他框架的話題也能熱火起來。watch and learn!

    posted on 2014-12-23 00:15 順其自然EVO 閱讀(840) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

    <2014年12月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲第一区香蕉_国产a| 国产亚洲精aa在线看| 女人毛片a级大学毛片免费| eeuss影院ss奇兵免费com| 亚洲资源最新版在线观看| 亚洲色欲色欲www在线丝| 亚洲女子高潮不断爆白浆| 日本免费一本天堂在线| 91人人区免费区人人| 国产成人精品亚洲2020| 久久久无码精品亚洲日韩蜜桃| 国产三级免费观看| 亚洲免费在线视频观看| 国产一级a毛一级a看免费视频| 激情小说亚洲图片| 久久久久久久尹人综合网亚洲| 无人在线观看免费高清| 特级毛片aaaa级毛片免费| 亚洲中文字幕乱码一区| 亚洲理论片在线中文字幕| 国产AV无码专区亚洲AV毛网站 | 久久久久久久综合日本亚洲| 亚洲国产精品成人一区| 久久免费精品一区二区| 国产精品福利片免费看| 九九免费观看全部免费视频| 综合偷自拍亚洲乱中文字幕| 亚洲熟妇无码一区二区三区| 亚洲a级片在线观看| 亚洲欧洲国产成人精品| 久久夜色精品国产噜噜噜亚洲AV| 亚洲av无码国产精品夜色午夜| 亚洲视频在线精品| 亚洲成av人在片观看| 亚洲国产一区二区视频网站| 免费萌白酱国产一区二区| 四虎永久免费地址在线观看| 国产一级大片免费看| 又粗又大又长又爽免费视频| 免费中文字幕在线| 亚洲AV伊人久久青青草原|