基於appium實現的線性程式碼引用unittest單元測試框架

  • 2019 年 11 月 1 日
  • 筆記

在前段時間,分享了幾篇關於appium基礎的博文,再加上期間也有講到unittest測試框架,所以今天就來一個專題,在appium+python實現的線性程式碼基礎上,引入unittest框架,使程式碼更簡潔。

之前的部落格,可以見以下鏈接快速閱讀:

基於Python的Appium環境搭建合集

Genymotion模擬器的安裝及腳本製作

Appium Python API 中文版

Appium-Server與Appium-Desktop的區別

單元測試框架Uinttest一文詳解

在以上博文中,程式碼示例,很多只是個線性腳本,沒有太多的實用之處,用來寫個demo還是可以,但實際運用到產品中,就不行了。腳本還是得引用框架,這樣看起來,程式碼就不會那麼亂,更有邏輯性,便於維護。

好了,進入正題,對unittest以及appium還不熟悉的,可以先閱讀如上的博文了解,此篇文中,就不贅述了。

unittest程式碼優化一

優化邏輯:

①將啟用服務欄位放到初始化當中

②將輸入帳號、輸入密碼、獲取當前activity的操作封裝成一個個函數

③在用例中去調用需要執行的函數

示例程式碼如下:

import selenium  import time  from appium import webdriver  from selenium.webdriver.support.ui import WebDriverWait  import unittest    '''  @author: wenyihuqingjiu  @project: appiumcode  @file: test_login.py  @time: 2019-10-20 22:11  @desc:  '''    print('selenium version = ', selenium.__version__)      def input_account(self):      account = self.driver.find_element_by_id('id/rel_content')      account.find_element_by_id('id/edit_acount')      print("定位輸入框")      self.driver.press_keycode(61)      print("換行操作")      account.send_keys('')      print("帳號輸入完畢")      time.sleep(2)      def current(self):      ac = self.driver.current_activity      print('當前activity:' + ac)      def input_password(self):      # genymotion只需要一次換行      self.driver.press_keycode(61)      print("換行操作")      password = self.driver.find_element_by_id('id/rel_content')      password.find_element_by_id('id/edit_pass')      print("定位輸入框")      password.send_keys('')      print("輸入密碼")      self.driver.find_element_by_xpath('//android.widget.TextView[@text="登 錄"]').click()      print("點擊登錄")      time.sleep(5)      print('登錄成功')      class case_01(unittest.TestCase):      @classmethod      def setUpClass(cls):            desired_caps = {                'platformName': 'Android',              'platformVersion': '4.4.4',              'deviceName': 'S5',              'appPackage': '',              # 非首次登錄的activity              'appActivity': '.ui.login.view.LoginActivity',              'udid': '192.168.66.101:5555',              'noReset': 'true',              }          cls.driver = webdriver.Remote('http://192.168.1.101:4723/wd/hub', desired_caps)          print("服務啟動成功")        @classmethod      def tearDownClass(cls):          cls.driver.quit()        def add_img(self):          self.imgs.append(self.driver.get_screenshot_as_base64())          return True        def setUp(self):          # 在是python3.x 中,如果在這裡初始化driver ,因為3.x版本 unittestbasic1 運行機制不同,會導致用力失敗時截圖失敗          self.driver.implicitly_wait(30)          self.imgs = []          self.addCleanup(self.cleanup)        def cleanup(self):          pass        def test_login01(self):          input_account(self)          current(self)          input_password(self)      if __name__ == "__main__":      suites = unittest.TestSuite()      suites.addTest(case_01("test_login01"))      runner = unittest.TextTestRunner(verbosity=2)      runner.run(suites)

unittest程式碼優化二

優化邏輯:

①將啟用服務欄位放到初始化當中

②將輸入帳號、輸入密碼、獲取當前activity的操作封裝成一個個函數,並將數據參數做成形參

③在用例中去調用需要執行的函數併入參

示例程式碼如下:

import selenium  import time  from appium import webdriver  from selenium.webdriver.support.ui import WebDriverWait  import unittest    '''  @author: wenyihuqingjiu  @project: appiumcode  @file: test_login.py  @time: 2019-10-20 22:11  @desc:  '''    print('selenium version = ', selenium.__version__)      def input_account(self, username):      account = self.driver.find_element_by_id('id/rel_content')      account.find_element_by_id('id/edit_acount')      print("定位輸入框")      self.driver.press_keycode(61)      print("換行操作")      account.send_keys(username)      print("帳號輸入完畢")      time.sleep(2)      def current(self):      ac = self.driver.current_activity      print('當前activity:' + ac)      def input_password(self, send_password):      # genymotion只需要一次換行      self.driver.press_keycode(61)      print("換行操作")      password = self.driver.find_element_by_id('id/rel_content')      password.find_element_by_id('id/edit_pass')      print("定位輸入框")      password.send_keys(send_password)      print("輸入密碼")      self.driver.find_element_by_xpath('//android.widget.TextView[@text="登 錄"]').click()      print("點擊登錄")      time.sleep(5)      print('登錄成功')      class case_01(unittest.TestCase):      @classmethod      def setUpClass(cls):            desired_caps = {                'platformName': 'Android',              'platformVersion': '4.4.4',              'deviceName': 'S5',              'appPackage': '',              # 非首次登錄的activity              'appActivity': '.ui.login.view.LoginActivity',              'udid': '192.168.66.101:5555',              'noReset': 'true',              }          cls.driver = webdriver.Remote('http://192.168.1.101:4723/wd/hub', desired_caps)          print("服務啟動成功")        @classmethod      def tearDownClass(cls):          cls.driver.quit()        def add_img(self):          self.imgs.append(self.driver.get_screenshot_as_base64())          return True        def setUp(self):          # 在是python3.x 中,如果在這裡初始化driver ,因為3.x版本 unittestbasic1 運行機制不同,會導致用力失敗時截圖失敗          self.driver.implicitly_wait(30)          self.imgs = []          self.addCleanup(self.cleanup)        def cleanup(self):          pass        def test_login01(self):          # 正常登錄          input_account(self, "")          current(self)          input_password(self, "")        def test_login02(self):          # 異常登錄          input_account(self, "")          current(self)          input_password(self, "")      if __name__ == "__main__":      suites = unittest.TestSuite()      suites.addTest(case_01("test_login01"))      suites.addTest(case_01("test_login02"))      runner = unittest.TextTestRunner(verbosity=2)      runner.run(suites)

通過上述程式碼可看出,使用更方便了,可以滿足正向/反向的用例設計了,是不是很簡單。

程式碼可擴展性還有很多,在unittest基礎上,再引入PO模式,那程式碼的健壯性就更高了,以後有時間再出類似博文。

 

本文僅代表作者觀點,系作者@溫一壺清酒發表。
歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
文章出處:http://www.cnblogs.com/hong-fithing/

Tags: