之前Appium的環境已經配置完成(參考Robotframework-Appium系列:安裝配置),接下來就是如何使用Appium來完成我們的apk的測試工作。
一、環境准備
所需的軟件列表如下
- Robotframework
- Appium
- Android模擬器--夜神模擬器
- 測試的apk文件
- uiautomatorviewer:apk軟件定位工具
啟動上述列出的軟件,如截圖所示
-
RobotFramework打開界面如圖所示
-
Appium配置界面和啟動界面如圖所示
說明
1. 未啟動顯示的是三角形,啟動之后變為正方形
2. 測試的應用程序的路徑
3. 測試的應用程序的包名以及activity名,在路徑輸入之后,會自動顯示,不用修改,使用默認
4. 測試apk的平台和使用的工具,這里選擇的是Android6.0,Appium工具
-
Appium啟動成功界面如圖所示
-
Android模擬器--夜神模擬器,如圖所示
在第一次使用夜神模擬器的時候,會自動安裝Appium Settings和Unlock兩個工具;apk文件可以直接拖到夜神模擬器中,模擬器會自動安裝。
- uiautomatorviewer:apk軟件定位工具,本機啟動位置和截圖如圖所示
二、RobotFramework關鍵字封裝
uiautomatorviewer定位apk元素
安裝apk完成之后,打開需要測試的apk,點擊圖標所示1,定位元素如圖
說明
1. 圖標1處,打開apk后,點擊此處可以定位當前頁面中的所有元素信息
2. 圖標2處,定位的用戶名的具體元素定位
項目結構和library以及resource的導入
項目結構如圖所示
關鍵字封裝
接下來就是關鍵字封裝,在robotframework中首先需要打開測試的應用程序,打開應用程序的關鍵字封裝代碼如下
打開應用程序
Open Application http://192.168.8.170:4723/wd/hub platformName=Android
platformVersion=6.0.0 deviceName=192.168.8.170:62001
app=F:\\test\\mis.apk
appPackage=com.xxx.xxx
... appActivity=com.xxx.xxx.atys.StartAty unicodeKeyboard=True resetKeyboard=True
界面如圖所示
打開應用程序之后,就需要定位我們剛剛使用uiautomatorviewer工具定位的登陸用戶名,具體代碼如下
輸入用戶名
[Arguments] ${username}
AppiumLibrary.wait until page contains element id=com.xxx.xxx:id/username
AppiumLibrary.input text id=com.xxx.xxx:id/username ${username}
這樣,登陸的用戶名的關鍵字已經封裝好了,在下次使用的時候可以直接使用封裝好的關鍵字-輸入用戶名即可。
三、登陸流程
關於登陸頁面的關鍵字封裝完成之后,接下來就是登陸流程的梳理,針對測試apk,登陸的步驟如下:
- 打開應用apk程序
- 在歡迎頁面中點擊開始
- 輸入登陸的用戶名
- 輸入登陸的密碼
- 點擊登陸
- 跳過新手指引
根據登陸的流程,接下來就是針對已經封裝好的關鍵字進行流程的操作,代碼如下:
登錄成功
打開應用程序
點擊開始
截圖 login
輸入用戶名 ${username}
輸入密碼 ${password}
點擊登錄
截圖 login
跳過新手指引
截圖 login
四、斷言
而對於一個測試用例而已,最重要的就是斷言,而針對登陸成功的斷言,我們只需要判斷登陸的用戶名和我們輸入的用戶名是否一致,如果一致則登陸成功,否則登陸失敗。
而apk中登陸的用戶名定位需要先進入個人中心,所以封裝的關鍵字如下
進入個人中心
appiumLibrary.click element id = com.xxx.xxx:id/txt_more1
獲取登錄的用戶名
${getLoginName} appiumLibrary.get text id = com.xxx.xxx:id/tvName
[Return] ${getLoginName}
那么接下來就是斷言,在robotframework這里使用should contain
關鍵字斷言,代碼如下
#斷言
進入個人中心
${getLoginName} 獲取登錄的用戶名
BuiltIn .should contain ${username} ${getLoginName}
注意
- 此處的關鍵字
should contain
使用的是Builtln
包,所以需要加上包名
五、集成jenkins執行用例
之前偶然發現集成工具jenkins,使用一段時間之后,發現它的功能竟這么強大,基本上我們想要實現的集成都可以通過jenkins集成完成操作,省去了一系列麻煩的操作。
目前接觸的更新測試環境的代碼、接口postman和jmeter都可以使用jenkins工具進行集成構建,對於公司長期的項目進行定時構建,並且發送測試結果給指定的負責人。這樣早上來到公司就可以直接看到測試結果。而對於多次迭代的項目測試,不僅提高了工作效率,相對而言也節省了成本。
具體的配置,可以參考:RobotFrameWork自動化系列:安裝配置,具體配置截圖所示
jenkins運行結果展示
郵件提醒和文件配置可以參考:JMeter接口測試系列:Jmeter+jenkins+ant 的自動化構建
這里集成結果會發送到指定的郵箱中,這樣我們就可以根據測試結果提bug到bug管理系統了。
封裝的所有關鍵字代碼展示如下
打開應用程序
Open Application http://192.168.8.170:4723/wd/hub platformName=Android
platformVersion=6.0.0 deviceName=192.168.8.170:62001
app=F:\\test\\mis.apk
appPackage=com.xxx.xxx
... appActivity=com.xxx.xxx.atys.StartAty unicodeKeyboard=True resetKeyboard=True
切換服務器
#切換登錄服務器
AppiumLibrary.click element id = com.xxx.xxx:id/login_iv_icon
AppiumLibrary.click element id = com.xxx.xxx:id/login_iv_icon
AppiumLibrary.click element id = com.xxx.xxx:id/login_iv_icon
AppiumLibrary.click element id = com.xxx.xxx:id/login_iv_icon
AppiumLibrary.click element id = com.xxx.xxx:id/login_iv_icon
AppiumLibrary.click element id=com.xxx.xxx:id/login_rela_login
截圖
[Arguments] ${ScreenName}
AppiumLibrary.Capture Page Screenshot ${ScreenName}
輸入用戶名
[Arguments] ${username}
AppiumLibrary.wait until page contains element id=com.xxx.xxx:id/username
AppiumLibrary.input text id=com.xxx.xxx:id/username ${username}
輸入密碼
[Arguments] ${password}
AppiumLibrary.input text id=com.xxx.xxx:id/pwd ${password}
點擊登錄
AppiumLibrary.click element id=com.xxx.xxx:id/login
跳過新手指引
AppiumLibrary.click element id = com.xxx.xxx:id/jump_over
點擊監測統計
AppiumLibrary.click element id = com.xxx.xxx:id/txt_poi1
點擊日歷選擇
AppiumLibrary.click element id =com.xxx.xxx:id/anIvRight
進入個人中心
appiumLibrary.click element id = com.xxx.xxx:id/txt_more1
獲取登錄的用戶名
${getLoginName} appiumLibrary.get text id = com.xxx.xxx:id/tvName
[Return] ${getLoginName}
登錄頁面點擊下一步
AppiumLibrary.click element id = com.xxx.xxx:id/guide4_btn
完整的登陸成功測試用例代碼如下
登錄成功
打開應用程序
點擊開始
截圖 login
輸入用戶名 ${username}
輸入密碼 ${password}
點擊登錄
截圖 login
跳過新手指引
截圖 login
#斷言
進入個人中心
${getLoginName} 獲取登錄的用戶名
BuiltIn .should contain ${username} ${getLoginName}
如圖