python中更人性化的一個單元測試框架:nose2

若是你學過 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

在這個例子當中:函數

  • 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 個測試用例。

測試夾具

測試夾具是爲了給測試用例準備前置條件和後置條件。

  • @with_setup(before_test) 表示在測試用例執行以前要執行的前置條件
  • @with_teardown(after_test) 表示在測試用例執行以後的後置條件
  • before_test 和 after_test 是本身定義的函數
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 的簡單入門:

  • nose2 是在 unittest 的基礎上實現的,能夠和 unittest 兼容,若是你沒有接觸過 unittest, 建議先從 unittest 學起,不少同窗在網上看到一些說 unittest 過期或者是說 unittest 不高級的言論就開始批判,不對。 unittest 是 其餘 python 單元測試框架的基礎,沒學好 unittest , 其餘的框架你也學很差。
  • nose2 能夠自動發現測試用例,你只須要運行 nose2 命令就能夠,用起來很是簡單。
  • nose2 的測試用例名稱要符合規範,以 test 開頭,不然不會被斷定爲用例。
  • 你能夠經過 -s 運行指定文件下的用例,也能夠經過 . 號去運行單個用例。

 

nose2 vs unittest

nose2 上手會比 unittest 更簡單,使用 unittest, 須要同時掌握 testrunner, testsuite, testcase 等基本概念,還須要熟悉類和對象。 nose2 隱藏了這些細節設計,難度會更低一些。

nose2 能夠直接運行 unittest 的測試用例,能夠實現無縫切換。

可是並非說 unittest 就很差。 unittest 作爲一個 python 標準庫,和 python 版本綁定,很是穩定,不用擔憂兼容性的問題。

若是要學習一個單元測試框架,建議從 unittest 開始,由於你能夠接觸到 loader, suite, runner 這樣的組件,對理解測試框架更有幫助,學習好 unittest 之後,再學習 nose2 或者 pytest 這樣更高級的框架,能有效提高編程效率。

nose2 vs pytest

若是你只想學習一個高級單元測試框架,建議你學 pytest, 而不是 nose2。

nose2 足夠好,甚至看上去他的設計比 pytest 更加清晰,更容易理解。可是社區沒有 pytest 活躍,所以使用的人也比較少。

實際上,nose2 和 pytest 的用法不少都是很是相似的,學習了一個,另一個也能輕鬆上手。nose2 對於加深對測試框架的理解有很大的好處。

原文出處:https://www.cnblogs.com/wagyuze/p/12299534.html

相關文章
相關標籤/搜索