python单元测试unittest模块及产出测试报告
Python自带了一个单元测试的模块--------unittest,该模块封了一些校验返回结果和在执行测试用例前/后初始化的方法。
学unittest之前了解一些名词:
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
用例必须以test_开头,不然unittest无法识别到测试用例
下面展示一个简单的例子
import unittest
class MyTest(unittest.TestCase):#继承unittest.TestCase
def tearDown(self):
#每个测试用例执行之后做操作
print('111')
def setUp(self):
#每个测试用例执行之前做操作
print(22222)
def test_run(self):
self.assertEqual(1,1)
#测试用例
if __name__ == '__main__':#windows中不加此句会报错,使用窗口的run...按钮便于后面生成测试报告,右击页面的run可能会自定识别为unitttest in **.py无法生成测试报告
unittest.main()#运行所有的测试用例
执行如下代码,查看setupclass , teardownclass ,setup,teardown方法的执行顺序
setupcalss ->setup->test_error ->teardown ->setup->test_noraml ->teardown ->teardownclass
执行用例顺序是按照test_后的字母先后顺序来执行,先执行test_error 然后执行test_normal
import unittest
def add(a,b):
return a+b
class AddTest(unittest.TestCase):
@classmethod
def setUpClass(cls):#在类开始时调用setUpClass方法,一个类只调用一次
print('setUPClass')
@classmethod
def tearDownClass(cls):#在类结束时调用,一个类只调用一次
print('tearDownClass')
def setUp(self):#在测试用例前调用setup
print('SetUp')
def tearDown(self):#在测试用例执行结束时调用teardown
print('teardown')
#测试用例必须使用test_开头,unittest才能识别到
def test_normal(self):#正常的测试用例。
result = add(1,1)
print('test_normal')
self.assertEqual(2,result)
def test_error(self):#异常的测试用例
result = add(1,1)
print('test_error')
self.assertEqual(1,result)
if __name__ == '__main__':
unittest.main() #启动所有的测试用例
返回结果如下:
setUPClass SetUp test_error teardown SetUp test_normal teardown tearDownClass
常用的断言来检验测试结果
断言可添加msg来提示,当断言出现false时,提示msg的信息
注意:当assert断言语句执行后,结果为False时,assert下面后续的代码不会再执行
assertEqual(a, b,msg='a和b不相等:%s != %s'%(a,b)) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b,) a not in b
执行完测试用例后,如果将结果以报告的形式导出呢?这里可以引用 一个第三方模块,HTMLTestRunner,该模块网上可下载,不过可能只支持python 2,可以根据百度结果修改为适用于python3的版本,将下载的文件放置在python的安装目录的lib里
import unittest
def add(a,b):
return a+b
import HTMLTestRunner
class AddTest(unittest.TestCase):
@classmethod
def setUpClass(cls):#在类开始时调用setUpClass方法,一个类只调用一次
print('setUPClass')
@classmethod
def tearDownClass(cls):#在类结束时调用,一个类只调用一次
print('tearDownClass')
def setUp(self):#在测试用例前调用setup
print('SetUp')
def tearDown(self):#在测试用例执行结束时调用teardown
print('teardown')
#测试用例必须使用test_开头,unittest才能识别到
def test_normal(self):#正常的测试用例。
result = add(1,1)
self.assertEqual(2,result)
# print('test_normal')
def test_error(self):#异常的测试用例
result = add(1,1)
self.assertEqual(1,result)
# self.assertIn(1,[1,2,3,4])
# self.assertNotEqual(1,1)
# self.assertFalse()
# self.assertTrue()
# print('test_error')
if __name__ == '__main__':
# HTMLTestRunner产生测试报告
# test_suite = unittest.makeSuite(AddTest)#将Addtest类建立成一个测试套件
test_suite = unittest.TestSuite() # 创建一个测试集合
test_suite.addTest(AddTest('test_error')) # 测试套件中添加测试用例
file = open('report.html', 'wb')
runner = HTMLTestRunner.HTMLTestRunner(file, title='测试报告')
runner.run(test_suite) # run入参只能为测试集合
file.close()
由于生成的测试报告样式较为简单,目前可引用更好的测试报告模块,BeautifulReport模块,可通过pip install BeautifulReport模块来安装该模块
import unittest
import BeautifulReport as brf
class TestLogin(unittest.TestCase):
def test_login_normal(self):
'''正常登录'''
self.assertEqual(1,1)
def test_login_black_list(self):
'''黑名单登录'''
self.assertEqual(True,False,msg='黑名单登录运行失败')
def test_login_exit(self):
'''用户退出'''
self.assertNotIn(1,[1,2,3],msg='这个是notin')
def test_login_max_count(self):
'''登录最大次数'''
self.assertNotEqual(1,2,msg='这个是不相等的')
# unittest.main()
if __name__ == '__main__':
suite = unittest.makeSuite(TestLogin)
'''BeatifulReport产出测试'''
runner = brf.BeautifulReport(suite)
runner.report(description='登录结果测试报告',filename='bf.html')
点开生成的html格式的测试报告,在页面上晃动鼠标右上方将出现各种浏览器图标,点击即可通过浏览器打开,报告效果如下:
用例描述字段,只需要在测试方法的第一行使用三引号写上注释即可


浙公网安备 33010602011771号