Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)
1.简介
今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。到今天为止,大功即将告成;框架所需要的代码实现都基本完成。
2.data数据封装
2.1使用背景
在实际项目过程中,我们的数据可能是存储在一个数据文件中,如txt,excel、csv文件类型。我们可以封装一些方法来读取文件中的数据来实现数据驱动。
2.2案例
将测试账号存储在account.csv文件,内容如下:
account.csv
|
hg2018 |
hg2018 |
|
hg2019 |
zxw2019 |
|
666 |
222 |
参考代码

2.3enumerate()简介
enumerate()是python的内置函数
- enumerate在字典上是枚举、列举的意思
- 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
- enumerate多用于在for循环中得到计数。
2.4enumerate()使用
如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写:

参考代码
list = ["这", "是", "一个", "测试","数据"]
for i in range(len(list)):
print(i,list[i])
上述方法有些累赘,利用enumerate()会更加直接和优美:

参考代码
list1 = ["这", "是", "一个", "测试","数据"]
for index, item in enumerate(list1):
print(index,item)
3.数据读取方法封装
数据读取方法也属于公共方法,这里我们首先实现一下,然后将其封装到里边即可。
3.1数据读取方法实现的参考代码
import csv
def get_csv_data(csv_file,line):
with open(csv_file, 'r', encoding='utf-8-sig') as file:
reader=csv.reader(file)
for index, row in enumerate(reader,1):
if index == line:
return row
csv_file='../data/account.csv'
data=get_csv_data(csv_file,3)
print(data)
3.2封装
将其封装在公共方法中,在其他地方用到的时候,直接导入调用即可。

4.utf-8与utf-8-sig两种编码格式的区别
UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。
5.config文件配置
各种配置文件都放在这个目录下。
5.1日志文件配置
主要是一些日志信息的配置。
log.config

参考代码
[loggers]
keys=root,infoLogger
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_infoLogger]
handlers=consoleHandler,fileHandler
qualname=infoLogger
propagate=0
[handlers]
keys=consoleHandler,fileHandler
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=INFO
formatter=form01
args=('../logs/runlog.log', 'a')
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
6.测试用例封装
这里宏哥举例给小伙伴们演示:封装注册和登录两个测试用例。
6.1测试用例执行开始结束操作封装
测试用例执行开始和结束的封装,其他模块用到直接导入,调用即可。
myunit.py

参考代码
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-11-20
@author: 北京-宏哥 QQ交流群:707699217
Project:Appium自动化测试框架综合实践 - 代码实现
'''
# 3.导入模块
import unittest
from kyb_testProject.common.desired_caps import appium_desired
import logging
from time import sleep
class StartEnd(unittest.TestCase):
def setUp(self):
logging.info('=====setUp====')
self.driver=appium_desired()
def tearDown(self):
logging.info('====tearDown====')
sleep(5)
self.driver.close_app()
6.2注册用例
开始注册用例代码逻辑的实现。
test_register.py

参考代码
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-11-20
@author: 北京-宏哥 QQ交流群:707699217
Project:Appium自动化测试框架综合实践 - 代码实现
'''
# 3.导入模块
from kyb_testProject.common.myunit import StartEnd
from kyb_testProject.businessView.registerView import RegisterView
import logging,random,unittest
class RegisterTest(StartEnd):
def test_user_register(self):
logging.info('======test_user_register======')
r=RegisterView(self.driver)
username = 'bjhg2019' + 'fly' + str(random.randint(1000, 9000))
password = 'bjhg2020' + str(random.randint(1000, 9000))
email = 'bjhg' + str(random.randint(1000, 9000)) + '@163.com'
self.assertTrue(r.register_action(username,password,email))
if __name__ == '__main__':
unittest.main()
6.3登录用例
开始登录用例代码逻辑的实现。
test_login.py

参考代码
# coding=utf-8
# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-11-13
@author: 北京-宏哥 QQ交流群:707699217
Project:Appium自动化测试框架综合实践 - 代码实现
'''
# 3.导入模块
from kyb_testProject.common.myunit import StartEnd
from kyb_testProject.businessView.loginView import LoginView
import unittest
import logging
class TestLogin(StartEnd):
csv_file='../data/account.csv'
@unittest.skip('test_login_zxw2018')
def test_login_zxw2018(self):
logging.info('======test_login_zxw2018=====')
l=LoginView(self.driver)
data=l.get_csv_data(self.csv_file,2)
l.login_action(data[0],data[1])
self.assertTrue(l.check_loginStatus())
# @unittest.skip('skip test_login_zxw2017')
def test_login_zxw2017(self):
logging.info('======test_login_zxw2017=====')
l=LoginView(self.driver)
data = l.get_csv_data(self.csv_file, 1)
l.login_action(data[0], data[1])
self.assertTrue(l.check_loginStatus())
@unittest.skip('test_login_error')
def test_login_error(self):
logging.info('======test_login_error=====')
l = LoginView(self.driver)
data = l.get_csv_data(self.csv_file, 3)
l.login_action(data[0], data[1])
self.assertTrue(l.check_loginStatus(),msg='login fail!')
if __name__ == '__main__':
unittest.main()
7.小结
到此,Appium自动化测试框架就差下一篇就全部完成了,聪明的你都懂了吗???嘿嘿!慢慢地来吧。
下节预告
下一篇,讲解执行测试用例,生成测试报告,以及自动化平台,请关注宏哥,敬请期待!!!
Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)的更多相关文章
- Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)
1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...
- Appium+python自动化(十三)- 输入中文 - 一次填坑记(超详解)
简介 无论你在哪里,在做什么都会遇到很多坑,这些坑有些事别人挖的,有些是自己挖的.别人挖的叫坑人,自己挖的叫自杀,儿子挖的叫坑爹.因此在做app自动化道路上也不会是一帆风顺的,你会踩很多坑,这些坑和你 ...
- Appium+python自动化(十三)- 与Capability完美懈垢之解读(超详解)
简介 Capability又叫Appium Desired Capabilities,前边写了那么多实例代码,小伙伴可以发现一些规律,就是有一部分代码总是重复的出现在你的视线中.这部分就是对Capab ...
- python接口自动化(四十一)- 发xml格式参数的post请求(超详解)
简介 最近在工作中,遇到一种奇葩的接口,它的参数数据是通过xml,进行传递的,不要大惊小怪的,林子大了什么鸟都有,每个人的思路想法不一样,开发的接口也是各式各样的,如果想要统一的话,必须是提前团队已经 ...
- Appium+python自动化(四十)-Appium自动化测试框架综合实践 - 代码实现(超详解)
1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.由于时间的关系,宏哥这里用代码给小伙伴演示两个模块:注册和登录. 2.业务模块封装 因为现在各种APP的层出不群 ...
- Appium+python自动化(三十八) - Appium自动化测试框架综合实践 - 框架简介-助你冲击高薪,迎娶白富美(超详解)
简介 好久没有更新博客了,博友们是不是有点等不及了.不好意思啊,中秋节过后太忙了,这篇是好不容易抽点零碎时间写的.从这一篇开始小伙伴或者童鞋们,就跟随宏哥的脚步,一步步的从无到有,从0到1的搭建一个完 ...
- Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)
简介 经过一段时间的准备,完善的差不多了,继续分享有关Appium自动化测试框架综合实践.想必小伙伴们有点等不及了吧! driver配置封装 kyb_caps.yaml 配置表 参考代码 platfo ...
- 《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
1.简介 为了方便查看和归档:(1)不同包的日志可能要放到不同的文件中,如service层和dao层的日志:(2)不同日志级别:调试.信息.警告和错误等也要分文件输出.所以宏哥今天主要介绍和分享的是: ...
- Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)
简介 通过上一篇宏哥给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉宏哥:是,就对了.宏哥要的就是这个 ...
随机推荐
- 第3章(1) Linux内核相关概念
Linux内核的组成 1. Linux内核源代码的目录结构 arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如 i386.arm. arm64.powerpc.mips 等.Linu ...
- mysql 延时注入新思路
转自先知社区https://xz.aliyun.com/t/2288 在4月的pwnhub比赛中,我们遇到了一个比较神奇的问题,如果在注入中遇到需要延时注入的情况,但服务端过滤了我们一般使用的slee ...
- OCPC(Optimized Cost per Click)[Paper笔记]
背景 在线广告中,广告按照CPM排序,排在前面的广告竞争有限广告位(截断).其中,CPM=bid*pctr.注GSP二价计费的,按照下一位bid计费.适当调整bid,可以提高竞价的排名,从而获得展现的 ...
- Knative 实战:基于 Kafka 实现消息推送
作者 | 元毅 阿里云智能事业群高级开发工程师 导读:当前在 Knative 中已经提供了对 Kafka 事件源的支持,那么如何基于 Kafka 实现消息推送呢?本文作者将以阿里云 Kafka 产品为 ...
- (三)Kinect姿势识别
Kinect给我们内置了许多姿势如举手等,具体可参考枚举KinectGestures.Gestures,也可以通过Kinect姿势管理器,自定义姿势导入(坑较多,内置的基本够用了)也可以根据关节坐标自 ...
- Alpha阶段--第七周Scrum Meeting
任务内容 本次会议为第六周的Scrum Meeting会议 召开时间为周日下午5点,在潮音餐厅召开,召开时间约为30分钟,对已经完成项目的总结和对今后项目设计的展望 队员 任务 张孟宇 “我的”界面代 ...
- 开根号 HYSBZ - 3211
区间修改+区间查询(线段树板子题) 另外因为1e9内的数开5次根号必定为1或0,所以我们可以提前打表i<=sqrt[1e9], s[i]=sqrt(i).这样每次改值不必再调用系统的sqrt: ...
- 是true还是false呢?
古来圣贤皆寂寞 惟有[努]者留其名 ---[努]原文:饮 先总结一个小知识点:0.null.NaN.undefined."" 转成布尔值为false 其他则一律返回true 1.首 ...
- sql中实现先排序后分组
数据表结构和数据如下: CREATE TABLE `commun_message_chat_single` ( `id` ) NOT NULL AUTO_INCREMENT, `chat_id` ) ...
- activeMQ 安装及启动异常处理
一.环境: [root@centos_6 ~]# cat /etc/system-release CentOS release 6.5 (Final) [root@centos_6 ~]# uname ...