自動化測試框架pytest系列之基礎概念介紹(一)-CSDN博客??
自動化測試框架pytest系列之21個命令行參數(shù)介紹(二)-CSDN博客
自動化測試框架pytest系列之強大的fixture功能,為什么fixture強大?一文拆解它的功能參數(shù)。(三)-CSDN博客
接上文?
3.5 pytest的8個裝飾器
在之前的文章可以看到,fixture本身就是以裝飾器的形式去使用的。但在pytest中,其實有很多的裝飾器函數(shù),接下來我們就捋一下有哪些裝飾器 。
?
如果你自己發(fā)現(xiàn) ,除了fixture本身 ,其他的都在mark后面進行標記 。所以這個mark非常重要 。
1.@pytest.fixture()
此功能應該是pytest中最核心和強大的功能 ,為了介紹此功能 ,本人足足寫了1.8w字 。具體可查看鏈接 :自動化測試框架pytest到底都有哪些實用功能 ?pytest系列文章之fixture的介紹(一)。 - 知乎 (zhihu.com)
2.@pytest.mark.usefixtures()
-
功能 :可以在測試用例中引入fixture的功能 ,
-
格式 :@pytest.mark.usefixtures("fixture函數(shù)名"),其中參數(shù)必須傳遞fixture的函數(shù)名字 ,而且要用引號引起來 。
-
區(qū)別 :和fixture()傳遞給測試用例的區(qū)別是 :
-
fixture:既可以將返回值傳給測試用例,也可以無任何返回值,比如像上面的打印語句,本身不返回任何信息。
-
usefixture :無法將返回值的函數(shù)傳遞給測試用例 ,即測試用例只能接受無返回值的usefixture 。
-
-
需求 :給登錄的每條測試用例中添加一個打印信息,具體如下:
import pytest
from package_pytest.login import login
# fixture
@pytest.fixture()
def demo_fixture():
print("這是一個fixture,要在每個方法執(zhí)行前先運行")
# case1 : 輸入正確的用戶名和正確的密碼進行登錄
@pytest.mark.usefixtures('demo_fixture')
def test_login_success():
print("1")
expect_result = 0
actual_result = login('admin','123456').get('code')
assert expect_result == actual_result
# case2 : 輸入正確的用戶名和錯誤的密碼進行登錄
@pytest.mark.usefixtures('demo_fixture')
def test_password_is_wrong():
print("2")
expect_reesult = 3
actual_result = login('admin','1234567').get('code')
assert expect_reesult == actual_result
# case3 : 輸入用戶名和空的密碼進行登錄
@pytest.mark.usefixtures('demo_fixture')
def test_password_is_null():
print("3")
expect_reesult = 2
actual_result = login('admin', '').get('code')
assert expect_reesult == actual_result
if __name__ == '__main__':
pytest.main(['test12_login_usefixtrues.py','-sv'])
-
說明 :
-
定義了一個demo_fixture函數(shù) ,其中這個函數(shù)想被測試用例調用 。
-
在調用的測試用例前加上@pytest.mark.usefixtures('demo_fixture') ,相當于把fixture函數(shù)傳遞給了測試用例了 。
-
所以 ,在測試用例運行就會先執(zhí)行fixture函數(shù)內的代碼了 。
-
以上代碼運行結果為 :
3.@pytest.mark.parametrize
-
功能 :可以專門為某條測試用例進行參數(shù)化 ,
-
格式 :@pytest.mark.parametrize(參數(shù),列表) ,其中參數(shù)主要為了傳遞給測試用例使用的,它接受的是字符串類型 。而列表是用來接收測試數(shù)據(jù)的。
-
需求 :要將登錄的4條測試數(shù)據(jù)傳入給登錄測試用來,該如何做 ,使用parametrize代碼實現(xiàn)為 :
import pytest
from package_pytest.login import login
cases = [(0,'admin','123456'),(3,'admin','1234567'),(2,'admin',''),(1,'','123456')]
# case: 登錄測試用例
@pytest.mark.parametrize("expect_result,username,password",cases)
def test_login_success(expect_result,username,password):
print("1")
actual_result = login(username,password).get('code')
assert expect_result == actual_result
?對以上代碼的說明 :
運行結果如下 : ?
4.@pytest.mark.標識符
-
功能 :可以做回歸測試或者打包測試套件
-
格式 :@pytest.mark.標識符 ,其中標識符可以是任何字符。
-
說明:在測試用例中,我們經(jīng)常通過用例級別代表用例的重要程度 ,比如會把用例設置為p1 , p2 ,p3 ,p4 .而在pytest中就可以mark進行標記 。
-
需求 :對登錄成功的用例標記為p1 ,對登錄失敗的用例標記為p2 ,具體代碼如下 :
# case1 : 輸入正確的用戶名和正確的密碼進行登錄
@pytest.mark.p1
def test_login_success():
print("1")
expect_result = 0
actual_result = login('admin','123456').get('code')
assert expect_result == actual_result
# case2 : 輸入正確的用戶名和錯誤的密碼進行登錄
@pytest.mark.p2
def test_password_is_wrong():
print("2")
expect_reesult = 3
actual_result = login('admin','1234567').get('code')
assert expect_reesult == actual_result
# case3 : 輸入用戶名和空的密碼進行登錄
@pytest.mark.p2
def test_password_is_null():
print("3")
expect_reesult = 2
actual_result = login('admin', '').get('code')
assert expect_reesult == actual_result
if __name__ == '__main__':
pytest.main(['test08_login_mark.py','-sv','-m','p1'])
可以看到 ,我們在main函數(shù)中傳入了-m
和p1
,就代表只運行mark中標記為p1級別的用例 ,這樣就實現(xiàn)了部分用例的執(zhí)行。
運行結果如下 :
5.@pytest.mark.skip
-
功能 :用例跳過,比如某條用例暫時失敗了,但是找不到原因 ,可以先標記為跳過 。
-
格式 :@pytest.mark.skip(reason) ,這里的reason就是跳過的原因
-
需求 :對登錄成功的用例標記為跳過,在執(zhí)行的時候不運行 ,具體代碼如下 :
import pytest
from package_pytest.login import login
# case1 : 輸入正確的用戶名和正確的密碼進行登錄
@pytest.mark.skip(reason="用例運行失敗,暫時找不到失敗原因,跳過該用例執(zhí)行。")
def test_login_success():
print("1")
expect_result = 0
actual_result = login('admin','123456').get('code')
assert expect_result == actual_result
# case2 : 輸入正確的用戶名和錯誤的密碼進行登錄
@pytest.mark.p2
def test_password_is_wrong():
print("2")
expect_reesult = 3
actual_result = login('admin','1234567').get('code')
assert expect_reesult == actual_result
# case3 : 輸入用戶名和空的密碼進行登錄
@pytest.mark.p2
def test_password_is_null():
print("3")
expect_reesult = 2
actual_result = login('admin', '').get('code')
assert expect_reesult == actual_result
if __name__ == '__main__':
pytest.main(['test09_login_skip.py','-sv'])
?運行代碼如下 :
6.@pytest.mark.skipif
-
功能 :選擇性跳過用例,條件為True才會跳過 。
-
格式 :@pytest.mark.skipif(表達式) ,這里只能做一些簡單的判斷。
-
說明 :和skip相比 ,只要標記為skip,此用例就會跳過,而標記為skipif的話,這里有個判斷,只有為ture的情況下才會跳過 。
-
需求 :對登錄成功的用例標記選擇性跳過,符合條件的將跳過該用例 ,具體代碼如下 :
import pytest
from package_pytest.login import login
import sys
# case1 : 輸入正確的用戶名和正確的密碼進行登錄
@pytest.mark.skipif(sys.platform == "win32",reason="是windows平臺的跳過")
def test_login_success():
print("1")
expect_result = 0
actual_result = login('admin','123456').get('code')
assert expect_result == actual_result
# case2 : 輸入正確的用戶名和錯誤的密碼進行登錄
@pytest.mark.skipif(sys.version_info <(3,6),reason="低于3.6版本的跳過")
def test_password_is_wrong():
print("2")
expect_reesult = 3
actual_result = login('admin','1234567').get('code')
assert expect_reesult == actual_result
# case3 : 輸入用戶名和空的密碼進行登錄
@pytest.mark.skipif(sys.version_info >=(3,6),reason="大于等于3.6版本的跳過")
def test_password_is_null():
print("3")
expect_reesult = 2
actual_result = login('admin', '').get('code')
assert expect_reesult == actual_result
if __name__ == '__main__':
pytest.main(['test10_login_skipif.py','-sv'])
因為我的Python版本是3.6.4 ,故第二條用例不會被跳過,運行結果如下 :
7.@pytest.mark.xfail
-
功能 :標記為失敗用例,表示期望這個用例執(zhí)行失敗。
-
格式 :@pytest.mark.xfail(表達式,reason) ,表達式為True,標記為失敗用例。
-
說明 :和skipif相比,skipif表達式為真,跳過用例執(zhí)行,而標記xfail的話,表達式為真,則標記為失敗 。
-
需求 :對登錄用例中符合條件的都標記為失敗用例 ,具體代碼如下 :
import pytest
from package_pytest.login import login
import sys
# case1 : 輸入正確的用戶名和正確的密碼進行登錄
@pytest.mark.xfail(sys.platform == "win32",reason="是windows平臺的跳過")
def test_login_success():
print("1")
expect_result = 0
actual_result = login('admin','123456').get('code')
assert expect_result == actual_result
# case2 : 輸入正確的用戶名和錯誤的密碼進行登錄
@pytest.mark.xfail(sys.version_info <(3,6),reason="低于3.6版本的標記為失敗")
def test_password_is_wrong():
print("2")
expect_reesult = 3
actual_result = login('admin','1234567').get('code')
assert expect_reesult == actual_result
# case3 : 輸入用戶名和空的密碼進行登錄
@pytest.mark.xfail(sys.version_info >=(3,6),reason="大于等于3.6版本的標記為什么")
def test_password_is_null():
print("3")
expect_reesult = 20
actual_result = login('admin', '').get('code')
assert expect_reesult == actual_result
if __name__ == '__main__':
pytest.main(['test11_login_xfail.py','-sv'])
?運行結果如下 :
以上是正常的運行結果 ,如果你只想運行失敗的用例,你可以加入該選項'--runxfail' . ?
if __name__ == '__main__':
pytest.main(['test11_login_xfail.py','-sv','--runxfail'])
?運行以上命令,那么這條用例就會像斷言失敗的用例輸出 。
8.@pytest.mark.run
-
功能 :控制用例的運行順序 ,但它需要下載插件pytest-ordering .
-
格式 :@pytest.mark.run(order=n) ,其中n代表一個數(shù)字 ,數(shù)字越小,代表執(zhí)行順序越靠前 ,反之數(shù)字越大,越靠后。
-
需求 :給登錄的測試用例標記不同的順序 ,具體如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-787022.html
?運行結果如下 : 文章來源地址http://www.zghlxwxcb.cn/news/detail-787022.html
到了這里,關于自動化測試框架pytest系列之8個常用的裝飾器函數(shù)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!