1. 程式人生 > 實用技巧 >python使用筆記27--unittest單元測試框架

python使用筆記27--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())