<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
headers=self.headers #獲取匯入模版 file_home = self.import_template log.info(file_home) wb = load_workbook(filename=file_home) ws = wb['sheet1'] # 修改產廢單位名稱,以及備註 ws['b3'] = 'itest產廢單位'+self.dic["t"] ws['s3'] = 'i原料銷售'+self.dic["t"] wb.save(file_home) url=self.url_1+"/companies/import?companyType=2" payload={} m=MultipartEncoder( fields={ "parent_dir":'/', "name":'file', "filename":'name.xlsx', 'file':('name.xlsx',open(file_home,'rb'),'application/vnd.ms-excel') } ) headers['Content-Type']=m.content_type r=requests.post(url,headers=headers,data=m) log.info(r.json())
是根據資料來測試的,如讀取 excel表中的測試用例自動填寫測試結果,傳送測試報告包括以下模組:
該自動化測試框架命名為:ATP,bin目錄下寫主程式,cases目錄下放測試用例,conf目錄下放組態檔,lib目錄下放各個封裝好的模組,logs目錄下放紀錄檔檔案,和readme檔案。
common.py:封裝讀取excel用例、呼叫介面、檢驗結果、寫入報告這幾個模組。
""" 第一步:讀取excel中用例 第二步:根據用例傳送請求 第三步:校驗結果 第四步:將測試結果、返回報文寫入excel """ import xlrd,requests from xlutils import copy from lib.log import atp_log class OpCase(object): def get_case(self,file_path): cases= [] #定義一個列表存放所有的cases if file_path.endswith('.xls') or file_path.endswith('.xlsx'): try: book = xlrd.open_workbook(file_path) sheet = book.sheet_by_index(0) for i in range(1,sheet.nrows): row_data = sheet.row_values(i) #獲取的每一行資料存到列表row_data cases.append(row_data[4:8]) atp_log.info('共讀取%s條用例'%(len(cases))) self.file_path = file_path #因為該函數已經傳了引數路徑,為方便write_excel參照,在此範例化 except Exception as e: atp_log.error('[%s]用例獲取失敗,錯誤資訊:%s'%(file_path,e)) else: atp_log.error('用例檔案不合法,%s'%file_path) return cases def my_request(self,url,method,data): data = self.dataToDict(data) try: if method.upper() == 'POST': res = requests.post(url,data).text elif method.uper() == 'GET': res = requests.get(url,params=data).text else: atp_log.warning('該請求方式暫不支援') res = '該請求方式暫不支援' except Exception as e: msg = '【%s】介面呼叫失敗,%s'%(url,e) atp_log.error(msg) res = msg return res def dataToDict(self,data): #把資料轉成字典。 res = {} data = data.split(',') for d in data: # k, v = d.split('=') res[k] = v def check_res(self,res,check): #res:實際結果,check:預期結果 res = res.replace('": "','=').replace('": ','=') for c in check.split(','): if c not in res: atp_log.info('結果校驗失敗,預期結果:【%s】,實際結果【%s】'%(c,res)) return '失敗' return '成功' def write_excel(self,case_res): book = xlrd.open_workbook(self.file_path) new_book = copy.copy(book) sheet = new_book.get_sheet(0) row = 1 for case_case in case_res: sheet.write(row,8,case_case[0]) sheet.write(row,9,case_case[1]) row += 1 new_book.save(self.file_path.replace('xlsx','xls'))
log.py:封裝紀錄檔模組
import logging,os from logging import handlers from conf import setting class Mylogger(): def __init__(self,file_name,level='info',backCount=5,when='D'): logger = logging.getLogger() # 先範例化一個logger物件,先建立一個辦公室 logger.setLevel(self.get_level(level)) # 設定紀錄檔的級別 # f1 = logging.FileHandler(filename='a.log',mode='a',encoding='utf-8') #找到寫紀錄檔檔案的這個人 c1 = logging.StreamHandler() # 負責往控制檯輸出的 b1 = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8') fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s') c1.setFormatter(fmt) b1.setFormatter(fmt) logger.addHandler(c1) logger.addHandler(b1) self.logger = logger def get_level(self,str): level = { 'debug':logging.DEBUG, 'info':logging.INFO, 'warm':logging.WARNING, 'error':logging.ERROR } str = str.lower() return level.get(str) path = os.path.join(setting.LOG_PATH,setting.LOG_NAME) atp_log = Mylogger(path,'debug').logger #直接在這裡範例化,用的時候不用再範例化了 #別的地方用的時候,直接atp_log.warnning('xxxx')
send_mail.py:封裝傳送郵件模組
import yagmail from conf import setting from lib.log import atp_log def sendmail(title,content,attrs=None): m = yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER, password=setting.MAIL_PASSWRD,smtp_ssl=True) m.send(to=setting.TO, subject=title, contents = content, attachments = attrs) atp_log.info('傳送郵件完成')
setting.py,組態檔:設定郵件地址、紀錄檔預設級別、用例存放路徑、紀錄檔存放路徑、紀錄檔檔名
import os BASE_PATH = os.path.dirname( os.path.dirname(os.path.abspath(__file__)) ) #三層目錄定位到ATP目錄 MAIL_HOST = 'smtp.qq.com' MAIL_USER='12*****89@qq.com' MAIL_PASSWRD = 'gjn*****bcgh' TO = [ '12*****9@qq.com' ] LEVEL = 'debug' #設定紀錄檔預設級別 LOG_PATH = os.path.join(BASE_PATH,'logs') #紀錄檔檔案在logs目錄下 CASE_PATH = os.path.join(BASE_PATH,'cases') #用例檔案在cases目錄下 LOG_NAME = 'atp_log' #設定紀錄檔檔名
Mark directory as Sources Root
start.py
import os,sys BASE_PATH = os.path.dirname( os.path.dirname(os.path.abspath(__file__)) ) sys.path.insert(0,BASE_PATH) from lib.common import OpCase from lib.send_mail import sendmail from conf import setting class CaseRun(object): def find_case(self): op = OpCase() for f in os.listdir(setting.CASE_PATH): #每次迴圈的時候讀一個excel abs_path = os.path.join(setting.CASE_PATH,f) case_list = op.get_case(abs_path) res_list = [] pass_count,fail_count= 0,0 for case in case_list: #迴圈每一個excel裡面的所有用例 url,method,req_data,check = case res = op.my_request(url,method,req_data) #呼叫完介面返回的結果 status = op.check_res(res,check) res_list.append([res,status]) if status == '通過': pass_count += 1 else: fail_count += 1 op.write_excel(res_list) msg = ''' xx你好, 本次共執行%s條用例,通過%s條,失敗%s條。 '''%(len(res_list),pass_count,fail_count) sendmail('測試用例執行結果',content=msg,attrs=abs_path) CaseRun().find_case()
OK,資料驅動自動化測試框架編寫完成,執行 start.py 程式,收到郵件內容如下:
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45