歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Calabash+Gearman實現多手機同步測試機制

Calabash+Gearman實現多手機同步測試機制

日期:2017/3/1 9:35:01   编辑:Linux編程

Calabash-Android是支持android的UI自動化測試框架,但不支持多手機同步測試。本文介紹如何利用任務分發系統Gearman的消息同步機制,配合Calabash實現多手機同步測試機制。

背景介紹

Calabash-android是支持android的UI自動化測試框架。

Gearman是一個分發任務的程序框架,可以用在各種場合,與Hadoop相比,Gearman更偏向於任務分發功能。它的 任務分布非常 簡單,簡單得可以只需要用腳本即可完成。

gearman

Ubuntu上安裝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

啟動gearman job server,作為後台服務運行:

$ sudo gearmand -d

多手機同步測試舉例

假設要測試微信的發送消息功能,calabash的測試用例可以按如下方式撰寫:

AA-send-message-to-BB–role-AA.feature:

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 #我能看到對方說的話
...

AA-send-message-to-BB–role-BB.feature:

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說,你好!" #我能看到自己說的話
...

命令行終端1中運行AA-send-message-to-BB–role-AA.feature

$ 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

命令行終端2中運行AA-send-message-to-BB–role-BB.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

calabash中封裝gearman命令實現同步機制

sync_step.rb:

# 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

calabash_steps.rb:

# encoding: utf-8
require 'calabash-android/calabash_steps'

Then /^I see \$([^\$]*)$/ do |text_ev|
text = ENV[text_ev]
steps %{
Then I see "#{text}"
}
end

Copyright © Linux教程網 All Rights Reserved