为了减小维护成本:
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
未完待续。。。。。