直接把HTMLTestRunner.py放入工程目錄即可
報告腳本封裝
#HTNL格式報告
now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
htmlreport = reportpath + "/" + now + r"result.html"
print("測試報告生成地址:%s"% htmlreport)
fp = open(htmlreport, "wb")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
verbosity=2,
title="xxxx接口自動化測試報告",
description="用例執行情況")
runner.run(case) # case為所有的測試用例
fp.close()
使用Python自帶的logging
直接飲用即可
import logging
log等級
級別何時使用DEBUG詳細信息,典型地調試問題時會感興趣。詳細的debug信息。INFO證明事情按預期工作。關鍵事件。WARNING表明發生了一些意外,或者不久的將來會發生問題(如『磁碟滿了』)。軟體還是在正常工作。ERROR由於更嚴重的問題,軟體已不能執行一些功能了。一般錯誤消息。CRITICAL嚴重錯誤,表明軟體已不能繼續運行了。NOTICE不是錯誤,但是可能需要處理。普通但是重要的事件。ALERT需要立即修復,例如系統資料庫損壞。EMERGENCY緊急情況,系統不可用(例如系統崩潰),一般會通知所有用戶。logging.basicConfig()函數包含參數說明
參數名稱 描述filename指定日誌輸出目標文件的文件名(可以寫文件名也可以寫文件的完整的絕對路徑,寫文件名日誌放執行文件目錄下,寫完整路徑按照完整路徑生成日誌文件),指定該設置項後日誌信心就不會被輸出到控制臺了filemode指定日誌文件的打開模式,默認為'a'。需要注意的是,該選項要在filename指定時才有效format指定日誌格式字符串,即指定日誌輸出時所包含的欄位信息以及它們的順序。logging模塊定義的格式欄位下面會列出。datefmt指定日期/時間格式。需要注意的是,該選項要在format中包含時間欄位%(asctime)s時才有效level指定日誌器的日誌級別stream指定日誌輸出目標stream,如sys.stdout、sys.stderr以及網絡stream。需要說明的是,stream和filename不能同時提供,否則會引發 ValueError異常stylePython 3.2中新添加的配置項。指定format格式字符串的風格,可取值為'%'、'{'和'$',默認為'%'handlersPython 3.3中新添加的配置項。該選項如果被指定,它應該是一個創建了多個Handler的可迭代對象,這些handler將會被添加到root logger。需要說明的是:filename、stream和handlers這三個配置項只能有一個存在,不能同時出現2個或3個,否則會引發ValueError異常。logging模塊中定義好的可以用於format格式字符串說明
欄位/屬性名稱使用格式描述asctime%(asctime)s將日誌的時間構造成可讀的形式,默認情況下是『2016-02-08 12:00:00,123』精確到毫秒name%(name)s所使用的日誌器名稱,默認是'root',因為默認使用的是 rootLoggerfilename%(filename)s調用日誌輸出函數的模塊的文件名;pathname的文件名部分,包含文件後綴funcName%(funcName)s由哪個function發出的log, 調用日誌輸出函數的函數名levelname%(levelname)s日誌的最終等級(被filter修改後的)message%(message)s日誌信息, 日誌記錄的文本內容lineno%(lineno)d當前日誌的行號, 調用日誌輸出函數的語句所在的代碼行levelno%(levelno)s該日誌記錄的數字形式的日誌級別(10, 20, 30, 40, 50)pathname%(pathname)s完整路徑 ,調用日誌輸出函數的模塊的完整路徑名,可能沒有process%(process)s當前進程, 進程ID。可能沒有processName%(processName)s進程名稱,Python 3.1新增thread%(thread)s當前線程, 線程ID。可能沒有threadName%(thread)s線程名稱module%(module)s調用日誌輸出函數的模塊名, filename的名稱部分,不包含後綴即不包含文件後綴的文件名created%(created)f當前時間,用UNIX標準的表示時間的浮點數表示;日誌事件發生的時間--時間戳,就是當時調用time.time()函數返回的值relativeCreated%(relativeCreated)d輸出日誌信息時的,自Logger創建以 來的毫秒數;日誌事件發生的時間相對於logging模塊加載時間的相對毫秒數msecs%(msecs)d日誌事件發生事件的毫秒部分。logging.basicConfig()中用了參數datefmt,將會去掉asctime中產生的毫秒部分,可以用這個加上生成log腳本封裝
#LOG日誌記錄
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename=log_path + '/' + now + r"result.log",
filemode='w')
logger = logging.getLogger()
logger.info(case)
# coding=utf-8
import unittest
import time,datetime
from common import HTMLTestRunner
from common.send_mail import sendmain
import os
import logging
now_path = os.path.dirname(os.path.realpath(__file__)) # 獲取當前路徑
report_path = os.path.join(now_path , "../report") # HTML報告存儲路徑
log_path = os.path.join(now_path , "../log") # LOG日誌存儲路徑
if not os.path.exists(report_path): os.mkdir(report_path)
case_path = os.path.join(now_path , "../case") # 測試用例路徑
def load_case(casepath=case_path, rule="test*.py"):
'''加載所有的測試用例'''
discover = unittest.defaultTestLoader.discover(casepath, pattern=rule,) # 定義discover方法的參數
return discover
def run_case(test_case, reportpath=report_path):
'''執行所有的用例, 並把結果寫入測試報告'''
#HTNL格式報告
now = datetime.datetime.now().strftime('%Y-%m-%d_%H_%M_%S')
report = reportpath + "/" + now + r"result.html"
print("測試報告生成地址:%s"% report)
fp = open(report, "wb")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, verbosity=2, title="xxxx接口自動化測試報告", description="用例執行情況")
#LOG日誌記錄
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename=log_path + '/' + now + r"result.log",
filemode='w')
logger = logging.getLogger()
logger.info(test_case)
# 調用load_case函數返回值
runner.run(test_case)
fp.close()
time.sleep(2)
sendmain(report, mail_to=['yyyyyy@qq.com'])
print("發送測試報告郵件OK")
if __name__ == "__main__":
my_cases = load_case()
run_case(my_cases)