1.目录结构图
image2.目录详解
下图是框架中各个目录和文件作用的简单介绍,后面的章节会具体介绍如何封装这些方法。
image公共方法封装
一、getPathInfo.py
# _*_ coding:utf-8 _*_
import os
def get_Path():
"""
返回上级目录的绝对路径
"""
return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def join_cwd(path):
"""
和上级目录拼接路径
"""
return os.path.join(get_Path(), path)
if __name__ == '__main__':
print(join_cwd('Logs')) #测试一下
二、log.py
日志系统:记录执行用例过程中的log。
# _*_ coding:utf-8 _*_
import logging, os, time
from Common import getPathInfo
from logging.handlers import TimedRotatingFileHandler
now = time.strftime("%Y%m%d%H%M%S") # 当前时间变量
# 日志系统:记录执行用例过程中的log。
class Logger(object):
def __init__(self):
self.resultPath = getPathInfo.join_cwd('Logs') # 存放log文件的路径
if not os.path.exists(self.resultPath): # 判断Logs路径是否存在
os.mkdir(self.resultPath) # 创建Logs文件
self.logger = logging.getLogger()
logging.root.setLevel(logging.NOTSET)
self.backup_count = 5 # 最多存放日志的数量
# 日志输出级别
self.console_output_level = 'WARNING'
# self.file_output_level = 'DEBUG'
self.file_output_level = 'INFO'
# 日志输出格式
self.formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
def get_logger(self, logfile_name=now):
"""在logger中添加日志句柄并返回,如果logger已有句柄,则直接返回"""
if not self.logger.handlers: # 避免重复日志
console_handler = logging.StreamHandler()
console_handler.setFormatter(self.formatter)
console_handler.setLevel(self.console_output_level)
self.logger.addHandler(console_handler)
# 每天重新创建一个日志文件,最多保留backup_count份
file_handler = TimedRotatingFileHandler(filename=os.path.join(self.resultPath, logfile_name + '.log'),
when='D',
interval=1, backupCount=self.backup_count, delay=True,
encoding='utf-8')
file_handler.setFormatter(self.formatter)
file_handler.setLevel(self.file_output_level)
self.logger.addHandler(file_handler)
return self.logger
logger = Logger().get_logger() # 实例化
三、readConfig.py
读取Config配置文件的方法。
# _*_ coding:utf-8 _*_
import configparser
from Common import getPathInfo
# 读取Config配置文件的方法
class Read_Config(object):
"""
读取配置文件信息
"""
def __init__(self):
config_path = getPathInfo.join_cwd('config.ini') # 拼接路径
self.config = configparser.ConfigParser() # 调用配置文件方法
# self.config.read(config_path) # 读取配置文件
self.config.read(config_path, encoding='utf-8') # illegal multibyte sequence,报错后加了encoding='utf-8',问题解决
def get_info(self, group_name, key):
"""
读取配置文件config中指定组的键值
:param group_name:组名
:param key: key值
"""
return self.config.get(group_name, key)
if __name__ == '__main__':
print(Read_Config().get_info('HTTP', 'baseurl')) # 测试一下,读取配置文件的方法是否可用
四、readExcel.py
本次采用的是数据与代码相分离模式,测试数据保存在Excel文件中,readExcel.py就是封装的读取测试数据方法。
# _*_ coding:utf-8 _*_
from Public import getPathInfo
import xlrd, os
# 采用的是数据与代码相分离模式,测试数据保存在Excel文件中,readExcel.py就是封装的读取测试数据方法.
class readExcel(object):
def __init__(self, xlsx_name):
path = getPathInfo.get_Path() # 获得上级目录路径
self.xlsPath = os.path.join(path, 'TestData', xlsx_name) # 获取用例文件路径
self.file = xlrd.open_workbook(self.xlsPath) # 打开用例Excel
def get_sheetnames(self):
"""
返回所有sheet名称
"""
return self.file.sheet_names()
def get_xlsx(self, sheet):
"""
获取Excel中测试用例相关信息
"""
list = [] # 定义一个空列表
sheet = self.file.sheet_by_name(sheet) # 获得指定sheet数据
row_value1 = sheet.row_values(0) # 获取第1行的标题
nrows = sheet.nrows # 获取当前sheet行数
ncols = sheet.ncols # 获取当前sheet列数
for i in range(1, nrows): # 从第2行遍历当前sheet
row = sheet.row_values(i) # 获取行数据
dict = {} # 创建空字典
for j in range(0, ncols): # 遍历sheet列,组成字典
if row_value1[j] == 'NO.' or row_value1[j] == 'code':
dict[row_value1[j]] = int(row[j]) # NO和code值取int
else:
dict[row_value1[j]] = row[j] # 从第一列开始,将每一列的数据与第1行的数据组成一个键值对,形成字典
list.append(dict) # 将字典添加list中
return list # 返回列表
if __name__ == '__main__': # 测试一下方法是否可用
x = readExcel('UI_TestCase.xlsx')
print(x.get_sheetnames())
print(x.get_xlsx('login'))
网友评论