基于appium实现的线性代码引用unittest单元测试框架
在前段时间,分享了几篇关于appium基础的博文,再加上期间也有讲到unittest测试框架,所以今天就来一个专题,在appium+python实现的线性代码基础上,引入unittest框架,使代码更简洁。
之前的博客,可以见以下链接快速阅读:
Appium-Server与Appium-Desktop的区别
在以上博文中,代码示例,很多只是个线性脚本,没有太多的实用之处,用来写个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模式,那代码的健壮性就更高了,以后有时间再出类似博文。
基于appium实现的线性代码引用unittest单元测试框架的更多相关文章
- Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架
一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型
1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- Selenium(十八):unittest单元测试框架(四) HTML测试报告
1. HTML测试报告 对测试人员来而言,测试的产出很难衡量.换句话说,测试人员的价值比较难以量化和评估,相信这一点对软件测试人员来说深有体会.我们花费了很多时间与精力所做的自动化测试也是如此.所以, ...
- unittest单元测试框架前言
一.在我们没有学习过python语言的时候领导让我们做接口测试 我们都使用工具来做测试,一般常用的如jemeter,postman这些个工具,我来推荐使用postman 这个工具来进行接口测试,有的小 ...
- Selenium实战(四)——unittest单元测试框架1
Python中的单元测试框架包含:doctest.unittest.pyttest.nose等,使用unittest单元测试框架不需要自行定义断言失败的提示,并且当一个测试函数执行失败后,后面的测试函 ...
- unittest单元测试框架
unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...
- unittest单元测试框架简单说明
unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...
- Python+selenium之简单介绍unittest单元测试框架
Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...
- unittest单元测试框架总结(转载)
转载:https://www.cnblogs.com/yufeihlf/p/5707929.html unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该 ...
随机推荐
- supervisor模块学习使用
supervisor组件 supervisord supervisord是supervisor的服务端程序. 启动supervisor程序自身,启动supervisor管理的子进程,响应来自clien ...
- 自定义构建基于.net core 的基础镜像
先说一个问题 首先记录一个问题,今天在用 Jenkins 构建项目的时候突然出现包源的错误: /usr/share/dotnet/sdk/2.2.104/NuGet.targets(114,5): e ...
- GStreamer基础教程08 - 多线程
摘要 GStreamer框架会自动处理多线程的逻辑,但在某些情况下,我们仍然需要根据实际的情况自己将部分Pipeline在单独的线程中执行,本文将介绍如何处理这种情况. GStreamer多线程 GS ...
- C++——指针
目录 一.地址和指针 1.1内存 1.2针和指针变量 二.指针变量 2.1始化 2.2赋值 2.3指针类型算术运算 2.4指针类型关系运算 2.5指向指针的指针 三.指针与数组 3.1指针运算 3.2 ...
- C++——数组与字符串
目录 一.数组 1.1定义与初始化 1.1.1使用 1.1.2存储 1.1.3初始化 1.2作函数参数 1.3对象数组 1.3.1定义与访问 1.3.2初始化 1.3.3数组元素所属类的构造函数 二. ...
- 分享8点超级有用的Python编程建议
我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,现在在这里分享一下给大家,希望多少有些地方可以给大家借鉴.
- Cocos Creator实现大炮英雄,附代码!
游戏预览 开始场景 搭建开始场景 摆放一个背景图,在背景图上添加背景地面.开始按钮.4个角色选择按钮.游戏logo. 创建游戏脚本 1. 实现开始按钮的回调,点击开始按钮,跳转到游戏场景.跳转 ...
- Hive 官方手册翻译 -- Hive DML(数据操纵语言)
由 Confluence Administrator创建, 最终由 Lars Francke修改于 八月 15, 2018 原文链接 https://cwiki.apache.org/confluen ...
- Oracle数据库实验一建立数据库
实验日期: 2019 年 09 月 24 日 实验报告日期: 2019 年 09 月 28 日 一. 实验目的 熟悉oracle环境: 熟练掌握和使用PL-SQL建立数据 ...
- MySQL时间盲注五种延时方法 (PWNHUB 非预期解)
转自cdxy师傅:https://www.cdxy.me/?p=789 PWNHUB 一道盲注题过滤了常规的sleep和benchmark函数,引发对时间盲注中延时方法的思考. 延时函数 SLEEP ...