細說python單元測試框架之unittest之補充

来源:https://www.cnblogs.com/gufengchen/archive/2019/05/16/10873110.html
-Advertisement-
Play Games

一、unittest模塊官方文檔: https://docs.python.org/3/library/unittest.html 二、一張圖看懂unittest: 三、Unittest主要方法屬性: 1.unittest.TestCase:TestCase類,所有測試用例繼承的基本類: class ...


一、unittest模塊官方文檔:

https://docs.python.org/3/library/unittest.html

二、一張圖看懂unittest:

三、Unittest主要方法屬性:

1.unittest.TestCase:TestCase類,所有測試用例繼承的基本類:

   class myfunTest(unittest.TestCase):

       def setUp(self):

       print('每個用例執行前都會調用setUp準備環境')

2.unittest.main():使用它可以方便的將一個單元測試模塊變為可直接運行的測試腳本,main()方法使用TestLoader類來搜索所有包含在該模塊中以“test”命名開頭的測試方法,並自動執行它們。執行方法的預設順序是:根據ASCII碼的順序載入測試用例,數字與字母的順序為:0-9,A-Z,a-z.所以以A開頭的測試用例方法會優先執行,以a開頭會執行:

   if __name=="__main__()":

      unittest.main()

3.unittest.TestSuite():unittest框架的TestSuite()類是用來創建測試套件的:

    tests=myfunTest("test_is_prime")

    suite=unittest.TestSuite()

    suite.addTest(tests)

4.unittest.TextRunner():unittest框架的TextTextRunner()類,通過該類下麵的run()方法來運行suite所組裝的測試用例,入參為suite測試套件:

    runner=unittest.TextTestRunner()

    runner.run(suite)

5.unittest.defaultTestLoader():defaultTestLoader()類,通過該類下麵的discover()方法可自動跟據測試目錄start_dir匹配查找測試用例文件(test*.py),並將查找到的測試用例組裝到測試套件,因此可以直接通過run()方法執行discover。用法如下:

    discover=unittest.defaultTestLoader.discover(test_dir,pattern=’test*.py’):

    test_dir = r'D:\CollectionOverview\webzidonghu'

    discover = unittest.defaultTestLoader.discover(test_dir,pattern = 'test*.py')

6.unittest.skip():裝飾器,當運行用例時,有效用例可能不想執行等,可用裝飾器暫時屏蔽該條測試用例。一種常見的用法就是比如說想調試某一個測試用例,想先屏蔽其他用例就可以用裝飾器屏蔽。

@unittest.skip(reason):無條件跳過裝飾的測試,並說明跳過測試的原因。

@unittst.skipif(condition,reason):條件為真時,跳過裝飾的測試,並說明跳過測試的原因。

@unittest.skipUnless(condition,reason):條件為假是,跳過裝飾的測試,並說明跳過測試的原因。

@unittet.expectedFailure():測試標記為失敗。

@unittest.skipUnless(sys.platform.startswith('linux'),'requires Linux') #跳過該測試用例

    def test_divide(self):

        ''' test method divide '''

      print('divide')

7.setUp():用於測試用例執行前的初始化工作。如測試用例中需要訪問資料庫,可以在setUp中建立資料庫連接併進行初始化。如測試用例需要登陸web,可以先實例化瀏覽器:

    def setUp(self):

        url='https://mail.yeah.net/'

      self.browser=webdriver.Firefox()

      self.browser.got(url)

      time.sleep(5)

8.tearDown():用於測試用例執行之後的善後工作。如關閉資料庫鏈接。關閉瀏覽器:

    def tearDown(self):

        self.browser.closet()

9.assert*():一些斷言方法,在執行測試用例的過程中,最終用例是否執行通過,是通過判斷測試得到的實際結果和預期結果是否想等決定的:

    self.assertTrue(is_prime(5))

    self.assertFalse(is_prime(-3))

10.addTest():將測試用例添加到測試套件中,如下方,是將test_baidu模塊下的BaiduTest類下的test_baidu測試用例添加到測試套件:

    suite=unittest.TestSuite()

    suite.addTest(test_baidu.BaiduTest(‘test_baidu’))

11.run():運行測試套件的測試用例,入參為suite測試套件:

    runner=unittest.Text.Text.Runner()

    runner.run(suite)

四、框架如何解決自動化需求的4個問題:

1.如何控制用例執行順序?

unittest中,用例是以test開頭的方法定義的,預設執行順序是根據用例名稱的ASCII碼升序進行如上面的用例,實際執行順序為:test_add->test_divide->test_is_prime,而不是用例定義的先後順序。在unittest中解決用例執行順序的問題是使用TestSuite,代碼如下:

#使用TestSuite控制用例順序,用例的執行順序是由添加到TestSuite的順序決定的
tests=[myfunTest("test_is_prime"),myfunTest("test_add"),myfunTest("test_divide")]
suite=unittest.TestSuite()
#suite.addTest()
suite.addTest(tests) #將測試用例實例增加到測試套件中
runner=unittest.TextTestRunner()
runner.run(suite)

 2.如何讓多個用例共用setUp,tearDown

UnittestsetUptearDown會在每個用例執行前後執行一次,如上面測試用例類中有3個測試用例,那麼每個用例執行前會執行setUp,執行後會執行tearDown,即setUptearDown總共會調用三次,但考慮實際自動化測試場景,多個用例只需執行一次setUp,全部用例執行完成後,執行一次tearDown,針對該種場景,unittest的處理方法是使用setupclassteardownclass,註意@classmethod的使用,代碼如下:

@classmethod
def setUpClass(cls):
print('所有用例執行前會調用一次setUp準備環境')

@classmethod
def tearDownClass(cls):
print('所有用例執行後會調用一次tearDown進行環境清理')

 3.如何跳過用例:

在自動化測試中,經常會遇到挑選用例的清況,在unittest中的解決方法是使用skip裝飾器,其中skip裝飾器主要有3種:

unittest.skip(reason)

unittst.skipif(condition,reason)

unittest.skipUnless(condition,reason)

即在滿足conditiong條件下跳過該用例,reason用於描述跳過的原因,實例代碼如下:

@unittest.skipUnless(sys.platform.startswith('linux'),'requires Linux') #跳過該測試用例
def test_divide(self):
''' test method divide '''
print('divide')
self.assertEqual(2,divide(6,3))
self.assertNotEqual(2,divide(5,2))

 4.如何生成html格式的測試報告:

Unittest中預設生成的報告格式為txt,如果想生成html格式的報告,可以使用HtmlTestRunner模塊,安裝後導入該模塊,使用HTMLTestRunner代替預設的TextTestRunner()執行測試用例即可。實例代碼如下:

suite=unittest.TestSuite()
suite.addTest(unittest.TestLoader().loadTestFromTest(myfunTest)) #使用TestLoader載入測試用例

runner=HTMLTestRunner(output="result")
runner.run(suite)

五、完整代碼如下:

 1 import unittest
 2 #https://pypi.org/project/html-testRunner
 3 from HtmlTestRunner import HTMLTestRunner    #導入第三方模塊,執行結果生成html報告:pip install html-testRunner
 4 
 5 class myfunTest(unittest.TestSuite):
 6     ''' test myfunTest: test fixture only once '''
 7     
 8     
 9     @classmethod
10     def setUpClass(cls):
11         print('所有用例執行前會調用一次setUp準備環境')
12         
13         
14     @classmethod
15     def tearDownClass(cls):
16         print('所有用例執行後會調用一次tearDown進行環境清理')
17         
18         
19     def test_add(self):
20         ''' test method add(a,b) '''
21         print('add')
22         self.assertEqual(3,add(1,2))
23         self.assertNotEqual(3,add(2,2))
24         
25         
26     @unittest.skipUnless(sys.platform.startswith('linux'),'requires Linux')    #跳過該測試用例
27     def test_mul(self):
28         ''' test method mul '''
29         print('mul')
30         self.assertEqual(2,mul(6,3))
31         self.assertNotEqual(13,mul(7,2))
32         
33         
34 if __name__=='__main__':
35     suite=unittest.TestSuite()
36     suite.addTest(unittest.TestLoader().loadTestFromTest(myfunTest))    #使用TestLoader載入測試用例
37     
38     runner=HTMLTestRunner(output="result")
39     runner.run(suite)

 

 1 #coding=utf-8
 2 
 3 import unittest
 4 
 5 
 6 class myfunTest(unittest.TestCase):
 7      '''Test myfunTes'''
 8     
 9     
10     def setUp(self):
11         print('每個用例執行前都會調用setUp準備環境')
12         
13         
14     def is_prime(number):
15         if number<0 or number in (0,2):
16             return False
17         for element in range(2,number):
18             if number%element==0:
19                 return False
20         return True
21         
22         
23     def add(a,b):
24         return a+b
25         
26         
27     def mul(a,b):
28         return a*b
29         
30         
31     def test_is_prime(self):
32         '''
33         Test method is_prime(number)
34         '''
35         print('is_prime')
36         self.assertTrue(is_prime(5))
37         self.assertFalse(is_prime(8))
38         self.assertFalse(is_prime(-3))
39             
40             
41     def test_add(self):
42         '''
43         Test method add(a,b)
44         '''
45         print('add')
46         self.assertEqual(3,add(1,2))
47         self.assertNotEqual(3,add(2,2))
48         
49         
50     def test_mul(self):
51         '''
52         Test method mul
53         '''
54         print ('mul')
55         self.assertEqual(18,mul(6,3))
56         self.assertNotEqual(6,mul(3,2))
57         
58         
59     def tearDown(self):
60         print('每個用例執行完都會調用tearDown進行環境清理')
61         
62         
63 if __name__='__main__':
64     #使用TestSuite控制用例順序,用例的執行順序是由添加到TestSuite的順序決定的
65     tests=[myfunTest("test_is_prime"),myfunTest("test_add"),myfunTest("test_mul")]
66     
67     suite=unittest.TestSuite()
68     #suite.addTest()
69     suite.addTest(tests)    #將測試用例實例增加到測試套件中
70     
71     runner=unittest.TextTestRunner()
72     runner.run(suite)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開篇先嘚啵 昨天寫到哪了? 睡醒就忘了... ... 不過聰明伶俐的博主,僅用1秒鐘就想起來了 我們昨天學了一個pandas的類型series 並且會創建了,厲不厲害 對於一個新的數據結構來說 額,不對,對於python任意的數據結構來說 或者換句話,對於任何對象來說 看我,就沒有對象... ... ...
  • 一、問題描述 給定兩個字元串,求解這兩個字元串的最長公共子序列(Longest Common Sequence)。比如字元串1:BDCABA;字元串2:ABCBDAB。則這兩個字元串的最長公共子序列長度為4,最長公共子序列是:BCBA 二、演算法求解 這是一個動態規劃的題目。對於可用動態規劃求解的問題 ...
  • 【併發編程】Future模式添加Callback及Promise 模式 ...
  • 我買的是Mac Mini(late 2014)中配,內置5400轉1T機械硬碟,該配置即使到了2019年安裝macOS Mojave系統依舊是夠用的,但硬碟嚴重拖累了運行的速度。之前考慮到更換內置sata介面硬碟的操作略微繁瑣,因此使用外置SSD的方式,將系統安裝在外置SSD上,速度的確得到了提升,... ...
  • 1. 獲取數據 1.1 導入sklearn數據集 sklearn中包含了大量的優質的數據集,在你學習機器學習的過程中,你可以通過使用這些數據集實現出不同的模型,從而提高你的動手實踐能力,同時這個過程也可以加深你對理論知識的理解和把握。(這一步我也亟需加強,一起加油!^-^) 首先呢,要想使用skle ...
  • 大家晚上好,最近忙每天忙於項目沒有時間更新自己的博客,時間就是海綿嘛硬擠擠就是有的,咂看標題" 流程圖 ",編程界的一個不可或缺的技能,特別是在做複雜的邏輯的時候要處理好每一步的關係,在數據中講就是數據之間的關聯關係,或者關聯模型等,通俗點也就是父子,母子等關係。 首先給大家介紹幾款畫流程圖的軟體: ...
  • 面向對象 面向對象的思想就是值我們要實現一個共功能的時候,我們不自己去做,而是找別人幫我們去做,幫我們去做的這個人就是對象。面向對象強調的是誰來幫我實現這個功能。 類與對象的關係 類 :是一組相關屬性和行為的集合,類可以看成是事物的模板 對象 :對象是一類事物的具體體現,對象是類的一個實列,必然具備 ...
  • 1. 內容 1. 匿名函數:一句話函數,比較簡單的函數。 函數名 = lambda 參數 : 返回值 1. 此函數不是沒有名字,他是有名字的,他的名字就是你給其設置的變數,比如func。 func() 函數執行 2. lambda 是定義匿名函數的關鍵字,相當於函數的def. 3. lambda 後 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...