unittest和unittest2的區別差異、unittest2框架------執行原理


unittest和unittest2的區別差異

參考:https://pypi.org/project/unittest2/

unittest2是Python 2.7及更高版本中添加到unittest測試框架的新功能的反向移植。經測試可在Python 2.6、2.7、3.2、3.3、3.4和pypy上運行

要使用unittest2代替unittest,只需將import unittest替換為 import unittest2即可

 

unittest2中的類派生自unittest中的適當類,因此應該可以使用運行unittest2測試的基礎結構,而不必立即將所有測試切換為使用unittest2。同樣,您可以使用新的斷言方法unittest2.TestCase與標准單元測試的測試運行的基礎設施。並非unittest2中的所有新功能都可以與標准unittest測試加載器一起使用,但是運行器結果對象。

通常,有關unittest2的文檔,請參見CPython的最新文檔:

新功能包括:

  • addCleanups-更好的資源管理
  • 許多新的斷言方法,包括比較列表,集合,字典unicode字符串等的更好默認值,以及指定用於比較特定類型的新默認方法的能力
  • assertRaises作為上下文管理器,此后可以訪問異常
  • 測試發現和新的命令行選項(包括快速運行和測試運行期間對ctrl-C的更好處理)
  • 類和模塊級別的固定裝置:setUpClasstearDownClass, setUpModuletearDownModule
  • 測試跳過和預期的失敗
  • 用於assertAlmostEqual的新的delta關鍵字參數,以進行更有用的比較和比較非數字對象(例如日期時間)
  • load_tests協議,用於從模塊或包中加載測試
  • TestResult上的startTestRunstopTestRun方法
  • 其他各種API改進和修復

注意

命令行用法

在Python 2.7中,您可以使用python -m unittest <args>調用unittest命令行功能(包括測試發現)由於unittest是一個程序包,並且使用python -m ...調用程序包的功能是Python 2.7中的新增功能,因此我們無法對unittest2執行此操作。

相反,unittest2帶有腳本unit2。 命令行用法

unit2發現
unit2 -v test_module

該腳本還有一個名為unit2.py的副本,對Windows有用,該腳本使用文件擴展名而不是使用shebang行來確定使用哪個程序執行文件。這兩個腳本都由distutils安裝。

在我編寫適當的文檔之前,有關所有新功能的最佳信息是Python 2.7的Python文檔的開發版本:

查找有關在Python 2.7中添加或更改的功能的注釋。

注意

unittest2已經用於distutils2的開發

unittest2的版本0.5.1有功能奇偶校驗單元測試在Python 2.7決賽。如果要確保測試在unittest2和unittest中在Python 2.7中運行相同,則應使用unittest2 0.5.1。

更高版本的unittest2包括在Python 3.2中進行的unittest更改,以及Python 2.7發布后的更改。

差異性

Python 2.7中的unittest2和unittest之間的區別:

  1. assertItemsEqual不會使Py3k警告保持沉默,因為它使用了warnings.catch_warnings()(這是Python 2.6中的新功能(用作上下文管理器,要使用Python 2.4會很麻煩 ))。
  2. TestCase.longMessage默認為True,因為它更好。由於向后兼容的原因,它在Python 2.7中默認為False。
  3. python -m軟件包在Python 2.7之前的Python版本中不起作用。unittest2的命令行特性由一個提供頁免費(和 unit2.py)腳本來代替。
  4. unittest2包括一個非常基本的setuptools兼容測試收集器。在setup.py中指定 test_suite ='unittest2.collector'這將從包含setup.py的目錄中的默認參數開始測試發現,因此,它可能是最有用的示例(請參閱unittest2 / collector.py)。
  5. 在unittest2中,TextTestResult.stopTestRun負責調用printErrors。這是理想的行為,但是在Python 3.1中,TestResult.stopTestRun被記錄為空,並且子類不需要調用它。這將使更改向后不兼容並且需要考慮。

問題

一個TestResult中有意想不到的成功對象返回True result.wasSuccessful() 很難知道這是否是正確的行為。

如果將點路徑名用於測試發現,則仍將使用全局安裝的模塊/程序包,而不是當前目錄中的一個。從虛線路徑名進行發現時,我們可以檢查這種特定情況。

removeHandler裝飾也可能是一個上下文管理器。

問題8313:單元測試回溯中的<unprintable AssertionError object>消息在2.7之前的Python版本中很難修復。Python 2.7中的修復依賴對跟蹤模塊和跟蹤對象的更改。由於該問題很少見,因此我將其保留在unittest2中。

unittest2(和unittest)中有幾個地方會在異常上調用str(...)以獲取異常消息。如果使用非ASCII Unicode創建異常,則失敗。這很少見,除非將其實際報告為某人的問題,否則我不會解決。

文本或長序列的比較(使用assertSequenceEqual或 assertMultiLineEqual等)可能需要長時間才能為故障消息生成差異。這些方法使用prettyprintdifflib

pip install -e除非已經安裝了setuptools> 0.6.24,否則unittest2源中的Python3.2上的版本將失敗。這是需要較新的setuptools(以避免使用execfile)和setup_requires回退到easy_install的組合,而后者不知道如何及時升級setuptools,從而無法在unittest2中對其進行修復。

unittest2框架------執行原理

使用unittest2框架,做簡單的技術實驗,了解框架基本使用及執行原理代碼:

#一個自動化測試框架,關於用例執行的實驗

#導入包
import unittest2

#創建類,並繼承代碼庫中的TestCase,表示當前類,是測試用例類
class UnittestDemo(unittest2.TestCase):

#重寫setUpClass()方法
@classmethod
def setUpClass(cls):
print('setUpClass方法')
print('')

def setUp(self):
print('在測試用例開始前,要做的初始化條件')

def test_login(self):
print('以test開頭的測試用例執行實驗')
self.func_aa()

def func_aa(self):
print('不以test開頭的方法,是普通方法,只有被調用才會執行,放在test_login()里調用了!')

def test_regi(self):
print('每條測試用例執行前,需要執行一次setUp()、tearDown()方法')

def tearDown(self):
print('在測試用例結束后,要做的場景還原')
print('')

#重寫tearDownClass方法
@classmethod
def tearDownClass(cls):
print('tearDownClass方法')

if __name__ == '__main__':
unittest2.main()

 

光標在main()方法處,運行結果:

setUpClass方法
在測試用例開始前,要做的初始化條件
以test開頭的測試用例執行實驗
不以test開頭的方法,是普通方法,只有被調用才會執行,放在test_login()里調用了!
在測試用例結束后,要做的場景還原

在測試用例開始前,要做的初始化條件
每條測試用例執行前,需要執行一次setUp()、tearDown()方法
在測試用例結束后,要做的場景還原

tearDownClass方法

Ran 2 tests in 0.002s

OK

最后收尾的小結:

  • 按住ctrl鍵,點擊unittest2.TestCase類,可以看到這個類中,繼承了unittest.TestCase
  • 我們用的unittest2,是unittest的升級版本,unittest.TestCase打開這個類,可以找到**setUp()、tearDown()**是寫的pass空方法,所以需要重寫這兩個方法
  • 按住ctrl鍵,點擊unittest2.TestCase類,進入這個類中,還有兩個方法setUpClass()、tearDownClass()、方法。這兩個方法也需要重寫,方法前要加注釋器【@classmethod】
  • 重寫父類中的setUpClass()方法,是類中,所有測試用例執行前,要做的初始化條件
  • 重寫父類中的setUp()方法。在每條測試用例開始前,要做的預置條件
  • 聲明一個以test開頭的方法,表示這是一個測試用例方法,該方法可以直接運行。
  • test開頭的測試用例執行順序,按照test后的字母排列順序執行
  • 聲明一個不以test開頭的方法,是普通方法,只有被調用才會執行
  • 重寫父類中的tearDown()方法。在測試用例結束后,要做的場景還原
  • 重寫父類中的tearDownClass()方法,是類中,所有測試用例執行后,要做的場景還原工作(比如注冊后,再次注冊不成功)
  • 每條測試用例執行前,需要執行一次setUp()、tearDown()方法
  • unittest2.main()解釋:只有在當前文件運行,就會執行unittest2.main()。表示調用unittest2的主方法,執行當前類中的所有方法
  • 運行時,如果光標指在某一個test開頭的測試類上,就只運行當前的測試類;如果光標在unittest2.main()處,就會執行所有的測試用例方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM