基于appium实现的线性代码引用unittest单元测试框架

在前段时间,分享了几篇关于appium基础的博文,再加上期间也有讲到unittest测试框架,因此今天就来一个专题,在appium+python实现的线性代码基础上,引入unittest框架,使代码更简洁。html

以前的博客,能够见如下连接快速阅读:python

基于Python的Appium环境搭建合集android

Genymotion模拟器的安装及脚本制做web

Appium Python API 中文版python3.x

Appium-Server与Appium-Desktop的区别app

单元测试框架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/

原文出处:https://www.cnblogs.com/hong-fithing/p/11733788.html

相关文章
相关标签/搜索