前面一篇文章Python單元測試框架介紹已經介紹了python單元測試框架,你們平時常用的是unittest,由於它比較基礎,而且能夠進行二次開發,若是你的開發水平很高,集成開發自動化測試平臺也是能夠的。而這篇文章主要講unittest與pytest的區別,pytest相對unittest而言,代碼簡潔,使用便捷靈活,而且插件很豐富。html
主要從用例編寫規則、用例的前置和後置、參數化、斷言、用例執行、失敗重運行和報告這幾個方面比較unittest和pytest的區別:python
若是很差看,能夠看下面表格:flask
整體來講,unittest用例格式複雜,兼容性無,插件少,二次開發方便。pytest更加方便快捷,用例格式簡單,能夠執行unittest風格的測試用例,無須修改unittest用例的任何代碼,有較好的兼容性。pytest插件豐富,好比flask插件,可用於用例出錯重跑,還有xdist插件,可用於設備並行執行,效率更高。api
講了七大區別,總要演示一下具體實例,用事實說話。框架
這裏抽用例前置與後置的區別來說,先看unittest的先後置使用:函數
import unittest class TestFixtures01(unittest.TestCase): # 全部用例執行前執行 def setUp(self) -> None: print("setUp開始") def tearDown(self) -> None: print("tearDown結束") # 每條用例執行前執行 @classmethod def setUpClass(cls) -> None: print("setUpClass開始") @classmethod def tearDownClass(cls) -> None: print("tearDownClass結束") # 測試用例 def test_001(self): print("測試用例001") class TestFixtures02(unittest.TestCase): def test_002(self): print("測試類2") # 每一個模塊執行前執行 def setUpModule(): """ 在全部測試類在調用以前會被執行一次,函數名是固定寫法,會被unittest框架自動識別 """ print('集成測試 >>>>>>>>>>>>>>開始') def tearDownModule(): print("集成測試 >>>>>>>>>>>>>>結束") if __name__ == '__main__': unittest.main()
運行結果:單元測試
從結果上得知,三個方法的邏輯優先級:setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule()測試
接下來看pytest的先後置:插件
一、咱們都知道在自動化測試中都會用到先後置,pytest 相比 unittest 不管是先後置仍是插件等都靈活了許多,還能本身用 fixture 來定義。3d
首先了解一下,用例運行先後置級別以下:
def setup_module(): print('\n整個模塊 前 只運行一次') def teardown_module(): print('\n整個模塊 後 只運行一次') def setup_function(): print('\n不在類中的函數,每一個用例 前 只運行一次') def teardown_function(): print('\n不在類中的函數,每一個用例 後 只運行一次') def test_ab(): b = 2 assert b < 3 def test_aba(): b = 2 assert b < 3 class Test_api(): def setup_class(self): print('\n此類用例 前 只執行一次') def teardown_class(self): print('\n此類用例 後 只執行一次') def setup_method(self): print('\n此類每一個用例 前 只執行一次') def teardown_method(self): print('\n此類每一個用例 後 執行一次') def test_aa(self): a = 1 print('\n我是用例:a') # pytest -s 顯示打印內容 assert a > 0 def test_b(self): b = 2 assert b < 3
運行結果:
二、這是原始用法,下面看使用Fixture,Fixture 其實就是自定義 pytest 執行用例前置和後置操做,首先建立 conftest.py 文件 (規定此命名),導入 pytest 模塊,運用 pytest.fixture 裝飾器,默認級別爲:函數級:
其它用例文件調用便可,以下定義一個函數,繼承 conftest.py 文件裏的 login 函數便可調用:
# conftest.py配置須要注意如下點: # conftest.py配置腳本名稱是固定的,不能更名稱 # conftest.py與運行的用例要在同一個pakage下,而且有__init__.py文件 # 不須要import導入 conftest.py,pytest用例會自動查找 import pytest def test_one(login): print("登錄後,操做111") # def test_two(): # print("操做222") # # def test_three(login): # print("登錄後,操做333")
運行結果:
三、擴展用法,多個自定義函數和全局級別展現:(全局的好比用於登陸獲取到token其餘用例模塊就不須要再登陸了)
import pytest def test_one(login): print("登錄後,操做111") def test_two(login,open_page): print("測試用例2") def test_three(open_page): print("測試用例3")
運行結果:
細心的人應該能夠知道,測試用例2並無調用login函數,由於前置設置的是共享模式,相似全局函數。