前面介紹了是用unittest管理測試用例,這次看看如何生成html格式的測試報告
生成html格式的測試報告需要用到 HTMLTestRunner,在網上下載了一個HTMLTestRunner.py,然後放到python安裝路徑下的lib目錄中。
(我用的python3,是下載的蟲師寫的那個,下載地址-->連結:https://pan.baidu.com/s/101y-X--o6iSd9WTDv5K4XQ 密碼:24xh)
1.執行單個.py檔案中的測試用例
# -*-coding:UTF:8-*- import unittest from interface.demo import RunMain # 從之前封裝的檔案中,引入RunMain類 import HTMLTestRunner # 匯入HTMLTestRunner模組 import json class TestMethod(unittest.TestCase): # 定義一個類,繼承自unittest.TestCase def setUp(self): self.run = RunMain() # 在初始化方法中例項化一個物件,這樣就不需要在每個用例中再進行例項化了 def test01(self): """獲取辦件申請人資訊""" #在用例名下新增介面描述,可以增加測試報告可讀性 url = 'http://localhost:7001/XXX' data = { 'controlSeq': '2018118325' } r = self.run.run_main(url, 'POST', data) # 呼叫RunMain類中run_main方法 print(r) re = json.loads(r) self.assertEqual(re['status'], '200', '測試失敗') # globals()['userid'] = 22 #定義全域性變數 def test02(self): """查詢辦件進度結果資訊介面""" # print(userid) #使用case1中的全域性變數,執行時需要全部執行,不能只執行後面的,不然會報錯 url = 'http://localhost:7001/XXX' data = { "controlSeq": "2018118325" } r = self.run.run_main(url, 'GET', data) print(r) re = json.loads(r) self.assertEqual(re["status"], '200', '測試失敗') # @unittest.skip('test03') # 跳過用例test03 def test03(self): """儲存辦件快遞資訊介面(審批3.0)""" url = 'http://localhost:7001/XXX' data = { 'controlSeq': '2018118361', 'seq': '2939', 'type': '1' } r = self.run.run_main(url, 'POST', data) print(r) # print(type(r)) # 檢視返回物件r的型別 re = json.loads(r) # print(type(re)) self.assertEqual(re['status'], '200', '測試失敗') if __name__ == "__main__": # unittest.main() # print('__name__==__main__') filename = 'E:/CommonService/interface/report/testresult.html' #測試報告的存放路徑及檔名 fp = open(filename, 'wb') # 創測試報告html檔案,此時還是個空檔案 suite = unittest.TestSuite() # 呼叫unittest的TestSuite(),理解為管理case的一個容器(測試套件) suite.addTest(TestMethod('test01')) # 向測試套件中新增用例,"TestMethod"是上面定義的類名,"test01"是用例名 suite.addTest(TestMethod('test02')) suite.addTest(TestMethod('test03')) # runner = unittest.TextTestRunner() # 執行套件中的用例 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='介面測試報告', description='測試結果如下: ') # stream = fp 引用檔案流 # title 測試報告標題 # description 報告說明與描述 runner.run(suite) # 執行測試 fp.close() # 關閉檔案流,將HTML內容寫進測試報告檔案
2.使用discover()方法批量載入多個.py檔案中的測試用例
工程目錄如下:
case是測試用例所在目錄,裡面包括2個二級目錄,存放的都是測試用例;
report存放測試報告的目錄;
最外層的run_all_case.py,用它來執行所有用例
(1)直接載入discover中的用例
run_all_case.py
import time from HTMLTestRunner import HTMLTestRunner import unittest case_dir = 'E:/CommonService/interface/case' # 定義用例所在路徑 """定義discover方法""" discover = unittest.defaultTestLoader.discover(case_dir, pattern='test_*.py', top_level_dir=None) """ 1.case_dir即測試用例所在目錄 2.pattern='test_*.py' :表示用例檔名的匹配原則,“*”表示任意多個字元,這裡表示匹配所有以test_開頭的檔案 3.top_level_dir=None:測試模組的頂層目錄。如果沒頂層目錄(也就是說測試用例不是放在多級目錄 中),預設為 None """ if __name__ == "__main__": """直接載入discover""" now = time.strftime("%Y-%m-%d %H_%M_%S") filename = 'E:/CommonService/interface/report/' + now + '_result.html' fp = open(filename, 'wb') runner = HTMLTestRunner(stream=fp, title='UnifiedReporting Test Report', description='Implementation Example with: ') runner.run(discover) fp.close()
(2)通過把discover中的用例載入到測試套件中執行
run_all_case.py
import time from HTMLTestRunner import HTMLTestRunner import unittest case_dir = 'E:/CommonService/interface/case' # 定義用例所在路徑 """定義discover方法""" discover = unittest.defaultTestLoader.discover(case_dir, pattern='test_*.py', top_level_dir=None) """ 1.case_dir即測試用例所在目錄 2.pattern='test_*.py' :表示用例檔名的匹配原則,“*”表示任意多個字元 3.top_level_dir=None:測試模組的頂層目錄。如果沒頂層目錄(也就是說測試用例不是放在多級目錄 中),預設為 None """ if __name__ == '__main__': """通過把discover中的用例載入到測試套件中執行""" suite = unittest.TestSuite() # 定義一個測試套件
# discover 方法篩選出來的用例,迴圈新增到測試套件中 for test_suite in discover: for test_case in test_suite: suite.addTests(test_case) print(suite) #列印一下可以看到suite中新增了哪些測試用例 now = time.strftime("%Y-%m-%d %H_%M_%S") filename = 'E:/CommonService/interface/report/' + now + '_result.html' fp = open(filename, 'wb') runner = HTMLTestRunner(stream=fp, title='UnifiedReporting Test Report', description='Implementation Example with: ') runner.run(suite)
(3)把discover載入測試用例的過程封裝到一個函式中
run_all_case.py
import time from HTMLTestRunner import HTMLTestRunner import unittest def allCase(): """定義一個函式,封裝discover載入測試用例的方法""" case_dir = 'E:/CommonService/interface/case' # 定義用例所在路徑 suite = unittest.TestSuite() # 定義一個測試套件 discover = unittest.defaultTestLoader.discover(case_dir, pattern='test_*.py', top_level_dir=None) # discover 方法篩選出來的用例,迴圈新增到測試套件中 for test_suite in discover: for test_case in test_suite: suite.addTests(test_case) return suite if __name__ == '__main__': allsuite = allCase() # runner = unittest.TextTestRunner() now = time.strftime("%Y-%m-%d %H_%M_%S") filename = 'E:/CommonService/interface/report/' + now + '_result.html' fp = open(filename, 'wb') runner = HTMLTestRunner(stream=fp, title='UnifiedReporting Test Report', description='Implementation Example with: ') runner.run(allsuite)
測試報告如下: