1、UnitTest介紹python
unittest單元測試框架不只能夠適用於單元測試,還能夠適用WEB自動化測試用例的開發與執行,該測試框架可組織執行測試用例,而且提供了豐富的斷言方法,判斷測試用例是否經過,最終生成測試結果。linux
1.一、爲何使用UnitTest框架?瀏覽器
1. 可以組織多個用例去執行。框架
2. 提供豐富的斷言方法。less
3. 提供豐富的日誌與測試結果。ide
1.二、如何使用UnitTest框架函數
1. 導包:import unittest --> 導入unitest框架。單元測試
2. 繼承:unittest.TestCase --> 新建測試類需繼承unittest.TestCase。測試
3.若是須要使用unittest的方法,須要重寫該方法,如:setUp()、teraDown()、setUpClass()、tearDownClass。ui
2、unittest單元測試框架使用
一、TestCase類中定義的幾個特殊方法
(1)setUp():每一個測試方法運行前運行,測試前的初始化工做。
def setUp(self):
self.a = 3
self.b = 1
print("查看setUp()方法執行順序")
# @Author:lsj # @version V1.0 # -*- coding:UTF-8 -*-
import unittest # 被測試類
class myclass(object): @classmethod # 裝飾器
def sum(cls,a,b): return a + b # 將兩個傳入參數進行加粗操做
@classmethod def sub(cls,a,b): return a - b # 將兩個傳入參數進行相減
# 測試類
class mytest(unittest.TestCase): def setUp(self): self.a = 3 self.b = 1
print("查看setUp()方法執行順序") def testsum(self): # 斷言:兩個數之和是否爲4
self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail') print("testsum方法") def testsub(self): # 斷言兩個數之差的結果是否爲2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail') print('testsub方法') if __name__=='__main__': unittest.main()
"D:\Program Files\Python36\python.exe" D:/pycharm/qianyan/test_case/unitestshili.py 查看setUp()方法執行順序 testsub方法 查看setUp()方法執行順序 testsum方法 .. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK Process finished with exit code 0
(2)tearDown():每一個測試方法運行結束後運行,測試後的清理工做。
1 # @Author:lsj
2 # @version V1.0
3 # -*- coding:UTF-8 -*-
4
5 import unittest 6 # 被測試類
7 class myclass(object): 8 @classmethod # 裝飾器
9 def sum(cls,a,b): 10 return a + b # 將兩個傳入參數進行加粗操做
11 @classmethod 12 def sub(cls,a,b): 13 return a - b # 將兩個傳入參數進行相減
14
15 # 測試類
16 class mytest(unittest.TestCase): 17 def setUp(self): 18 self.a = 3
19 self.b = 1
20 print("查看setUp()方法執行順序") 21 def tearDown(self): 22 print("查看tearDown()方法執行順序") 23 def testsum(self): 24 # 斷言:兩個數之和是否爲4
25 self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail') 26 print("testsum方法") 27 def testsub(self): 28 # 斷言兩個數之差的結果是否爲2
29 self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail') 30 print('testsub方法') 31 if __name__=='__main__': 32 unittest.main()
1 "D:\Program Files\Python36\python.exe" D:/pycharm/qianyan/test_case/unitestshili.py 2 .. 3 ----------------------------------------------------------------------
4 Ran 2 tests in 0.001s 5
6 OK 7 查看setUp()方法執行順序 8 testsub方法 9 查看tearDown()方法執行順序 10 查看setUp()方法執行順序 11 testsum方法 12 查看tearDown()方法執行順序 13
14 Process finished with exit code 0
(3)setUpClass():全部的測試方法運行前運行,單元測試前期準備,必須使用 @classmethod裝飾器進行修飾(裝飾器的使用詳見python),setUp()函數以前執行,整個測試過程只執行一次。好比:實例化瀏覽器、瀏覽器最大化、隱式等待設置
(4)tearDownClass():全部的測試方法運行結束後執行,單元測試後期清理,必須使用 @classmethod裝飾器進行修飾,tearDown()以後執行,整個測試過程只執行一次。
1 # @Author:lsj
2 # @version V1.0
3 # -*- coding:UTF-8 -*-
4
5 import unittest 6 # 被測試類
7 class myclass(object): 8 @classmethod # 裝飾器
9 def sum(cls,a,b): 10 return a + b # 將兩個傳入參數進行加粗操做
11 @classmethod 12 def sub(cls,a,b): 13 return a - b # 將兩個傳入參數進行相減
14
15 # 測試類
16 class mytest(unittest.TestCase): 17 @classmethod 18 def setUpClass(cls): 19 print("查看setUpClass()方法執行順序") 20 @classmethod 21 def tearDownClass(cls): 22 print("查看tearDownClass()方法執行順序") 23 def setUp(self): 24 self.a = 3
25 self.b = 1
26 print("查看setUp()方法執行順序") 27 def tearDown(self): 28 print("查看tearDown()方法執行順序") 29 def testsum(self): 30 # 斷言:兩個數之和是否爲4
31 self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail') 32 print("testsum方法") 33 def testsub(self): 34 # 斷言兩個數之差的結果是否爲2
35 self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail') 36 print('testsub方法') 37 if __name__=='__main__': 38 unittest.main()
"D:\Program Files\Python36\python.exe" D:/pycharm/qianyan/test_case/unitestshili.py 查看setUpClass()方法執行順序 查看setUp()方法執行順序 testsub方法 查看tearDown()方法執行順序 查看setUp()方法執行順序 testsum方法 查看tearDown()方法執行順序 查看tearDownClass()方法執行順序 .. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK Process finished with exit code 0
二、用例執行
2.一、單一測試模塊執行用例
2.1.一、啓動單元測試:使用unittest.main()方法 ,用例執行順序是按照方法名的ASCII碼升序排列的
2.1.二、測試集合
1)將功能相關的測試用例組合到一塊兒成爲一個測試用例集,unittest框架中經過TestSuite類來組裝全部的測試用例集。(也就是說,使用測試集合能夠同時執行同一個py文件中的多個測試用例類)
2)TestLoader類:測試用例加載器,返回一個測試用例集合
3)loadTestsFromTestCase類:根據給定的測試類,獲取其中的全部以‘test’開頭的測試方法,並返回一個測試集合
4)TestSuite類:組裝測試用例的實例,支持添加和刪除用例,最後將傳遞給test runner進行測試執行
5)TextTestRunner類:測試用例執行類,其中Text 表示以文本形式輸出測試結果
unittest運行錯誤:類名儘可能不要用test/Test
問題:在執行文件的時候明明要執行一個類,卻發現全部的類都被執行了。
針對這一問題以下解決辦法:edit configurations-->選中python-->增長或修改一條記錄
2.1.三、按照特定順序執行測試用例
1)獲取 TestSuite的實例對象:suite=unittest.TestSuite()
2)將測試用例添加到測試容器中
suite.addTest(mytest("test_1sub"))
suite.addTest(mytest("test_2sum"))
3)建立TextTestRunner類的實例對象
runner=unittest.TextTestRunner()
runner.run(suite)
1 # @Author:lsj
2 # @version V1.0
3 # -*- coding:UTF-8 -*-
4
5 import unittest 6 # 被測試類
7 class myclass(object): 8 @classmethod # 裝飾器
9 def sum(cls,a,b): 10 return a + b # 將兩個傳入參數進行加粗操做
11 @classmethod 12 def sub(cls,a,b): 13 return a - b # 將兩個傳入參數進行相減
14
15 # 測試類
16 class mytest(unittest.TestCase): 17 a = 3
18 b = 1
19 def test_2sum(self): 20 # 斷言:兩個數之和是否爲4
21 self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail') 22 print("test_2sum方法") 23 def test_1sub(self): 24 # 斷言兩個數之差的結果是否爲2
25 self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail') 26 print('test_1sub方法') 27
28 class aa(unittest.TestCase): 29 def testaa(self): 30 print('testaa') 31
32 if __name__=='__main__': 33 # 上面的代碼能夠替換成以下
34 # 1)獲取 TestSuite的實例對象:將多個測試類加載到集合中
35 suite = unittest.TestSuite() 36 # 2)將測試用例添加到測試容器中
37 suite.addTest(mytest("test_2sum")) 38 # 查看其執行順序
39 suite.addTest(aa('testaa')) 40 suite.addTest(mytest("test_1sub")) 41 # 3)建立TextTestRunner類的實例對象
42 runner = unittest.TextTestRunner() 43 runner.run(suite)
2.二、批量執行測試模塊
目錄下須要被執行的測試腳本文件名必須以「test」字符串開頭,好比 testEqual.py
2.三、忽略測試
2.3.一、無條件忽略:@unittest.skip('skipping')
2.3.二、有條件忽略:@unittest.skipIf(a>5,"condition is not satisfied!") 若是變量a大於5,則忽略該測試方法【表達式知足就跳過】
@unittest.skipUnless(sys.platform=="linux","requires linux")若是執行測試用例的平臺不是linux,則忽略測試方法【表達式不知足就跳過】
class aa(unittest.TestCase): # num=2 # @unittest.skip('skipping') # @unittest.skipIf(num>1,'num已經大於1') @unittest.skipUnless(sys.platform == "linux", "requires linux") def testaa(self): print('testaa')
三、測試結果
3.一、. (點):執行成功,一個點表示一個測試方法。
3.二、F:執行失敗,如斷言失敗(輸出日誌中 failures=1表示一條用例執行失敗)。
3.三、E:用例自己有異常,如除數爲零(輸出日誌中 errors=1表示一條用例異常)。
3.四、skipped:有幾條用例被跳過執行,verbosity=0,
verbosity=1
verbosity=2
3.五、verbosity,日誌輸出狀況
3.5.一、verbosity<=0 ,輸出結果中不提示執行成功的用例數。
3.5.二、verbosity=1,輸出結果中僅以點(.)表示執行成功的用例數。
3.5.三、verbosity>=2,能夠輸出每條用例執行的詳細信息,特別是在大批量執行測試用例時,能夠根據這些信息判斷哪些用例執行失敗。
四、斷言
# @Author:lsj # @version V1.0 # -*- coding:UTF-8 -*-
import unittest # print(unittest) # 被測試類
class myclass(object): @classmethod # 裝飾器
def sum(cls,a,b): return a + b # 將兩個傳入參數進行加粗操做
@classmethod def sub(cls,a,b): return a - b # 將兩個傳入參數進行相減
# 測試類
class mytest(unittest.TestCase): a = 3 b = 1
# 具體的測試用例必定要以testk開頭
def testsum(self): # 斷言:兩個數之和是否爲4
myclass.sum(self.a,self.b) self.assertEqual(myclass.sum(self.a,self.b),4,'test sum fail') # 判斷3和4是否相等,不相等報錯test sum fail
# self.assertEqual(3,4,'test sum fail')
print("testsum方法") def testsub(self): # 斷言兩個數之差的結果是否爲2
self.assertEqual(myclass.sub(self.a,self.b),2,'test sub fail') print('testsub方法') if __name__=='__main__': unittest.main()