python接口自動化12-pytest先後置與fixture

前言

咱們都知道在自動化測試中都會用到先後置,pytest 相比 unittest 不管是先後置仍是插件等都靈活了許多,還能本身用 fixture 來定義。(甩 unttest 半條街?)html

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

  • 模塊級:全局的,整個模塊開只運行一次,優先於測試用例。
  • 類級別:定義在類裏面,只針對此類生效。相似unittest的cls裝飾器
  • 函數級:只對函數生效,類下面的函數不生效。
  • 方法級:定義在類裏面,每一個用例都執行一次

1、setup、teardown級別

一、模塊級別:setup_module、teardown_moduleapi

全局的,整個模塊開只運行一次,優先於測試用例。session

 二、類級別:setup_class、teardown_class框架

類級別:定義在類裏面,只針對此類生效。相似unittest的cls裝飾器函數

 三、函數級:setup_function、teardown_function測試

函數級:只對函數生效,類下面的函數不生效。spa

 四、方法級:setup_method、teardown_method插件

方法級:定義在類裏面的函數,也叫方法,每一個用例都執行一次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

 2、fixture簡單使用

一、Fixture 其實就是自定義 pytest 執行用例前置和後置操做,首先建立 conftest.py 文件 (規定此命名)

二、導入 pytest 模塊,運用 pytest.fixture 裝飾器,默認級別爲:函數級,如圖二源碼

 

 三、其它用例文件調用便可,以下定義一個函數,繼承 conftest.py 文件裏的 setup_login 函數便可調用:

''' 運用 fixtures 定義的順序 '''
def test_001(setup_login):
    print('\n上面是登陸,我如今點擊進入home')

四、cmd 運行結果以下:

先執行了 conftest.py 文件裏的 setup_login 函數,再執行運行的用例.py文件;

G:\python_study\study\pytest_demo\study>pytest -s test_fixture.py
================================================= test session starts =================================================
platform win32 -- Python 3.6.5, pytest-3.6.3, py-1.8.0, pluggy-0.6.0
rootdir: G:\python_study\study\pytest_demo\study, inifile:
collected 1 item

test_fixture.py
先執行登陸

上面是登陸,我如今點擊進入home
.

============================================== 1 passed in 0.07 seconds ===============================================

五、conftest.py 文件,自定義函數後置操做:yield

G:\python_study\study\pytest_demo\study>pytest -s test_fixture.py
================================================= test session starts =================================================
platform win32 -- Python 3.6.5, pytest-3.6.3, py-1.8.0, pluggy-0.6.0
rootdir: G:\python_study\study\pytest_demo\study, inifile:
collected 1 item

test_fixture.py
先執行登陸

上面是登陸,我如今點擊進入home
.
測試數據最後執行清理


============================================== 1 passed in 0.06 seconds ===============================================

六、多個自定義函數和全局級別展現:(全局的好比用於登陸獲取到token其餘用例模塊就不須要再登陸了)

①conftest.py 文件代碼以下:

import pytest

@pytest.fixture(scope='session')    # scope='session' 任何文件共享
def setu_login():
    print('\n用例先登陸')

@pytest.fixture()
def open_html():
    print('\n打開頁面')

    # 後置操做
    yield
    print('\n測試數據最後執行清理')

②用例文件代碼以下:

def test_001(setu_login):
    print('\n上面是登陸,我如今點擊進入home')

def test_002(open_html):
    print('\n沒登陸,打開html')

def test_003(setu_login, open_html):
    print('\n登陸後,打開html')

def test_data(open_html):
    print('測試數據1')

def test_data1(open_html):
    print('測試數據122')

③cmd 運行結果:

G:\python_study\study\pytest_demo\study>pytest -s test_fixture.py
================================================= test session starts =================================================
platform win32 -- Python 3.6.5, pytest-3.6.3, py-1.8.0, pluggy-0.6.0
rootdir: G:\python_study\study\pytest_demo\study, inifile:
collected 5 items

test_fixture.py
用例先登陸

上面是登陸,我如今點擊進入home
.
打開頁面

沒登陸,打開html
.
測試數據最後執行清理

打開頁面

登陸後,打開html
.
測試數據最後執行清理

打開頁面
測試數據1
.
測試數據最後執行清理

打開頁面
測試數據122
.
測試數據最後執行清理


============================================== 5 passed in 0.06 seconds ===============================================

看完以後,有沒有甩 unittest 框架半條街你說了算?pytest 成爲了目前主流的任意玩框架。

對於運行用例級別都是setup_xx,teartown_xx,後面接module、class是否是很好記呢?歡迎來QQ交流羣:482713805

相關文章
相關標籤/搜索