1. 程式人生 > 其它 >Appium APP UI自動化測試框架介紹

Appium APP UI自動化測試框架介紹

技術標籤:APP UI自動化軟體測試android

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:
在這裡插入圖片描述

  1. appiumSettings:appium設定的東西,自動安裝
  2. 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)