python使用笔记28--unittest单元测试框架
单元测试:开发程序的人自己测试自己的代码
unittest自动化测试框架
1、单元测试
unittest框架,执行的顺序是按照方法名的字母来排序的
setUpClass方法是最开始执行的
tearDownClass是最后执行的
setUp方法是在每个方法执行前执行的
tearDown方法是在每个方法执行后执行的
1 import unittest 2 def add(a,b): 3 return a+b 4 5 #运行的顺序是按照方法名的字母排序的 6 class AddTest(unittest.TestCase):#继承unittest 7 def setUp(self):#在每个方法前执行 8 print('我是set up方法') 9 10 def tearDown(self):#在每个方法后执行 11 print('我是tearDown方法') 12 13 @classmethod 14 def setUpClass(cls):#最先开始执行的 15 print('我是setupclass方法') 16 17 @classmethod 18 def tearDownClass(cls):#最后执行的 19 print('我是tearDownclass方法') 20 21 def test_add_normal(self): 22 print('add_normal') 23 result = add(1,4) 24 self.assertEqual(5,result)#预期结果,实际结果 25 26 def test_add_error(self): 27 print('add_error') 28 result = add(1,1) 29 yq=1 30 self.assertEqual(yq,result,'add测试结果不通过,预计结果为%s,实际结果为%s'%(yq,result)) 31 32 def test_a(self): 33 print('a') 34 35 def test_b(self): 36 print('b') 37 38 unittest.main()#运行当前python文件中的所用用例
2、产生测试报告
2.1 HTMLTestRunner
下载HTMLTestRunner.py放到python的环境变量里
1 import unittest 2 import HTMLTestRunner 3 import nnreport 4 5 class TestLogin(unittest.TestCase): 6 def test_login_normal(self): 7 '''正常登录''' 8 self.assertEqual(1,1) 9 def test_login_black_list(self): 10 '''黑名单用户登录''' 11 self.assertTrue(False,'黑名单登录运行失败') 12 def test_login_exit(self): 13 '''注销用户登录''' 14 self.assertNotIn(1,[1,2,3],'这是not in 的') 15 16 def test_login_max_count(self): 17 '''超过最大错误次数登录''' 18 self.assertNotEqual(1,2,'这是不相等的') 19 20 21 # suite = unittest.TestSuite()#测试集合,手动一个个的把测试用例加入到测试集合中 22 # suite.addTest(TestLogin('test_login_normal'))#加一个测试用例 23 suite = unittest.makeSuite(TestLogin)#将整个测试用例都放进集合中 24 25 #HTMLTestRunner 26 f = open('测试报告.html','wb') 27 runner = HTMLTestRunner.HTMLTestRunner(f,title='登录接口测试报告',description='这个是登录接口的测试报告') 28 runner.run(suite) 29 f.close()
测试报告如何打开:
1.选中文件--右键--Copy Path...--拷贝路径--放到浏览器中打开
2.双击测试报告--在测试报告的html脚本中移动鼠标--会弹出浏览器的选项--选择对应的浏览器打开
执行的测试报告如图所示:
2.2 nnreport
pip install nnreport
1 import unittest 2 import HTMLTestRunner 3 import nnreport 4 5 class TestLogin(unittest.TestCase): 6 def test_login_normal(self): 7 '''正常登录''' 8 self.assertEqual(1,1) 9 def test_login_black_list(self): 10 '''黑名单用户登录''' 11 self.assertTrue(False,'黑名单登录运行失败') 12 def test_login_exit(self): 13 '''注销用户登录''' 14 self.assertNotIn(1,[1,2,3],'这是not in 的') 15 16 def test_login_max_count(self): 17 '''超过最大错误次数登录''' 18 self.assertNotEqual(1,2,'这是不相等的') 19 20 21 # suite = unittest.TestSuite()#测试集合,手动一个个的把测试用例加入到测试集合中 22 # suite.addTest(TestLogin('test_login_normal'))#加一个测试用例 23 suite = unittest.makeSuite(TestLogin)#将整个测试用例都放进集合中 24 25 #BeautifulReport 26 runner = nnreport.BeautifulReport(suite) 27 runner.report(description='登录接口测试报告',filename='login_report.html',log_path='D:\\')#描述,文件名,指定路径
测试报告如图所示:
2.3 查找测试报告
一个文件夹下有多个测试的python文件
1 import unittest 2 import nnreport 3 4 #在当前路径下,写名字 5 #不在当前路径下,写绝对路径 6 #test*.py制定一个查找规则,只找test开头的python文件,默认是test开头的python文件 7 suite = unittest.defaultTestLoader.discover('cases','test*.py') 8 report = nnreport.BeautifulReport(suite) 9 report.report(description='查找测试用例的测试报告',filename='查找测试用例的测试报告.html')
执行结果如图:
3、参数化
代码驱动:用例都是代码写的
数据驱动:用例是根据数据来执行的
关键字驱动:UI自动化的时候会用到
pip install parameterized
3.1 固定参数
1 class stuInfoTest(unittest.TestCase): 2 url = 'http://api.nnzhp.cn/api/user/stu_info' 3 4 @parameterized.parameterized.expand([ 5 ['王月',18], 6 ['小黑',11], 7 ['小白',13], 8 ['小慧',29], 9 ['小兰',98] 10 ]) 11 def test_single1(self,name,age): 12 data = {'stu_name':name,'age':age} 13 r = requests.get(self.url,data) 14 print(r.json())
3.2 文件参数
1 import unittest 2 import requests 3 import parameterized 4 import os 5 6 class Get_Data: 7 @staticmethod 8 def read_data_to_file(file_name): 9 datas = [] 10 if os.path.exists(file_name): 11 with open(file_name,'r',encoding='utf-8') as fr: 12 for line in fr: 13 d1 = line.strip().split(',') 14 datas.append(d1) 15 else: 16 raise FileNotFoundError('参数化文件找不到') 17 18 return datas 19 20 @staticmethod 21 def read_data_to_excel(file_name): 22 pass 23 24 @staticmethod 25 def read_data_to_redis(): 26 pass 27 28 # result = read_data('stu_info.txt') 29 # print(result) 30 # quit() 31 32 33 class stuInfoTest(unittest.TestCase): 34 url = 'http://api.nnzhp.cn/api/user/stu_info' 37 #有多少条数据,就执行多少次 38 @parameterized.parameterized.expand(Get_Data.read_data_to_file('stu_info.txt')) 39 def test_single(self,name,age): 40 print(name) 41 data = {'stu_name':name,'age':age} 42 r = requests.get(self.url,data) 43 print(r.json())