pytest是python的一種單元測試框架,與python自帶的unittest測試框架相似,可是比unittest框架使用起來更簡潔,效率更高。python
安裝方法:web
1 pip install -U pytest
安裝成功,查詢安裝的版本號數組
1 pytest --version
pytest經常使用的插件 session
pytest-selenium 集成 selenium多線程
pip install allure-pytest 生成漂亮的allure測試報告框架
pip install pytest-sugar 優化運行效果分佈式
pip install pytest-rerunfailures 執行用例失敗後從新運行函數
pip install pytest-xdist 多線程並行與分佈式執行單元測試
pip install pytest-assume 多條斷言前面報錯後面依然執行測試
pip install pytest-cover 測試覆蓋率
新建test_one.py,輸入如下代碼,cmd至文件目錄下,輸入pytest運行
1 def func(x): 2 return x + 1 3 def test_answer(): 4 assert func(3) == 5 5 #assert func(3) == 4
運行pytest命令,或py.test命令,或python –m pytest命令。(pytest的三種運行方式)
用例不經過與用例經過的結果展現,以下圖所示。
pytest容許你使用標準Python斷言來驗證Python測試中的指望值。
pytest裏面斷言實際上就是python裏面的assert斷言方法,經常使用的有如下幾種:
assert xx 判斷xx爲真
assert not xx 判斷xx不爲真
assert a in b 判斷b包含a
assert a == b 判斷a等於b
assert a != b 判斷a不等於b
pytest.mark.skip 能夠標記沒法在某些平臺上運行的測試功能,或者但願失敗的測試功能。
skip if意味着在不知足某些條件時才但願測試經過,不然 pytest應該跳過運行測試。 常見示例是在非 Windows 平臺上跳過僅限Windows 的測試,或跳過測試依賴於當前不可用的外部資源。
xfail 意味着你但願測試因爲某種緣由而失敗。 一個常見的例子是對功能的測試還沒有實施,或還沒有修復的錯誤。。
跳過測試函數的最簡單方法是使用跳過裝飾器標記它,能夠傳遞一個可選的緣由。
例:
@pytest.mark.skip(reason=「本輪測試不執行此用例")
def test_the_unknown():
若是你但願有條件地跳過某些內容,則可使用 skipif 代替。
例:
import sys
@pytest.mark.skipif(sys.version_info < (3,6),
reason="requires python3.6 or higher")
pytest 能夠支持自定義標記,自定義標記能夠把一個 web 項目劃分多個模塊,而後指定模塊名稱執行。
@pytest.mark.webtest
def test_send_http():
若是不想執行標記 webtest 的用例,那就用」not webtest」
unittest 的都知道里面用前置和後置 setup 和 teardown 很是好用,在每次用例開始前和結束後都去執行一次。
setupClass 和 teardownClass,需配合@classmethod 裝飾器一塊兒使用。
setup_class>setup_method>setup >用例>teardown> teardown_method>teardown_class
若是一個.py 的文件裏面既有函數用例又有類和方法用例,運行順序以下:
setup_module/teardown_module 的優先級是最大的。
函數裏面用到的 setup_function/teardown_function和類裏面的 setup_class/teardown_class 互不干涉
命名方式靈活,不侷限於setup和teardown這幾個命名
conftest.py 配置裏能夠實現數據共享,不須要import就能自動找到一些配置
scope=」module」 能夠實現多個.py跨文件共享前置
scope=」session」 以實現多個.py跨文件使用一個session來完成多個用例
1 fixture(scope="function", params=None, autouse=False, ids=None, name=None): 2 """使用裝飾器標記fixture的功能 3 可使用此裝飾器(帶或不帶參數)來定義fixture功能。 fixture功能的名稱能夠在之後使用 4 引用它會在運行測試以前調用它:test模塊或類可使用pytest.mark.usefixtures(fixturename標記。 5 測試功能能夠直接使用fixture名稱做爲輸入參數,在這種狀況下,夾具實例從fixture返回功能將被注入。 6 7 :arg scope: scope 有四個級別參數 "function" (默認), "class", "module" or "session". 8 9 :arg params: 一個可選的參數列表,它將致使多個參數調用fixture功能和全部測試使用它 10 11 :arg autouse: 若是爲True,則爲全部測試激活fixture func 能夠看到它。 若是爲False(默認值)則顯式須要參考來激活fixture 12 13 :arg ids: 每一個字符串id的列表,每一個字符串對應於params 這樣他們就是測試ID的一部分。 若是沒有提供ID它們將從params自動生成 14 15 :arg name: fixture的名稱。 這默認爲裝飾函數的名稱。 若是fixture在定義它的同一模塊中使用,夾具的功能名稱將被請求夾具的功能arg遮蔽; 解決這個問題的一種方法是將裝飾函數命名 16 「fixture_ <fixturename>」而後使用」@ pytest.fixture(name ='<fixturename>')「」。
fixture(scope="function", params=None, autouse=False,ids=None, name=None):
scope 有四個級別參數:function, class、Module、session
params: 一個可選的參數列表,它將致使多個參數調用fixture 功能和全部測試使用它。
autouse: 若是爲 True,則爲全部測試激活 fixture func 能夠看到它。 若是爲 False(默認值)則顯式須要參考來激活 fixture
每一個字符串 id 的列表,每一個字符串對應於 params 這樣他們就是測試 ID 的一部分。 若是沒有提供 ID 它們將從 params 自動生成。
name: fixture 的名稱。 這默認爲裝飾函數的名稱。
conftest.py 配置腳本名稱是固定的,不能更名稱
conftest.py 和運行的用例要在同一個 pakage 下,而且有__init__.py 文件
不須要 import 導入 conftest.py, pytest 用例會自動查找
yield:提供fixture 裏面的 teardown 功能,用 yield 來喚醒teardown的執行
1.若是其中一個用例出現異常,不影響 yield 後面的 teardown 執行,運行結果互不影響,而且所有用例執行完成後, yield 呼喚 teardown操做。
2.若是在 setup 就異常了,那麼是不會去執行 yield 後面的teardown 內容了。
3.yield 也能夠配合 with 語句使用。
pytest.mark.parametrize 裝飾器能夠實現測試用例參數化 它也能夠標記單個測試實例在參數化 參數組合 若要得到多個參數化參數的全部組合,能夠堆疊參數化裝飾器