python使用筆記27--unittest單元測試框架
阿新 • • 發佈:2020-06-29
單元測試:開發程式的人自己測試自己的程式碼
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())