目前搜狗商城接口測試框架用的是unittest+HTMLTestRunner,case數有1097條,目前運行一次自動化測試,時長約為30分鍾,期望控制在10分鍾或者更短的時間內。近期打算重新優化框架,着重解決運行效率低的問題。最近調研了一下另一種主流測試框架Pytest,Pytest是一個非常成熟的全功能的Python測試框架,本文主要對比了Unittest和Pytest這兩種較為流行的Python測試框架。
一、Unittest
Unittest是Python標准庫中自帶的單元測試框架,Unittest有時候也被稱為PyUnit,就像JUnit是Java語言的標准單元測試框架一樣,Unittest則是Python語言的標准單元測試框架。
Unittest支持自動化測試,測試用例的初始化、關閉和測試用例的聚合等功能,它有一個很重要的特性:它是通過類(class)的方式,將測試用例組織在一起。
示例:
執行結果:
注:unittest有一個關聯模塊unittest2,但unittest2僅適用於Python 2.4-2.6。這是由於從Python 2.7開始,unittest增加一些新的特性。為了在老的版本中支持這些特性,所以提供了unittest2這個庫。但對於Python 2.7及之后的版本,unittest是唯一的。本次示例中使用的為python2.7。
二、Pytest
Pytest是Python的另一個第三方單元測試庫。它的目的是讓單元測試變得更容易,並且也能擴展到支持應用層面復雜的功能測試。
pytest的特性有:
-
支持用簡單的assert語句實現豐富的斷言,無需復雜的self.assert*函數
-
自動識別測試模塊和測試函數
-
模塊化夾具用以管理各類測試資源
-
對 unittest 完全兼容,對 nose基本兼容
-
支持Python3和PyPy3
-
豐富的插件生態,已有300多個各式各樣的插件,社區繁榮
示例:
執行結果:
三、Unittest vs Pytest
unittest |
pytest |
|
用例編寫規則 |
1)測試文件必須先import unittest 2)測試類必須繼承unittest.TestCase 3)測試方法必須以“test_”開頭 4)測試類必須要有unittest.main()方法 |
1)測試文件名必須以“test_”開頭或者"_test"結尾(如:test_ab.py) 2)測試方法必須以“test_”開頭 3)測試類命名以"Test"開頭
|
用例分類執行
|
默認執行全部用例,也可以通過加載testsuit,執行部分用例 |
可以通過@pytest.mark來標記類和方法,pytest.main加入參數("-m")可以只運行標記的類和方法 |
用例前置和后置 |
提供了setUp/tearDown,只能針對所有用例 |
pytest中的fixture顯然更加靈活。可以任意自定義方法函數,只要加上@pytest.fixture()這個裝飾器,那么被裝飾的方法就可以被使用 |
參數化 |
需依賴ddt庫 |
使用@pytest.mark.parametrize裝飾器 |
斷言 |
很多斷言格式(assertEqual、assertIn、assertTrue、assertFalse) |
只有assert一個表達式,用起來比較方便 |
報告 |
使用HTMLTestRunnerNew庫 |
有pytest-HTML、allure插件 |
失敗重跑 |
無此功能 |
pytest支持用例執行失敗重跑,pytest-rerunfailures插件 |
總結:總體來說,unittest用例格式復雜,兼容性無,插件少,二次開發方便。pytest更加方便快捷,用例格式簡單,可以執行unittest風格的測試用例,無須修改unittest用例的任何代碼,有較好的兼容性。pytest插件豐富,比如flask插件,可用於用例出錯重跑,還有xdist插件,可用於設備並行執行,效率更高。