HTMLTestRunner是Python标准库unittest单元测试框架的一个扩展,可以生成易于使用的HTML测试报告,这个扩展很简单,只有一个HTMLTestRunner.py,下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html。
下载该文件,然后把它放到Python3的lib目录下,我的为:D:Python35Lib。
1.修改HTMLTestRunner
HTMLTestRunner.py是基于Python2开发的,如果是Python3环境,需要修改HTMLTestRunner.py文件。
1 import StringIO修改为import io 2 self.outputBuffer = StringIO.StringIO()修改为self.outputBuffer = io.StringIO() 3 print >>sys.stderr, ' Time Elapsed: %s' % (self.stopTime-self.startTime)修改为print(sys.stderr, ' Time Elapsed: %s' % (self.stopTime-self.startTime)) 4 if not rmap.has_key(cls):修改为if not cls in rmap: 5 uo = o.decode('latin-1')修改为uo = e 6 ue = e.decode('latin-1')修改为ue = e
在Python交互模式下引入HTMLTestRunner模块,没有报错,则说明添加成功:
1 C:Users>python3 2 Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32 3 Type "help", "copyright", "credits" or "license" for more information. 4 >>> import HTMLTestRunner 5 >>>
2.生成HTML测试报告
1 # coding:utf-8 2 import unittest 3 from selenium import webdriver 4 import time 5 from HTMLTestRunner import HTMLTestRunner 6 7 8 class TestBaidu(unittest.TestCase): 9 10 def setUp(self): 11 self.driver = webdriver.Firefox() 12 self.driver.maximize_window() 13 self.driver.implicitly_wait(10) 14 self.base_url = "http://www.baidu.com" 15 16 def tearDown(self): 17 self.driver.quit() 18 19 def test_baidu(self): 20 driver = self.driver 21 driver.get(self.base_url) 22 driver.find_element_by_id("kw").send_keys("selenium") 23 driver.find_element_by_id("su").click() 24 time.sleep(3) 25 self.assertEqual(driver.title, "selenium_百度搜索") 26 27 28 if __name__ == '__main__': 29 suite = unittest.TestSuite() 30 suite.addTest(TestBaidu("test_baidu")) 31 file = open("./resultReport.html", "wb") 32 runner = HTMLTestRunner(stream=file, title="百度搜索测试报告",description="用例执行情况:") 33 runner.run(suite) 34 file.close()
在当前目录打开resultReport.html:
3.优化测试报告
HTMLTestRunner可以读取doc string类型的注释,因此,只需要在测试类或者测试方法下添加doc string类型的注释即可显示测试类和测试方法的注释。
1 # coding:utf-8 2 import unittest 3 from selenium import webdriver 4 import time 5 from HTMLTestRunner import HTMLTestRunner 6 7 8 class TestBaidu(unittest.TestCase): 9 """测试百度搜索""" 10 def setUp(self): 11 self.driver = webdriver.Firefox() 12 self.driver.maximize_window() 13 self.driver.implicitly_wait(10) 14 self.base_url = "http://www.baidu.com" 15 16 def tearDown(self): 17 self.driver.quit() 18 19 def test_baidu(self): 20 """搜索关键词selenium""" 21 driver = self.driver 22 driver.get(self.base_url) 23 driver.find_element_by_id("kw").send_keys("selenium") 24 driver.find_element_by_id("su").click() 25 time.sleep(3) 26 self.assertEqual(driver.title, "selenium_百度搜索") 27 28 29 if __name__ == '__main__': 30 suite = unittest.TestSuite() 31 suite.addTest(TestBaidu("test_baidu")) 32 file = open("./resultReport.html", "wb") 33 runner = HTMLTestRunner(stream=file, title="百度搜索测试报告",description="用例执行情况:") 34 runner.run(suite) 35 file.close()
运行脚本,然后在当前目录下打开resultReport.html文件:
4.修改测试报告名称
在测试之前,如果不修改测试报告文件名,则运行结束后,之前的测试报告会被覆盖,为了避免这种情况,我们可以在文件命中添加时间。
Python的time模块为我们提供了很多操作时间的方法:
1 # coding:utf-8 2 import time 3 4 print(time.time()) # 返回当前时间(以秒为单位),自1970-01-01 00:00:00以来的秒数 5 6 print(time.localtime()) # 将1970-01-01 00:00:00以来的秒转换为本地时间的元组 7 8 print(time.ctime()) # 将1970-01-01 00:00:00以来的以秒为单位的时间转换为本地时间的字符串 9 10 11 print(time.strftime(("%Y-%m-%d %H_%M_%S"))) # 根据设置的格式将时间元组转换为字符串 12 """ 13 %Y 带世纪部分的十进制年份,2019 14 %m 十进制表示的月份, [01,12]. 15 %d 十进制表示每月的第几天 [01,31]. 16 %H 24小时制十进制的小时 [00,23]. 17 %M 十进制表示的分钟数 [00,59]. 18 %S 十进制的秒数 19 %z 时区名称 20 %a 星期的简称 ,Sun 21 %A 星期的全称 ,Sunday 22 %b 月份的简称,Mar 23 %B 月份的全称,March 24 %I 12小时制的小时 [01,12]. 25 %p 本地的AM或PM的等价显示 26 """
修改测试脚本:
1 if __name__ == '__main__': 2 suite = unittest.TestSuite() 3 suite.addTest(TestBaidu("test_baidu")) 4 now_time = time.strftime("%Y-%m-%d %H_%M_%S") 5 file_name = "./"+now_time+"result.html" 6 file = open(file_name, "wb") 7 runner = HTMLTestRunner(stream=file, title="百度搜索测试报告",description="用例执行情况:") 8 runner.run(suite) 9 file.close()
然后运行测试脚本,即可生成不同名称的测试报告。
4.输出项目集成测试报告
修改runnertest.py文件,使其可以生成项目集成测试报告。
1 # coding:utf-8 2 import unittest 3 from HTMLTestRunner import HTMLTestRunner 4 import time 5 6 discover = unittest.defaultTestLoader.discover("./testpro/testcase/", "test*.py") 7 if __name__ == '__main__': 8 9 now_time = time.strftime("%Y-%m-%d %H-%M-%S") 10 file_name = "./testpro/testresult/"+now_time+"result.html" 11 file = open(file_name, "wb") 12 runner = HTMLTestRunner(stream=file, title="测试报告", description="测试用例执行情况") 13 runner.run(discover)
执行测试脚本,查看生成的测试报告: