大家好,我是好學的小師弟,今天和大家分享下-在pytest中的前置/后置操作,
所謂的前置/后置操作,就是在測驗用例執行前,你預先要執行的一些步驟;在測驗用例執行完畢后,你要執行的一些資料清理/備份作業,
在pytest中已經給我們準備好了這兩個函式,setup和teardown,用法如下:
"""
setup_module: 這是模塊級別的setup,作用域是整個.py檔案(整個模塊),只在運行所有的測驗用例前,有且執行一次
teardown_module:這是模塊級別的teardown,作用域是整個.py檔案(整個模塊),只在運行完所有的測驗用例后,有且執行一次
setup_function:這是函式級別的setup,作用域只針對函式,注意這里的函式指的是,不在類里面的函式方法,
如果函式在類里面,則function級別的setup,對他不起作用,因為不在它的作用域內,對于在類外的函式,
function級別的setup會在每條測驗用例執行前,都執行一遍
teardown_function:這是函式級別的teardown_function,作用域只針對函式,注意這里的函式指的是,不在類里面的函式方法,
如果函式在類里面,則function級別的teardown,對他不起作用,因為不在它的作用域內,對于在類外的函式,
function級別的teardown會在每條測驗用例執行完畢后,都執行一遍
setup_class:這是類級別的setup,作用域只在含有這個setup的那個類中,且只在類中的所有測驗用例執行前,有且執行一遍
teardown_class:這是類級別的teardown,作用域只在含有這個teardown的那個類中,且只在類中的所有測驗用例執行完畢后,有且執行一遍
setup_method:這是方法級別的setup,作用域只在含有這個setup的那個類中,且在當前類中的每條測驗用例執行前,都會執行一遍這個setup
teardown_method:這是方法級別的teardown,作用域只在含有這個teardown的那個類中,且在當前類中的每條測驗用例執行完畢后,都會執行一遍這個teardown
"""
測驗代碼:
import allure
import pytest
from control_login_csdn.login_csdn import login_csdn_python
from read_yaml.read_csdn_python_hotrank import Read_csdn
def setup_module():
print('這是模塊級別的setup,你會在執行所有的測驗用例前,執行它,有且只會執行一次')
def teardown_module():
print('這是模塊級別的teardown,只會在所有測驗用例執行完畢后,才執行一次')
'''
注意 function函式級別的 不能在class內部使用
'''
def setup_function():
print('這是函式級別的setup,你在執行每條測驗用例前,都會執行它,但是前提是,'
'它只對不在類(class)里面的函式生效,如果你的test_函式寫在類Test_里面去了,這個setup_function就不會生效,哪怕你把他寫到class里面去也不會生效'
'它只對類(class)外的函式生效')
def teardown_function():
print('這是函式級別的teardown,每條測驗用例執行完畢后,都會執行,但是前提是,它只對不在類(class)里面的函式生效,'
'如果你的test_函式寫在類Test_里面去了,這個teardown_function就不會生效,哪怕你把他寫到class里面去也不會生效'
'它只對類(class)外的函式生效')
'''
還有setup_class和teardown_class這兩個類級別的他們要寫到類里面去,有且只執行一次
setup_method和teardown_method是方法級別的,他們要寫到類里面去,而且類里面所有測驗用例,她都會執行
'''
class Test_csdn_login():
@allure.feature('登錄模塊')
@pytest.mark.parametrize('indata,outdata',
Read_csdn().read_csdn(filepath='./yaml_files/csdn_hot_rank_python.yaml'))
@pytest.mark.xfail
def test_login(self, indata, outdata):
# 呼叫業務代碼,獲取回應,業務代碼就是login_csdn.py這個檔案中的函式
print('這是執行登陸測驗用例')
res = login_csdn_python(indata)
# 斷言
assert res['code'] == outdata['code']
print('測驗結束了')
@pytest.mark.xfail
def test_01(self):
print('111')
def setup_method(self):
print('這是方法級別的setup,你會在類里面執行,且類里面的所有測驗用例執行前都會執行這條陳述句')
def teardown_method(self):
print('這是方法級別的teardown,你會在類里面執行,且類里面的所有測驗用例執行后都會執行這條陳述句')
def setup_class(self):
print('這是類級別的setup,你會在類里面執行所有的測驗用例前,執行它,有且只會執行一次')
def teardown_class(self):
print('這是類級別的teardown,只會在類里面所有測驗用例執行完畢后,才執行一次')
if __name__ == '__main__':
# -s 列印輸出
pytest.main(['-sq', 'test_practise_setup_and_taerdown_DifferFrom_fixture.py', "--alluredir=./target/allure-results"])
'''
F 用例失敗
E error
. 成功的
'''
結果圖:
"""
============================= 2 xpassed in 0.84s ==============================
Process finished with exit code 0
這是模塊級別的setup,你會在執行所有的測驗用例前,執行它,有且只會執行一次
這是類級別的setup,你會在類里面執行所有的測驗用例前,執行它,有且只會執行一次
這是方法級別的setup,你會在類里面執行,且類里面的所有測驗用例執行前都會執行這條陳述句
XPASS [ 50%]這是執行登陸測驗用例
測驗結束了
這是方法級別的teardown,你會在類里面執行,且類里面的所有測驗用例執行后都會執行這條陳述句
這是方法級別的setup,你會在類里面執行,且類里面的所有測驗用例執行前都會執行這條陳述句
XPASS [100%]111
這是方法級別的teardown,你會在類里面執行,且類里面的所有測驗用例執行后都會執行這條陳述句
這是類級別的teardown,只會在類里面所有測驗用例執行完畢后,才執行一次
這是模塊級別的teardown,只會在所有測驗用例執行完畢后,才執行一次
"""
pytest中除了提供現成的setup方法和teardown方法,還提供了conftest檔案結合fixture的方法來達到處理測驗用例的前置條件和后置條件的操作,
conftest簡介:
1.conftest是一個名字固定的.py檔案,他就叫conftest,
2.conftest作用域:一般在工程 根目錄 下設定的conftest.py檔案起到全域作用, 在不同子目錄下也可以放conftest.py的檔案,作用范圍只能在該目錄及以下目錄內
3.conftest.py檔案的作用:所有同目錄下的測驗用例檔案運行前都會執行conftest.py文件,它就相當于一個前置檔案,將conftest的該特性和fixture方法結合起來使用,即可達到測驗用例前置/后置條件陳述句操作
在根目錄下新建一個conftest.py檔案

然后在conftest.py檔案中,寫入前置/后置條件陳述句,通過fixture來實作
import pytest
@pytest.fixture(scope='module', autouse=True)
def start_prepare():
print('正在初始化資料,我現在就相當于setup操作') # 這個就相當于setup
yield
print('測驗結束,正在處理測驗檔案,我現在就相當于teardown') # 這個就相當于teardown
"""
這邊的scope指的就是你這個fixture陳述句的作用域
假設有三個測驗用例檔案
scope='session',在三個測驗用例檔案,一個都沒有執行前執行一次,有且僅執行一次
你可以把session理解為早讀課,三個測驗用例檔案,理解為早上的三節課,
scope='module',每一個測驗檔案執行前都要執行一遍fixture
scope='class',每一個測驗檔案中的測驗類執行前都要執行一遍fixture
scope='function',所有檔案的每條測驗用例執行前都要執行一遍fixture
autouse=True
這個就是運行時,自動執行該條陳述句
不需要我們再去呼叫@pytest.mark.usefixtures("你的fixture的函式名")來執行fixture陳述句
這里我們呼叫的話,就是@pytest.mark.usefixtures("start_prepare")
"""
測驗代碼:
import pytest
@pytest.fixture(scope='module', autouse=True)
def start_prepare():
print('正在初始化資料,我現在就相當于setup操作') # 這個就相當于setup
yield
print('測驗結束,正在處理測驗檔案,我現在就相當于teardown') # 這個就相當于teardown
注意:這個代碼是寫在conftest.py檔案中的,conftest.py檔案不需要匯入,在執行pytest測驗用例的時候,它會自動去找conftest.py檔案
現在再運行,上面寫的setup和teardown的代碼,你會發現多出來兩行字,就是conftest.py檔案里的fixture這兩行字,
效果圖:
'''
============================= 2 xpassed in 1.01s ==============================
Process finished with exit code 0
正在初始化資料,我現在就相當于setup操作 #fixture陳述句
這是模塊級別的setup,你會在執行所有的測驗用例前,執行它,有且只會執行一次
這是類級別的setup,你會在類里面執行所有的測驗用例前,執行它,有且只會執行一次
這是方法級別的setup,你會在類里面執行,且類里面的所有測驗用例執行前都會執行這條陳述句
XPASS [ 50%]這是執行登陸測驗用例
測驗結束了
這是方法級別的teardown,你會在類里面執行,且類里面的所有測驗用例執行后都會執行這條陳述句
這是方法級別的setup,你會在類里面執行,且類里面的所有測驗用例執行前都會執行這條陳述句
XPASS [100%]111
這是方法級別的teardown,你會在類里面執行,且類里面的所有測驗用例執行后都會執行這條陳述句
這是類級別的teardown,只會在類里面所有測驗用例執行完畢后,才執行一次
這是模塊級別的teardown,只會在所有測驗用例執行完畢后,才執行一次
測驗結束,正在處理測驗檔案,我現在就相當于teardown #fixture陳述句
'''
新人創作不易,覺得不錯的看官,點個贊吧,么么噠!!!
轉載注明出處!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394227.html
標籤:其他
