Python 自動化測試框架unittest與pytest的區別

  引言

  前面一篇文章Python單元測試框架介紹已經介紹了python單元測試框架,你們平時常用的是unittest,由於它比較基礎,而且能夠進行二次開發,若是你的開發水平很高,集成開發自動化測試平臺也是能夠的。而這篇文章主要講unittest與pytest的區別,pytest相對unittest而言,代碼簡潔,使用便捷靈活,而且插件很豐富。html

  Unittest vs Pytest

  主要從用例編寫規則、用例的前置和後置、參數化、斷言、用例執行、失敗重運行和報告這幾個方面比較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

首先了解一下,用例運行先後置級別以下:

  • 模塊級:全局的,整個模塊開只運行一次,優先於測試用例。
  • 類級別:定義在類裏面,只針對此類生效。相似unittest的cls裝飾器
  • 函數級:只對函數生效,類下面的函數不生效。
  • 方法級:定義在類裏面,每一個用例都執行一次
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函數,由於前置設置的是共享模式,相似全局函數。

相關文章
相關標籤/搜索