基於Appium+Python+Unittest框架實現APP自動化測試

實現基本思路以PO模型和數據驅動(DDT)爲核心。
PO模型:將頁面和業務以及測試用例進行解耦,在實際業務中若是有頁面元素變更或者業務流程變更都只須要修改對應的頁面和操做便可。極大的減小維護成本。
數據驅動:能夠將測試數據和用例從新組合;在同一業務,多輸入條件的狀況下,能夠很好減小測試用例的數量,以達到一樣的測試效果。核心流程以下圖:



   爲了實現PO模型,須要重寫一個BasePage類,該類須要負責重寫WebDriver的基本方法,和一些頁面基礎操做,而後全部的Page頁面都繼承該BasePage類型,相應的Page頁面只保留頁面的元素定位信息。python


BasePageweb

import sysfrom selenium.webdriver.support.wait import WebDriverWaitimport timefrom util.logger import logger

class Base: driver = None logger=logger() def __init__(self,driver): self.driver=driver
# 二次封裝find_element方法 def find_element(self, loc, timeout=10): # 隱式等待 return WebDriverWait(self.driver, timeout).until(lambda x: x.find_element(*loc))
# 二次封裝find_elements方法 def find_elements(self, loc, timeout=10): # 隱式等待 return WebDriverWait(self.driver, timeout).until(lambda x: x.find_elements(*loc))
# 二次封裝click方法 def click_element(self, loc,timout=10): self.find_element(loc,timout).click() print("點擊--》",loc); self.logger.Debug("點擊--》" + str(loc))
# 二次封裝click方法,若是元素返回是數組的狀況 def click_elements(self, loc,position,timout=10): self.find_elements(loc,timout)[position].click() print("點擊--》", loc,position); self.logger.Debug("點擊--》" +str(loc)+"_"+str(position))
# 二次封裝input方法 def input_element(self, loc, text): inp = self.find_element(loc) # 防止有默認內容,清空輸入框 inp.clear() inp.send_keys(text)
#二次封裝等待方法 def wait_activity(self,activity,timeout=5): self.driver.wait_activity(activity, 10)
#按返回鍵 def callback(self): self.driver.keyevent(4) print("已返回上一個頁面") self.logger.Debug("已返回上一個頁面")     def switch_to_alert(self): self.driver.switch_to_alert() self.logger.Debug("切換到alter彈窗")
def save_screenshot(self): now = time.strftime("%Y%m%d%H%M%S") self.driver.save_screenshot("../screenshot/" +sys._getframe().f_code.co_name + "_"+now +".png") # 截圖方法名+時間戳


LoginPage(登陸頁PageObject):數組

from selenium.webdriver.common.by import Byfrom pageObject import BasePage
class LoginPage2(BasePage.Base): login_btn=(By.ID,"login_btn") #一鍵登陸按鈕 mobileNum=(By.ID,'fast_phone_et'); phone_et = (By.ID, 'phone_et'); verif_et = (By.ID, 'verif_et'); pwd_et = (By.ID, 'pwd_et'); txt_verification_code = (By.ID, 'txt_verification_code'); login_bt = (By.ID, 'login_bt');


LoginAction(登陸的具體業務):
ruby

from pageObject.LoginPage2 import LoginPage2class loginAction(LoginPage2):  def login_by_email(self,username,password): self.click_element(self.login_btn) self.click_element(self.txt_verification_code) self.input_element(self.phone_et, username) self.input_element(self.pwd_et, password)        self.click_element(self.login_bt);  # 登陸按鈕if __name__=="__main__": lp=loginAction(); lp.login_by_email("17115511@qq.com","123456")


登陸的測試用例:
微信

注:使用unittest框架時,測試用例都是以test_開頭的,不然會找不到測試用例app

  這裏使用DDT模塊做爲數據驅動引入,關於DDT的使用能夠參考《Python 接口自動化測試之數據驅動(DDT)》,這裏不在贅述。
框架

import unittestimport ddtfrom pageAction.HomeAction import HomeActionfrom pageAction.LoginAction import loginActionfrom pageAction.MyCenterAction import MyCenterActionfrom pageAction.SettingAction import SettingActionfrom util.ReadExcel import ReadExcelfrom util.logger import logger
from util.appConfig import appConfig
testData =ReadExcel.readExcel("E:\\preg_app\\data\\test_ddt.xls", "Sheet1")@ddt.ddtclass test_login(unittest.TestCase): driver=None logger=logger(); login=None @classmethod def setUpClass(self): print("class start-->") self.logger.Info("class start-->") self.driver=appConfig().getDriver() self.login=loginAction(self.driver)
def setUp(self): print("method start-->") self.logger.Info("method start-->") pass @ddt.data(*testData) @ddt.unpack def test_loginA(self,username,password): self.login.login_by_email(username,password)
def tearDown(self): print("method end-->") self.logger.Info("method end--->") home=HomeAction(self.driver) home.click_face() #點擊頭像進入我的中心 mycenter=MyCenterAction(self.driver) mycenter.click_setting() #點擊我的中心的設置 setting=SettingAction(self.driver) setting.click_quit()#點擊退出
@classmethod def tearDownClass(self): print("class end-->") self.logger.Info("class end--->") pass
if __name__=="__main__": test_login()



-------------------------------------最後---------------------------------測試

 更多軟件測試相關內容請關注公衆號或掃描下方二維碼ui








本文分享自微信公衆號 - 軟件測試道與術(UTesting)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。spa

相關文章
相關標籤/搜索