摘要:android
Calabash-android是支持android的UI自動化測試框架,但不支持多手機同步測試。本文介紹如何利用任務分發系統Gearman的消息同步機制,配合Gearman實現多手機同步測試機制。bash
Calabash-android是支持android的UI自動化測試框架。 http://www.oschina.net/p/calabash-android微信
Gearman是一個分發任務的程序框架,能夠用在各類場合,與Hadoop相比,Gearman更偏向於任務分發功能。它的 任務分佈很是 簡單,簡單得能夠只須要用腳本便可完成。 http://www.oschina.net/p/gearman 框架
$ sudo apt-get install gearman-job-server $ gearmand -V gearmand 1.0.6 - https://bugs.launchpad.net/gearmand $ sudo apt-get install gearman-tools $ gearman -H
$ sudo gearmand -d
假設要測試微信的發送消息功能,calabash的測試用例能夠按以下方式撰寫:oop
Feature: 微信測試發送消息給好友-角色A Scenario: 微信測試發送消息給好友 ...打開微信軟件,做爲賬號A登陸,進入與好友B的聊天窗口 When I send weixin message "A說,你好!" # 微信聊天窗口中發送消息 And I send sync message "A說,你好!" to role "BB" Then I see "A說,你好!" #我能看到本身說的話 When I wait sync message $AA_sync_1 as role "AA" Then I see $AA_sync_1 #我能看到對方說的話 ...
Feature: 微信測試發送消息給好友-角色B Scenario: 微信測試發送消息給好友 ...打開微信軟件,做爲賬號B登陸,進入與好友A的聊天窗口 When I wait sync message $BB_sync_1 as role "BB" Then I see $BB_sync_1 #我能看到對方說的話 When I send weixin message "B說,你好!" # 微信聊天窗口中發送消息 And I send sync message "B說,你好!" to role "AA" Then I see "B說,你好!" #我能看到本身說的話 ...
$ export ADB_DEVICE_ARG=HTC-G9 $ export GEARMAN_JOB_SERVER=localhost $ calabash-android run weixin.apk -r features/ features/AA-send-message-to-BB--role-AA.feature
$ export ADB_DEVICE_ARG=HWAWEI-P7 $ export GEARMAN_JOB_SERVER=localhost $ calabash-android run weixin.apk -r features/ features/AA-send-message-to-BB--role-BB.feature
# encoding: utf-8 require 'calabash-android/calabash_steps' When /^I wait sync message \$([^\$]*) as role "([^\"]*)"$/ do |msg_ev, role| gearman_job_server=ENV["GEARMAN_JOB_SERVER"] fail "環境變量::GEARMAN_JOB_SERVER::未定義! 設置方法: export GEARMAN_JOB_SERVER=localhost" if ( gearman_job_server == nil) uuid=`uuidgen`.strip cmd="gearman -h #{gearman_job_server} -t 30000 -w -c 1 -f receiver_#{role} -- tee /tmp/#{role}-#{uuid}; cat /tmp/#{role}-#{uuid}" puts "角色#{role}準備執行命令:#{cmd}" message=`#{cmd}`.strip fail "未收到同步消息" if ( message == "" ) ENV[msg_ev]=message puts "角色#{role}接收到同步消息: #{ENV[msg_ev]}" end When /^I send sync message "([^\"]*)" to role "([^\"]*)"$/ do |msg, role| gearman_job_server=ENV["GEARMAN_JOB_SERVER"] fail "環境變量::GEARMAN_JOB_SERVER::未定義! 設置方法: export GEARMAN_JOB_SERVER=localhost" if ( gearman_job_server == nil) fail "sync message 爲空" if ( msg == "" ) cmd="echo '#{msg}' | gearman -h #{gearman_job_server} -t 30000 -f receiver_#{role}" puts "角色#{role}準備執行命令:#{cmd}" response=`#{cmd}`.strip fail "發送同步消息失敗" if ( response != msg ) puts "發送同步消息給角色#{role}: #{msg}" end When /^I send sync message \$([^\$]*) to role "([^\"]*)"$/ do |msg_ev, role| gearman_job_server=ENV["GEARMAN_JOB_SERVER"] fail "環境變量::GEARMAN_JOB_SERVER::未定義! 設置方法: export GEARMAN_JOB_SERVER=localhost" if ( gearman_job_server == nil) msg=ENV[msg_ev] response=`echo "${msg}" | gearman -h #{gearman_job_server} -f receiver_#{role}` fail "發送同步消息失敗" if ( response != msg ) puts "發送同步消息給角色#{role}: #{msg}" end
# encoding: utf-8 require 'calabash-android/calabash_steps' Then /^I see \$([^\$]*)$/ do |text_ev| text = ENV[text_ev] steps %{ Then I see "#{text}" } end