学会和熟练使用之间,还隔着100个不会的距离。
—— 俗叔
今天偶然发现一个功能修改得比较牛逼的基于Python unittest框架的测试报告生成库,特此分享一下。
大家都知道,我们一般使用unittest框架时,如果需要生成生成测试报告,需要另外引用第三方库才能生成,否则它自带那个实在是太丑,根本没法看。常见的第三方报告生成库当然要属HTMLTestrunner了,但这玩意是早期一个老外基于Python2开发的,现在都0202年,这老掉牙的玩意早就不适合时代的要求了,所以其他一些优秀的第三方报告生成库就应运而生。我知道的除了今天要介绍的这个加强版的HTMLTestrunner外,还有一个叫BeautifulReport的第三方库,改天再介绍一下。大家随便用哪个都可以,个人感觉都挺不错。
今天要介绍的这个HTMLTestrunner加强版,相当于给以前的老HTMLTestrunner生成的报告做了个漂亮的“整形手术”,生成的报告颜值那是杠杠的,非常符合当前“外貌协会”的需求。当然,除了生成高颜值的报告外,这个库还有以下的一些优点:
支持Python2和Python3,自动兼容,无需设置
支持中文和英文手动切换
支持Selenium和Appium截图报告嵌入Html报告中,可根据需求设置开启或关闭截图展示功能
样式美化需要网络支持,如果本地使用请下载离线版本
增加测试人员条目、通过率统计、所有可能情况筛选功能等
增加饼图数据展示、测试详情数据展示
增加返回顶部按钮
其他细节修改
源自 http://tungwaiyip.info 的0.82版本 HTMLTestRunner
使用实例
这个加强版的HTMLTestrunner使用起来也是非常简单的,跟之前的老版本差不多,所以我估计作者其实更多的是样式上的修改。作者的官方github上提供了一个生成中英文报告的实例,大家可以看看基本的使用方法。代码如下:
import unittest# 中文 Chinesefrom HwTestReport import HTMLTestReport# 英文 Englishfrom HwTestReport import HTMLTestReportENclass Case_assert_1(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_ok(self):
self.assertEqual(1,1)
def test_faile(self):
self.assertEqual(1,2)
def test_error(self):
raise Exceptionclass Case_assert_2(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_ok(self):
self.assertTrue(True)class Case_assert_3(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_error(self):
raise Exceptionclass Case_assert_4(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_faile(self):
self.assertEqual(1,3)if __name__ == "__main__":
suite = unittest.TestSuite()
suite.addTest(Case_assert_1('test_ok'))
suite.addTest(Case_assert_1('test_faile'))
suite.addTest(Case_assert_1('test_error'))
suite.addTest(Case_assert_2('test_ok'))
suite.addTest(Case_assert_3('test_error'))
suite.addTest(Case_assert_4('test_faile'))
# English:HTMLTestReportEN
with open('./HwTestReport.html', 'wb') as report:
runner = HTMLTestReport(stream=report,
verbosity=2,
title='HwTestReport 测试',
description='带饼图,带详情',
tester='Johnny')
runner.run(suite)
带截图的报告实例
作者同样也改进了selenium本身的截图功能,截图功能是针对 Selenium和 Appium开发,支持Python2和Python3,不同的浏览器选择不同驱动。截图功能用起来也比较简单,大家可以看看下面这个例子:
import unittest
from HwTestReport import HTMLTestReport
from HwTestReport import HTMLTestReportEN
from selenium import webdriver
class Case_baidu(unittest.TestCase):
'''
在python3中因为unittest运行机制变动,在使用setUp/tearDown中初始化/退出driver时,可能会出现用例执行失败没有截图的问题,但我没有遇到过,如果出现请使用setUpClass/tearDownClass的用法
'''
def setUp(self):
self.imgs = []
self.driver = webdriver.Firefox()
def tearDown(self):
self.driver.quit()
def get_screenshot(self):
self.imgs.append(self.driver.get_screenshot_as_base64())
return True
def test_baidu_search(self):
'''用例通过,没有报告内容,有多张截图'''
self.driver.get("https://www.baidu.com")
self.get_screenshot()
self.driver.find_element_by_id('kw').send_keys(u'百度一下')
self.get_screenshot()
self.driver.find_element_by_id('su').click()
self.get_screenshot()
def test_baidu_assert_ok(self):
'''用例通过,有报告内容,有截图'''
self.driver.get("https://www.baidu.com")
hao123 = self.driver.find_element_by_xpath('//*[@id="u1"]/a[2]').text
print(hao123)
self.get_screenshot()
self.assertEqual(hao123, 'hao123')
def test_baidu_assert_ok_noimg(self):
'''用例通过,有报告内容,没有截图'''
self.driver.get("https://www.baidu.com")
news = self.driver.find_element_by_xpath('//*[@id="u1"]/a[1]').text
print(news)
self.assertEqual(news, u"新闻")
def test_baidu_assert_faile(self):
'''用例失败,带有失败内容和截图'''
self.driver.get("https://www.baidu.com")
self.get_screenshot()
news = self.driver.find_element_by_xpath('//*[@id="u1"]/a[1]').text
print(news)
self.get_screenshot()
self.driver.find_element_by_xpath('//*[@id="u1"]/a[1]').click()
self.get_screenshot()
self.assertEqual(news, 'hao123')
def test_baidu_assert_error(self):
''''用例错误,带有指定错误内容和截图'''
self.driver.get("https://www.baidu.com")
self.get_screenshot()
raise EnvironmentError('Current environment can not testing!')
class Case_qq(unittest.TestCase):
def setUp(self):
self.imgs = []
self.driver = webdriver.Firefox()
def tearDown(self):
self.driver.quit()
def test_qq_index_faile(self):
'''用例错误,带有错误内容和没有截图'''
self.driver.get("https://www.qq.com")
self.driver.find_element_by_id('sougouTxt').send_keys(u'搜狗搜索')
# self.driver.find_element_by_id('sougouTxt').send_keys(u'搜狗搜索')
self.driver.find_element_by_id('searchBtn').click()
self.assertIn(u"搜狗", u'搜索')
def test_qq_index_ok(self):
'''用例通过,没有内容和没有截图'''
self.driver.get("https://www.qq.com")
self.driver.find_element_by_id('sougouTxt').send_keys(u'搜狗搜索')
self.driver.find_element_by_id('searchBtn').click()
class Case_163(unittest.TestCase):
def setUp(self):
self.imgs = []
self.driver = webdriver.Firefox()
def tearDown(self):
self.driver.quit()
def test_163_ok(self):
'''通过 没有内容和截图'''
self.driver.get("https://www.163.com/")
if __name__ == "__main__":
suite1 = unittest.TestLoader().loadTestsFromTestCase(Case_baidu)
suite2 = unittest.TestLoader().loadTestsFromTestCase(Case_qq)
suite3 = unittest.TestLoader().loadTestsFromTestCase(Case_163)
suites = unittest.TestSuite()
suites.addTests([suite1, suite2, suite3])
# HTMLTestReport or HTMLTestReportEN
with open('./HwTestReportIMG.html', 'wb') as report:
runner = HTMLTestReportEN(stream=report,
verbosity=2,
images=True,
title='HwTestReport 测试',
description='带截图,带饼图,带详情',
tester='Johnny')
怎么样,看着还不错吧?
至少目前这些功能用于商业的测试报告没什么问题,并且使用起来也跟之前差别不大,所以总体来说还是很香的。
其他具体的介绍,大家可以看看作者的github上的介绍,地址如下:https://github.com/hongweifuture/HwTestReport
当然好用的话,也欢迎大家给作者star一波。好了,今天的介绍就到这里,以后有什么好的工具,会继续给大家介绍。