目标
-
完成手机号码初始化操作:修改excel(对于需要唯一数据的场景,比如注册场景)
- 第一种操作:利用excel设置初始化手机号码,每次进行+1操作,以及变量替换。记得做数据演示
- 第二种操作:每次从数据库里面查询最大的手机号码,在这个基础上+1
- 第三种操作:每次清除这个手机号相关的数据,进行垃圾数据重置操作
- 当前时间戳生成手机号码
- 参数替换完成
${变量名}
学习logging:引入日志模块
初始化手机号
-
测试数据的excel中新增一个sheet
init
-
get_data.py
新增一个NoRegTel
参数from project_path import * import pandas class GetData: access_token = None NoRegTel=(pandas.read_excel(test_data_path, sheet_name="init")).ix[0,0]
-
在excel中使用变量
把要使用唯一手机号的地方用
${tel}
替换 -
改造
do_excel.py
,当读到${tel}
用init
中的手机号进行替换# encoding: utf-8 from openpyxl import load_workbook import sys reload( sys ) sys.setdefaultencoding('utf-8') from read_config import ReadConfig import project_path from get_data import GetData class DoExcel: @classmethod def get_data(cls,file_name): wb=load_workbook(file_name) mode=eval(ReadConfig.get_config(project_path.case_config_path,"MODE","mode")) #新增代码,读取excel中init的手机号,也可以直接读取excel tel=getattr(GetData,"NoRegTel") test_data=[] for key in mode: sheet=wb[key] if mode[key]=='all': for i in range(2,sheet.max_row+1): row_data={} row_data["case_id"] = sheet.cell(i, 1).value row_data["url"]=sheet.cell(i,2).value row_data["method"]=sheet.cell(i,3).value #新增代码,判断body参数中是否有变量${tel} if sheet.cell(i,4).value.find("${tel}")!=-1: row_data["payload"] = sheet.cell(i, 4).value.replace("${tel}",str(tel)) tel = tel + 1 else: row_data["payload"]=sheet.cell(i,4).value row_data["title"]=sheet.cell(i,5).value row_data["expected"] = sheet.cell(i, 6).value row_data["sheet_name"]=key test_data.append(row_data) #将使用后的tel+1重新写到init,保证每次用到都是新的 cls.update_tel(tel,file_name,'init') else: for case_id in mode[key]: row_data = {} row_data["case_id"] = sheet.cell(case_id+1, 1).value row_data["url"] = sheet.cell(case_id+1, 2).value row_data["method"] = sheet.cell(case_id+1, 3).value if sheet.cell(case_id+1, 4).value.find("${tel}") != -1: row_data["payload"] = sheet.cell(case_id+1, 4).value.replace("${tel}", str(tel)) tel=tel+1 else: row_data["payload"] = sheet.cell(case_id+1, 4).value row_data["title"] = sheet.cell(case_id+1, 5).value row_data["expected"] = sheet.cell(case_id+1, 6).value row_data["sheet_name"] = key test_data.append(row_data) cls.update_tel(tel, file_name, 'init') return test_data @staticmethod def write_back_data(file_name,sheet_name,i,result,TestResult): wb=load_workbook(file_name) sheet=wb[sheet_name] sheet.cell(i,7).value=result sheet.cell(i,8).value=TestResult wb.save(file_name) #保存 #新增代码,新增更新手机号的方法 @classmethod def update_tel(cls,tel,file_name,sheet_name): """更新手机号""" wb = load_workbook(file_name) sheet = wb[sheet_name] sheet.cell(2,1).value=tel wb.save(file_name)
引入日志模块
-
logging是什么?作用是什么?
logging是python自带的一个日志模块
-
作用:
- 代替print,可以把大部分你想要进行调试的信息打印出来或者输出到指定文件。
- 可以对一些输出的调试信息分类做输出,比如说:DEBUG、INFO、WARNING、ERROR、CRITICAL
logging默认日志级别:NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL;测试使用INFO和ERROR够用
-
日志想要输出的两道门槛
- logger 收集日志,收集指定级别的日志,如指定收集DEBUG、INFO、ERROR
- handdler 输出日志,输出收集的日志到指定的文件,不设置文件默认到控制台
-
示例
import logging logging.debug("今天天气真好") logging.info("今天天气有点差") logging.warning("马上就是大佬") logging.error("有人是金牛座") logging.critical("发现什么问题了")
控制台输出:
- 默认输出warning及以上级别的日志
- root是日志收集器的名字
-
自定义日志
#输出渠道是控制台 import logging #定义一个日志收集器 my_logger=logging.getLogger("new") #设定收集的级别,不设定的话,默认收集warning及以上级别的日志 my_logger.setLevel("DEBUG") #创建一个自己的输出渠道(输出也要设定级别,否则也是默认输出warning及以上级别的日志) ch=logging.StreamHandler() ch.setLevel("DEBUG") #将收集和输出对接,指定输出渠道 my_logger.addHandler(ch) #收集日志 my_logger.debug("自己定义的debug日志") my_logger.info("自己定义的info日志") my_logger.warning("自己定义的warning日志") my_logger.error("自己定义的error日志") my_logger.critical("自己定义的critical日志")
控制台输出:
#输出渠道是文件 import logging import sys reload( sys ) sys.setdefaultencoding('utf-8') #定义一个日志收集器 my_logger=logging.getLogger("new") #设定收集的级别,不设定的话,默认收集warning及以上级别的日志 my_logger.setLevel("DEBUG") #创建输出渠道-输出到文件 fh=logging.FileHandler("20191005log.txt",encoding="UTF-8") #设定输出日志的级别 fh.setLevel("INFO") #将收集和输出对接 my_logger.addHandler(fh) #收集日志 my_logger.debug("自己定义的debug日志") my_logger.info("自己定义的info日志") my_logger.warning("自己定义的warning日志") my_logger.error("自己定义的error日志") my_logger.critical("自己定义的critical日志")
日志文件:
ps:python2.7 报错
'ascii' codec can't decode byte 0xe8 in position 0
,添加代码:import sys reload( sys ) sys.setdefaultencoding('utf-8')
日志格式 formatter
日志记录的最终输出格式,formatter对象定义了最终的log信息的顺序、结构和内容,规定了日志输出按照什么样的格式,默认的时间格式为
%Y-%m-%d %H:%M:%S
常用格式:·formatter=logging.Formatter("%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(massage)s")
#设定输出格式
import logging
import sys
reload( sys )
sys.setdefaultencoding('utf-8')
# 定义一个日志收集器
my_logger = logging.getLogger("new")
# 设定收集的级别,不设定的话,默认收集warning及以上级别的日志
my_logger.setLevel("DEBUG")
#新增,设定输出格式
formatter=logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s')
#输出到控制台
ch = logging.StreamHandler()
ch.setLevel("DEBUG")
#新增,使用格式
ch.setFormatter(formatter)
#输出到文件
fh=logging.FileHandler("20191005log.txt",encoding="UTF-8")
fh.setLevel("INFO")
#新增,使用格式
fh.setFormatter(formatter)
# 将收集和输出对接,指定输出渠道
my_logger.addHandler(ch)
my_logger.addHandler(fh)
# 收集日志
my_logger.debug("自己定义的debug日志")
my_logger.info("自己定义的info日志")
my_logger.warning("自己定义的warning日志")
my_logger.error("自己定义的error日志")
my_logger.critical("自己定义的critical日志")
输出:
- 格式中的变量含义
-
写为一个类-日志类
import logging import sys reload(sys) sys.setdefaultencoding('utf-8') from common.public.project_path import * class MyLog: def my_log(self,msg,level): # 定义一个日志收集器 my_logger = logging.getLogger("my_log") # 设定收集的级别,不设定的话,默认收集warning及以上级别的日志 my_logger.setLevel("DEBUG") # 设定输出格式 formatter = logging.Formatter('%(asctime)s-%(levelname)s-%(filename)s-%(name)s-日志信息:%(message)s') # 输出到控制台 ch = logging.StreamHandler() ch.setLevel("DEBUG") ch.setFormatter(formatter) # 输出到文件 # 在project_path.py中新增一个log路径 fh = logging.FileHandler(log_path, encoding="UTF-8") fh.setLevel("DEBUG") fh.setFormatter(formatter) # 将收集和输出对接,指定输出渠道 my_logger.addHandler(ch) my_logger.addHandler(fh) # 收集日志 if level=="DEBUG": my_logger.debug(msg) elif level=="INFO": my_logger.info(msg) elif level=="WARNING": my_logger.warning(msg) elif level=="ERROR": my_logger.error(msg) elif level=="CRITICAL": my_logger.critical(msg) #关闭渠道,否则会重复收集、重复输出 my_logger.removeHandler(ch) my_logger.removeHandler(fh) def debug(self,msg): self.my_log(msg,"DEBUG") def info(self,msg): self.my_log(msg,"INFO") def warning(self,msg): self.my_log(msg,"WARNING") def error(self,msg): self.my_log(msg,"ERROR") def critical(self,msg): self.my_log(msg,"CRITICAL") if __name__ == '__main__': my_logger=MyLog() my_logger.debug("是啥") my_logger.error("是啥呢")
-
使用日志类
from common.public.my_log import MyLog my_logging=MyLog()
把原来使用print的地方,修改为使用日志类
#print print("测试用例失败{0}".format(e)) #使用日志类 my_logging.debug("测试用例失败{0}".format(e))