单元测试说白了,就是通过写检验代码检查之前写的代码是否运行结果正确,python自带了unitest这个模块,可以用他来做单元测试
testcase 测试用例
testsuite 用例集合
testrunner 运行测试用例
testloader 查找测试用例
下面是一个简单的单元测试:
import unittest def add(a,b): return a+b class AddTest(unittest.TestCase): def test_normal(self): result = add(1,1) self.assertEqual(2,result) #校验结果是否一致 def test_error(self): result = add(1,1) self.assertEqual(1,result,'结果计算错误') unittest.main()
生成测试报告,通过导入HTMLTestRunner模块,这个模块需要自己安装,我是将HTMLTestRunner.py文件存放在我所用的环境下的Lib文件下,如果测试用的是虚拟环境,则放在虚拟环境的下的Lib文件下也可以
虚拟环境:
pip install virtualenv #安装虚拟环境
import unittest import HTMLTestRunner def add(a,b): return a+b class AddTest(unittest.TestCase): @classmethod def setUpClass(cls):#所有用例执行之前执行它 print('setUpClass') @classmethod def tearDownClass(cls):#所有用例执行之后执行它 print('tearDownClass') def setUp(self): print('setUp') #每条用例执行之前都会执行它 def tearDown(self): print('tearDown') #每条用例执行之后都会执行它 def test_normal(self): result = add(1,1) self.assertEqual(2,result) print('test_normal') def test_error(self): print('test_error') result = add(1,1) self.assertEqual(1,result,'结果计算错误') #htmltestruner产生测试报告 test_suite = unittest.makeSuite(AddTest) file = open('report.html','wb') runner = HTMLTestRunner.HTMLTestRunner(file,title='测试报告') runner.run(test_suite) file.close()
生成报告
安装BeautifulReport模块,我是将BeautifulReport文件夹存放在我所用的环境下的Lib文件下site-packages目录下,如有虚拟环境,就放虚拟环境下
参数化要导入parameterized模块,使用pip install parameterized安装该模块
import parameterized import unittest,BeautifulReport data = [ ['admin','123456',True,'正常登录'], #这里传入信息如“正常登录”,用例描述则显示这个 ['admin','1122',False,'冻结用户登录'], ['sdfsdf','1111',False,'黑名单用户登录'] ] data2 = [ ['admin','123456',True], ['admin','1122',False], ['sdfsdf','1111',False] ] def login(user,password): if user=='admin' and password=='123456': return True return False class LoginTest(unittest.TestCase): @parameterized.parameterized.expand(data) def test_login(self,user,password,expect,desc): self._testMethodDoc = desc #自己指定 result = login(user,password) self.assertEqual(expect,result) @parameterized.parameterized.expand(data2) def test_login2(self,user,password,expect): '''登录''' #默认用例描述 result = login(user,password) self.assertEqual(expect,result) bf = BeautifulReport.BeautifulReport(unittest.makeSuite(LoginTest)) bf.report(filename='测试报告',description='接口测试报告')
多层目录如何查找测试用例,这个地方遇到个坑,没传top_lever_dir时,一直报错AssertionError: Path must be within the project,最后在以下这篇文章中找到解决方法
https://www.cnblogs.com/huwang-sun/p/11212158.html
import unittest,os all_suite = unittest.TestSuite() for cur_dir,dirs,files in os.walk('cases'): for dir in dirs: if not dir.startswith('__'): abs_path = os.path.join(cur_dir,dir) print(abs_path) test_suite = unittest.defaultTestLoader.discover(abs_path,pattern='*.py',top_level_dir='cases') all_suite.addTests(test_suite) print(all_suite)
生成报告如下