天天看點

pytest VS unittest

一、用例編寫規則

1.unittest提供了test cases、test suites、test fixtures、test runner相關的類,讓測試更加明确、友善、可控。使用unittest編寫用例,必須遵守以下規則:
           

  (1)測試檔案必須先import unittest

  (2)測試類必須繼承unittest.TestCase

  (3)測試方法必須以“test_”開頭

  (4)測試類必須要有unittest.main()方法

 2.pytest是python的第三方測試架構,是基于unittest的擴充架構,比unittest更簡潔,更高效。使用pytest編寫用例,必須遵守以下規則:

(1)測試檔案名必須以“test_”開頭或者"_test"結尾(如:test_ab.py)
           

  (2)測試方法必須以“test_”開頭。

  (3)測試類命名以"Test"開頭。

 總結: pytest可以執行unittest風格的測試用例,無須修改unittest用例的任何代碼,有較好的相容性。 pytest插件豐富,比如flask插件,可用于用例出錯重跑;還有xdist插件,可用于裝置并行執行。     

二、用例前置和後置

1.unittest提供了setUp/tearDown,隻能針對所有用例。

2.pytest提供了子產品級、函數級、類級、方法級的setup/teardown,比unittest的setUp/tearDown更靈活。

子產品級(setup_module/teardown_module)開始于子產品始末,全局的

函數級(setup_function/teardown_function)隻對函數用例生效(不在類中)

類級(setup_class/teardown_class)隻在類中前後運作一次(在類中)

方法級(setup_method/teardown_method)開始于方法始末(在類中)

類裡面的(setup/teardown)運作在調用方法的前後

pytest還可以在函數前加@pytest.fixture()裝飾器,在測試用例中裝在fixture函數。fixture的使用範圍可以是function,module,class,session。

firture相對于setup和teardown來說有以下幾點優勢:

命名方式靈活,不局限于setup和teardown這幾個命名

conftest.py 配置裡可以實作資料共享,不需要import就能自動找到一些配置,可供多個py檔案調用。

scope="module" 可以實作多個.py跨檔案共享前置

scope="session" 以實作多個.py跨檔案使用一個session來完成多個用例

用yield來喚醒teardown的執行

三、斷言

1.unittest提供了assertEqual、assertIn、assertTrue、assertFalse。
           

 2.pytest直接使用assert 表達式。

四、報告

1.unittest使用HTMLTestRunnerNew庫。
           

  2.pytest有pytest-HTML、allure插件。

五、失敗重跑

  1、unittest無此功能。

  2、pytest支援用例執行失敗重跑,pytest-rerunfailures插件。

六、參數化

  1、unittest需依賴ddt庫,

  2、pytest直接使用@pytest.mark.parametrize裝飾器。

七、用例分類執行

  1、unittest預設執行全部用例,也可以通過加載testsuit,執行部分用例。

  2、pytest可以通過@pytest.mark來标記類和方法,pytest.main加入參數("-m")可以隻運作标記的類和方法。