Selenium3+python自動化010-UnitTest框架簡介和單元測試框架使用

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()
setUp()的執行順序
"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()
查看tearDown()狀態
 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()
setUpClass和tearDownClass
"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)
View Code

 

 

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')
View Code

 

 

 

三、測試結果

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()
View Code
相關文章
相關標籤/搜索