上一篇博文主要介紹了用unittest管理測試用例,這次學習如何使用unittest生成html格式的測試報告。
生成html格式的測試報告需要用到HTMLTestRunner,放到python安裝路徑下lib目錄中即可。
1.執行單個.py文件中的測試用例
# -*-coding:UTF:8-*-
import unittest
from mylib.run_method 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://192.168.180.126/api/user/login/'
data = {
'username': 'admin',
'password': 'admin123456',
'code': '666'
}
r = self.run.run_main(url, 'POST', data) # 調用RunMain類中run_main方法
self.assertEqual(r['message'], '登錄成功', '登錄成功')
def test02(self):
"""用戶名或密碼錯誤"""
url = 'http://192.168.180.126/api/user/login/'
data = {
'username': '123',
'password': '123456',
'code': '666'
}
r = self.run.run_main(url, 'POST', data)
self.assertEqual(r["password"], ['用戶名或密碼錯誤'], '用戶名或密碼錯誤')
# @unittest.skip('test03') # 跳過用例test03
def test03(self):
"""code字段不能爲空"""
url = 'http://192.168.180.126/api/user/login/'
data = {
'username': 'ZY',
'password': '666666aaa',
'code': ''
}
r = self.run.run_main(url, 'POST', data)
self.assertEqual(r['code'], ['該字段不能爲空。'], 'code字段不能爲空')
filename = 'E:/PyChram項目集合/interfacetest/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 = HTMLTestRunner.HTMLTestRunner(stream=fp, title='接口測試報告', description='測試結果如下: ')
# stream = fp 引用文件流
# title 測試報告標題
# description 報告說明與描述
runner.run(suite) # 執行測試
fp.close() # 關閉文件流,將HTML內容寫進測試報告文件
生成html如下:
2.使用discover()方法批量加載多個.py文件中的測試用例
工程目錄如下:
case是測試用例所在目錄,裏面包括2個二級目錄,存放的都是測試用例;
repost存放測試報告的目錄;
run存放執行測試用例的目錄。
1)直接加載discover中的用例
import time
from HTMLTestRunner import HTMLTestRunner
import unittest
case_dir = 'E:/PyChram項目集合/interfacetest/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:/PyChram項目集合/interfacetest/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中的用例加載到測試套件中執行
import time
from HTMLTestRunner import HTMLTestRunner
import unittest
case_dir = 'E:/PyChram項目集合/interfacetest/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:/PyChram項目集合/interfacetest/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加載測試用例的過程封裝在一個函數中
import time
from HTMLTestRunner import HTMLTestRunner
import unittest
def allCase():
"""定義一個函數,封裝discover加載測試用例的方法"""
case_dir = 'E:/PyChram項目集合/interfacetest/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:/PyChram項目集合/interfacetest/report/' + now + '_result.html'
fp = open(filename, 'wb')
runner = HTMLTestRunner(stream=fp,
title='UnifiedReporting Test Report',
description='Implementation Example with: ')
runner.run(allsuite)
測試報告如下: