基於appium實現的線性程式碼引用unittest單元測試框架
阿新 • • 發佈:2019-11-02
在前段時間,分享了幾篇關於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/