Pytest單元測試框架——Pytest簡介

1、簡介

  pytest是python的一種單元測試框架,與python自帶的unittest測試框架相似,可是比unittest框架使用起來更簡潔,效率更高。python

2、安裝

  安裝方法: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   測試覆蓋率

3、Demo

  新建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的三種運行方式)

  用例不經過與用例經過的結果展現,以下圖所示。

4、用例設計原則

  • 文件名以test_*.py文件*_test.py
  • 測試類以Test開頭,而且不能帶有init方法
  • 以test_開頭的函數
  • 以Test開頭的類
  • 以test_開頭的方法
  • 全部的包pakege必需要有__init__.py文件
  • 斷言使用assert

5、斷言

  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

6、裝飾器

  pytest.mark.skip 能夠標記沒法在某些平臺上運行的測試功能,或者但願失敗的測試功能。

  skip if意味着在不知足某些條件時才但願測試經過,不然 pytest應該跳過運行測試。 常見示例是在非 Windows 平臺上跳過僅限Windows 的測試,或跳過測試依賴於當前不可用的外部資源。

  xfail 意味着你但願測試因爲某種緣由而失敗。 一個常見的例子是對功能的測試還沒有實施,或還沒有修復的錯誤。。 

skip

  跳過測試函數的最簡單方法是使用跳過裝飾器標記它,能夠傳遞一個可選的緣由。

例:

  @pytest.mark.skip(reason=「本輪測試不執行此用例")

  def test_the_unknown():

skipif

  若是你但願有條件地跳過某些內容,則可使用 skipif 代替。

  例:

    import sys

    @pytest.mark.skipif(sys.version_info < (3,6),

    reason="requires python3.6 or higher")

自定義標記 mark

  pytest 能夠支持自定義標記,自定義標記能夠把一個 web 項目劃分多個模塊,而後指定模塊名稱執行。

  @pytest.mark.webtest

  def test_send_http():

  若是不想執行標記 webtest 的用例,那就用」not webtest」

7、Fixture

  unittest 的都知道里面用前置和後置 setup 和 teardown 很是好用,在每次用例開始前和結束後都去執行一次。

  setupClass 和 teardownClass,需配合@classmethod 裝飾器一塊兒使用。

用例運行級別

  • 模塊級(setup_module/teardown_module)開始於模塊始末,全局的
  • 函數級(setup_function/teardown_function)只對函數用例生效(不在類中)
  • 類級(setup_class/teardown_class)只在類中先後運行一次(在類中)
  • 方法級(setup_method/teardown_method)開始於方法始末(在類中)
  • 類裏面的(setup/teardown)運行在調用方法的先後

運行的優先級

  setup_class>setup_method>setup >用例>teardown> teardown_method>teardown_class

函數和類混合

  若是一個.py 的文件裏面既有函數用例又有類和方法用例,運行順序以下:

  setup_module/teardown_module 的優先級是最大的。

  函數裏面用到的 setup_function/teardown_function和類裏面的 setup_class/teardown_class 互不干涉

Fixture優點

  命名方式靈活,不侷限於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 配置腳本名稱是固定的,不能更名稱

  conftest.py 和運行的用例要在同一個 pakage 下,而且有__init__.py 文件

  不須要 import 導入 conftest.py, pytest 用例會自動查找

yield 執行 teardown

  yield:提供fixture 裏面的 teardown 功能,用 yield 來喚醒teardown的執行

yield 遇到異常

1.若是其中一個用例出現異常,不影響 yield 後面的 teardown 執行,運行結果互不影響,而且所有用例執行完成後, yield 呼喚 teardown操做。

2.若是在 setup 就異常了,那麼是不會去執行 yield 後面的teardown 內容了。

3.yield 也能夠配合 with 語句使用。

Fixture參數化

  pytest.mark.parametrize 裝飾器能夠實現測試用例參數化 它也能夠標記單個測試實例在參數化 參數組合 若要得到多個參數化參數的全部組合,能夠堆疊參數化裝飾器

相關文章
相關標籤/搜索