为了减小维护成本:
1.UI自动化测试需要有较为稳定的环境
2.代码设计合理,那么我们就需要面向对象的设计一个框架,将重复的代码模块化
一、首先总结一下 UI自动化大概要哪些模块
1.config(配置文件):用来存放配置文件(YML,XML,HTML。。。)
2.data(数据文件):存放测试数据等
3.drivers(驱动):Chromedriver,IEdriver
4.log(日志文件):打印测试log
5.report(报告):生成HTML测试报告
6.test(测试用例):写TestCase调用其他模块中的方法
7.utils(公共方法):写调用config、data、log、report等其他模块的方法
8.后续可自己增加其他模块,比如针对某类型元素的获取,page中元素的定位等
二、结合起来运用
首先如果我们没有框架的话, 写一个testcase可以直接写到一个class中,甚至不用class,甚至连def都可以不用就实现了一个case;
但是,万一下次又用到了同样的功能,需要写同样的内容怎么办呢???甚至它和之前的case只有一点点不一样的话呢???我们需要不断的复制粘贴并且修改;
那么我们这里需要用到class来实现不同模块之间的调用
1、我们需要在utils方法中写入一些基本方法,实现对其他模块的调用
1)、file_reader.py(读取文件):我们上面描述的框架中包含了config中的YML文件(或者其他)、data中的Excel文件,
config---YML:
1 import os
2
3 class YamlReader(object):
4 def __init__(self,yaml):
5 #有yaml文件就返回文件,没有就报异常
6 if os.path.exists(yaml):
7 self.yaml = yaml
8 else:
9 raise FileNotFoundError("yaml文件不存在!")
10 self._data = None
11
12 @property #这里需要了解yaml返回的内容格式等信息
13 def data(self): #调用yaml文件中的内容data
14 if not self._data:
15 with open(self.yaml,'rb') as f:
16 self._data = list(yaml.safe_load_all(f))
17 return self._data
data--Excel:
1 import os
2 import xlrd
3
4 class ExcelReader(object):
5 #title_line =True 判断是否有标题,为True时有标题
6 def __init__(self,excel,sheet=0,title_line=True):
7 if os.path.exists(excel):
8 self.excel = excel
9 else:
10 raise FileNotFoundError("Excel文件不存在!")
11
12 self.sheet = sheet
13 self.title_line = title_line
14 self._data = list()
15
16 @property
17 def data(self):
18 if not self.data:
19 workbook = open_workbook(self.excel)
20 #获取sheet
21 if type(self.sheet) not in [int,str]:
22 raise SheetTypeError('Please pass in <type int> or <type str> not {}'.format(type(self.sheet)))
23 elif type(self.sheet)==int:
24 sheet = workbook.sheet_by_index(self.sheet)
25 elif type(self.sheet)==str:
26 sheet = workbook.sheet_by_name(self.sheet)
27
28 if self.title_line: #获取data值,有title为dict,没有title为list
29 title = sheet.row_value() #第一行定义为title
30 for col in range(1,sheet.nrows):
31 self._data.append(dict(zip(title,sheet.row_values(col))))
32 else:
33 for col in range(0,sheet.nrows):
34 self._data.append(sheet.row_values(col))
35 return self._data
未完待续。。。。。
来源:oschina
链接:https://my.oschina.net/u/4323178/blog/3947688