Appium APP UI自動化測試框架介紹
阿新 • • 發佈:2020-12-26
APP UI自動化測試同樣可以使用unittest框架,與web的UI自動化類似
整個自動化流程介紹
1) 會先從手工用例裡面抽離出要做自動化的用例,在測試用例裡面會加一個執行方式的標籤,標明是手動還是自動化,以此明確自動化測試的範圍。
2) 開始搭建自動化測試框架,整個框架的設計是基於Python+appium+一些模組的封裝。我們封裝的模組分幾部分內容:
- case層:是核心,放自動化用例。case層的設計原理是:使用了unittest三部分內容,setup、teardown和test方法。
- setup是做初始化的一些操作,初始化一些引數設定、APP啟動,還會加一個啟動時間。
- Teardown是做一些退出、截圖,列印結束時間的操作。
- Test方法是手工用例對應的自動化用例
- report層:放HTML testrunner,一個生成HTML報告的py檔案,最終的自動化測試報告也會生成在這個模組下
- public層:比如登入以及經常要業務複用的一些場景,會將它們抽離出來作為public,在其他的case層可以直接呼叫
- testrunner:在case層裡面有很多自動化用例,不可能一個一個去執行。所以寫了這個testrunner,通過它可以實現批量執行,執行case層裡面所有的py檔案。這樣的好處是,對於測試迴歸來說,在這個版本提交之後,每天都可以進行一次迴歸,迴歸之後可以檢視報告,然後對有錯誤的地方進行分析,看是否對老功能有影響。
1. 初始化程式碼詳解
from appium import webdriver
desired_caps = {} #定義了一個字典,下面是字典裡面的值
desired_caps['platformName'] = 'android' #平臺名稱,如果是蘋果,則寫ios(小寫)
desired_caps['platformVersion'] = '5.1' #手機系統版本號,與測試手機版本一致
desired_caps['deviceName'] = 'Android Emulator' #裝置名,appium不強制檢查此引數值,只要有值即可
desired_caps['noReset' ] = 'True' #退出APP時,不重置APP的資料
desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba' #包名,每個APP就是通過包名來唯一區分
desired_caps['appActivity'] = '.ui.base.SplashActivity' #首個介面的activity
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps) #初始化driver
#http://localhost:4723/wd/hub是遠端的請求地址,前面是域名,/wd/hub是路徑 desired_caps是引數
#4723是埠號,需要與appium監聽的埠號對應(在appium首頁可以設定埠號)
- 介面名稱:每一個介面就是一個activity(web是通過URL來區分介面,APP是通過activity區分介面)
- activity可能是複用的:在APP中,有些佈局是類似的時候,可能activity是一樣的
包名獲取方法:
APP開啟,在cmd中輸入adb shell dumpsys activity top|findstr “ACTIVITY”
/前面是包名,/後面以點號開始的一串是當前介面的activity名稱
初始化時,只能進到APP首個介面
獲取首個介面activity的方法:先在cmd中將獲取命令輸好,再啟動APP,APP起來之後,馬上在命令視窗點回車(如果點慢了,可能就不是首個介面了)
初始化時,appium會給手機裡安裝2個APP:
- appiumSettings:appium設定的東西,自動安裝
- Unlock:手機解鎖,解不了圖文和密碼的,只能滑動解鎖
2. 框架介紹
2.1 Public
public封裝公用業務模組,如APP登入
封裝一個Mylogin類,類裡面是對應的login方法
如封裝的登入模組:
import time
class Mylogin(object):
def __init__(self, driver):
self.driver = driver
def login(self):
self.driver.implicitly_wait(60)
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/me_item").click()
time.sleep(2)
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/tv_notLogin_goLogin").click()
time.sleep(1)
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/login_mode").click()
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/phone_num_edit").send_keys("151********")
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/code_edit").send_keys("a123456")
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/login").click()
time.sleep(5)
2.2 report
放一個HTML testrunner.py檔案,自動生成報告
2.3 case(核心)
- APP和web有一些共有的,所以在case層下分了APP和web。
- setup:初始化
- teardown:清理
- test方法:每一個test方法對應一條手工用例,每個test方法都需要以test開頭,不然不會執行。
2.4 幾種典型case例子
1.有時進入首頁時會彈出青少年模式,有時不會彈出。對於這種情況,如果需要定位首頁控制元件,可以使用try語句
def testshouye01_01(self):
'''驗證首頁導航欄文案顯示是否正常'''
time.sleep(8)
try:
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/home_item").click()
except:
pass
time.sleep(6)
navText = self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/title")
self.assertEqual(navText[0].text, "關注")
self.assertEqual(navText[1].text, "推薦")
self.assertEqual(navText[2].text, "視訊")
self.assertEqual(navText[3].text, "圖文")
2.動態內容處理:驗證帖子列表內容跳轉
def testshouye01_02(self):
'''驗證帖子列表內容跳轉'''
time.sleep(8)
aa = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/expand_content_view")
bb = aa.text
aa.click()
time.sleep(3)
forumDetailText = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/tvTitle")
cc = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/ss")
self.assertEqual(forumDetailText.text,"帖子詳情")
self.assertEqual(bb,cc.text)
3.驗證評論帖子功能
def testshouye01_03(self):
'''驗證評論帖子功能'''
Mylogin(self.driver).login()
time.sleep(3)
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/iconTabItem").click() #點選首頁
time.sleep(6)
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/expand_content_view").click() #點選帖子列表中的一個數據
time.sleep(3)
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/etInput").send_keys("textCESHI") #輸入評論內容
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/send").click() #點擊發送
sendContent = self.driver.find_elements_by_id("cn.xiaochuankeji.tieba:id/expandTextView") #將所有評論內容的控制元件全部拿到
sendContentRawList = [] #定義列表 ['a123456','貓']
for i in range(0, len(sendContent)): #迴圈所有控制元件
sendContentRawList.append(sendContent[i].text) #將控制元件上的文字資訊全部追加到定義的列表中
sendContentList = "".join(sendContentRawList) #將列表轉換成一個字串 "a123456貓"
self.assertIn("textCESHI", sendContentList) #斷言:如果評論內容在所有評論內容裡面,說明評論內容已經顯示出來了
#測試時,需要讓評論內容唯一化,可以加時間實現,text+時間(精確到秒)
4.頁面滑動,直到找到某一控制元件為止
def testshouye01_04(self):
'''驗證關注功能'''
time.sleep(10)
while True:
try:
self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/v_epaulet_follow").click()
break
except:
height = self.driver.get_window_size()['height']
width = self.driver.get_window_size()['width']
self.driver.swipe(width * 0.5, height * 0.8, width * 0.5, height * 0.2, 1000) # 當關注沒有顯示時,上滑
#斷言
toast = ("xpath", '//*[contains(@text,"關注成功")]')
# 最大等待時間10秒,每隔0.1秒檢測1次,直到當前介面存在了關注成功提示
ele = WebDriverWait(self.driver, 10, 0.1).until(EC.presence_of_element_located(toast))
self.assertEqual("關注成功",ele.text)