若是你學過 python 進行自動化測試,你必定使用過 unittest。今天咱們要講的 nose2 是一個高級版本的 unittest。他比 unittest 更容易理解,用起來也更加方便一些。html
nose2 在 unittest 的基礎上開發的,因此若是你以前是用 unittest 作測試,可是有想使用 nose2 的新特性,你能夠在不改變原有代碼的狀況下直接使用 nose2。python
import unittest import nose2 class TestAdd(unittest.TestCase): def test_add(self): self.assertEqual(1+1, 3) if __name__ == '__main__': # 只須要替換這一行 # unittest.main() nose2.main()
nose2 是第三方庫,須要本身安裝,直接在 cmd 運行 pip 指令安裝:編程
pip install nose2
在快速開始當中,咱們使用了在 python 代碼中用 nose2.main() 的方式去運行測試用例,這樣是徹底 OK 的。markdown
還有另一種運行方式:直接在命令行經過 nose2 命令運行。他會在python文件中查找名稱以 test 開頭的測試文件,並運行它發現的每一個以 test 開頭的測試函數名稱。好比說個人項目當中有 test_add.py, test_minus.py 這些文件,若是我想運行全部的測試用例,只須要在當前文件下輸入 cmd 命令,他就會自動去查找全部的測試用例,而後去執行:app
nose2
nose2 -s 文件夾名稱
我把登陸相關的用例都放到一個叫 login_case 的文件夾當中,當我執行 nose2 -s login_case
的時候,其餘的用例是不會執行的, nose2 只會去找 login_case 文件夾下面的用例。框架
nose2 login_case.test_nose2_dir.test_login
在這個例子當中:函數
每個層級之間,用 .
號隔開。單元測試
若是想測試 test_nose2_dir.py 文件下的全部用例:學習
nose2 login_case.test_nose2_dir
若是想測試 login_case 文件夾下的全部用例:測試
nose2 login_case
爲何 nose2 能夠自動查找用例而且執行呢?是由於他在內部制定了規則,而後根據規則去斷定。
好比首先他規定,你全部的測試用例文件名稱應該以 test 開頭,若是你不這麼作,那這個文件就不是測試用例文件。如下的文件名都會被斷定爲測試用例文件:
test.py test_add.py testRegister.py
而這一些不會被斷定爲測試用例文件,從而被忽略:
add_test.py a_test.py register_test_file.py
與unittest不一樣的是,nose2 的測試用例並不必定要以類的形式存在,也可使用函數。任何函數和類,只要名稱匹配必定的條件(例如,以test開頭或以test結尾等),都會被自動識別爲測試用例。
def test_add(): assert 1 == 2 if __name__ == '__main__': nose2.main()
相似於 unittest 當中的 ddt 模塊,不過比 ddt 模塊使用起來簡潔一些。在測試過程中,一般會有多組測試用例數據,多組測試用例會共用一個測試用例的方法,從而實現數據驅動。在 nose2 當中你能夠這樣使用:
import nose2 from nose2.tools import params def add(a, b): return a + b test_data = [ {"data": (1, 2), "expected": 3}, {"data": (2, 2), "expected": 4}, {"data": (3, 2), "expected": 6}, ] @params(*test_data) def test_add(data): assert add(*data["data"]) == data["expected"]
1, @params(*test_data)
會接收外部傳進來的多組測試數據;
2,test_add(data)
當中的 data 每次取出一組數據運行,因此,data 其實就是 {「data」: (1, 2), 「expected」: 3} 這樣的一組數據。
3,這裏由於有 3 組數據,因此運行的時候會有 3 個測試用例。
測試夾具是爲了給測試用例準備前置條件和後置條件。
from nose2.tools.decorators import with_setup, with_teardown def before_test(): print("before test") def after_test(): print("after test") @with_setup(before_test) @with_teardown(after_test) def test_add(data): assert add(*data["data"]) == data["expected"]
本篇咱們介紹了 nose2 的簡單入門:
-s
運行指定文件下的用例,也能夠經過 .
號去運行單個用例。nose2 上手會比 unittest 更簡單,使用 unittest, 須要同時掌握 testrunner, testsuite, testcase 等基本概念,還須要熟悉類和對象。 nose2 隱藏了這些細節設計,難度會更低一些。
nose2 能夠直接運行 unittest 的測試用例,能夠實現無縫切換。
可是並非說 unittest 就很差。 unittest 作爲一個 python 標準庫,和 python 版本綁定,很是穩定,不用擔憂兼容性的問題。
若是要學習一個單元測試框架,建議從 unittest 開始,由於你能夠接觸到 loader, suite, runner 這樣的組件,對理解測試框架更有幫助,學習好 unittest 之後,再學習 nose2 或者 pytest 這樣更高級的框架,能有效提高編程效率。
若是你只想學習一個高級單元測試框架,建議你學 pytest, 而不是 nose2。
nose2 足夠好,甚至看上去他的設計比 pytest 更加清晰,更容易理解。可是社區沒有 pytest 活躍,所以使用的人也比較少。
實際上,nose2 和 pytest 的用法不少都是很是相似的,學習了一個,另一個也能輕鬆上手。nose2 對於加深對測試框架的理解有很大的好處。
原文出處:https://www.cnblogs.com/wagyuze/p/12299534.html