學習Python自動化測試,Pytest的引數化你必須瞭解下
無論什麼自動化,都會需要引數化。unittest可以透過ddt來完成引數化,那麼pytest透過什麼呢?
parametrize
pytest中自帶的裝飾器parametrize可以來實現測試用例的引數化功能。
使用方法
透過下方裝飾器,使用在需要傳入引數的case中。用例傳參中的值和裝飾器傳入的引數值一致。
@pytest。mark。parametrize(‘引數化名稱’,引數化值)
安靜舉一個登入傳參的例子。
import pytest
# 登入引數
data = [(‘anjing’, ‘anjing_pwd’), (‘test’, ‘test_pwd’), (‘admin’, ‘admin_pwd’)]
class Test_01:
# 透過parametrize進行引數化
@pytest。mark。parametrize(‘user, pwd’, data)
def test_01(self, user,pwd):
print(‘——-用例01——-’)
print(‘登入的使用者名稱:%s’ % user)
print(‘登入的密碼:%s’ % pwd)
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過直接結果可以看出來,test_01一共執行了3次。每次都是不同的引數資訊。
自定義引數資訊
在自動化中每個引數化中的引數都有不同的意義,可以進行備註引數資訊。這樣在執行後更加清楚的知道我們每個引數的內容。這裡透過parametrize的引數ids方法進行備註引數資訊。注意:備註的引數資訊一定要和引數數量保持一致。
import pytest
# 登入引數
data = [(‘anjing’, ‘anjing_pwd’), (‘test’, ‘test_pwd’), (‘admin’, ‘admin_pwd’)]
class Test_01:
# 透過parametrize進行引數化
@pytest。mark。parametrize(‘user,pwd’, data, ids=[‘user name is anjing’,‘user name is test’,‘user name is admin’])
def test_01(self, user,pwd):
print(‘——-用例01——-’)
print(‘登入的使用者名稱:%s’ % user)
print(‘登入的密碼:%s’ % pwd)
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過執行程式碼結果發現我們的自定義引數資訊已經生效了。在每條用例後都顯示了我們備註的引數資訊。
跳過不需要的引數
比如在某次測試過程中,遇到了不必要的引數,我們可以進行透過pytest。mark。skip的方法進行跳過。
import pytest
# 登入引數
data = [(‘anjing’, ‘anjing_pwd’), pytest。param(‘test’, ‘test_pwd’,marks=pytest。mark。skip), (‘admin’, ‘admin_pwd’)]
class Test_01:
# 透過parametrize進行引數化
@pytest。mark。parametrize(‘user,pwd’, data, ids=[‘user name is anjing’,‘user name is test’,‘user name is admin’])
def test_01(self, user,pwd):
print(‘——-用例01——-’)
print(‘登入的使用者名稱:%s’ % user)
print(‘登入的密碼:%s’ % pwd)
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過執行結果可以看出來,user為test的引數已經被跳過了。
多組引數化資料
在測試過程中,會遇到多組資料同時使用的情況。比如兩組資料一起混合使用,結果就會有2組資料的數量相乘。下方例子:每組都有3個引數,想要的混合結果,一共9種結果。這種方法就可以透過parametrize的方法進行使用,在需要用到引數的用例上加入兩個裝飾器即刻。
import pytest
# 登入引數
data = [‘anjing’, ‘test’, ‘admin’]
data1 = [‘123’, ‘456’, ‘789’]
class Test_01:
# 透過parametrize進行引數化
@pytest。mark。parametrize(‘user’, data)
@pytest。mark。parametrize(‘pwd’, data1)
def test_01(self, user, pwd):
print(‘——-用例01——-’)
print(‘登入的使用者名稱:%s’ % user)
print(‘登入的密碼:%s’ % pwd)
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過結果可以看出來,一共運行了10條用例,其中引數化一共9條。
字典引數形式
上面的案例中,我們可以看出來,引數化的書寫格式不僅僅只有元祖,還支援列表,元祖和列表都支援了,當然還支援字典形式。
import pytest
data = [{‘user’: “anjing”, ‘pwd’: “123456”},
{‘user’: “test”, ‘pwd’: “123456”},
{‘user’: “admin”, ‘pwd’: “123456”}]
class Test_01:
@pytest。mark。parametrize(‘user’, data)
def test_01(self, user):
print(‘賬號資訊:%s’ % user)
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過執行結果發現,我們透過字典的字典的形式進行書寫,parametrize也是支援字典的形式進行傳參。
fixture中params
上面介紹了pytest中的自帶的引數化方法,我們也可以透過使用fixture中的params引數來做引數化。
使用方法
透過fixture中的params方法進行傳參,然後透過request。param進行接收結果。然後在使用的過程中直接返回。
import pytest
data = [{‘user’: “anjing”, ‘pwd’: “123456”},
{‘user’: “test”, ‘pwd’: “123456”},
{‘user’: “admin”, ‘pwd’: “123456”}]
@pytest。fixture(params=data)
def login(request):
print(‘開啟瀏覽器’)
yield request。param
print(‘關閉瀏覽器’)
class Test_01:
def test_01(self, login):
print(‘使用者名稱:%s’ % login[‘user’])
print(‘密碼:%s’ % login[‘pwd’])
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過執行結果可以看出,我們已經透過fixture完成了引數化內容。
傳參形式
上面介紹了字典的傳參形式,下面給大家介紹列表的傳參形式。
import pytest
data = [[‘anjing’, ‘anjing_pwd’], [‘test’, ‘test_pwd’],
[‘admin’,‘admin_pwd’]]
@pytest。fixture(params=data)
def login(request):
print(‘開啟瀏覽器’)
yield request。param
print(‘關閉瀏覽器’)
class Test_01:
def test_01(self, login):
print(‘使用者名稱:%s’ % login[0])
print(‘密碼:%s’ % login[1])
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過執行發現,透過列表的形式也可以進行傳參。
字典和列表的都介紹完了,下面肯定是元祖的傳參方式了。
import pytest
data = [(‘anjing’, ‘anjing_pwd’), (‘test’, ‘test_pwd’),
(‘admin’,‘admin_pwd’)]
@pytest。fixture(params=data)
def login(request):
print(‘開啟瀏覽器’)
yield request。param
print(‘關閉瀏覽器’)
class Test_01:
def test_01(self, login):
print(‘使用者名稱:%s’ % login[0])
print(‘密碼:%s’ % login[1])
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過結果可以看出來,我們透過元祖的方式也進行了傳參。
自定義引數資訊
前面介紹pytest中的parametrize方法時,可以對每條引數進行資訊備註,在fixture的引數化中,也是可以的,fixture中有個ids引數就是用來表示對引數化的資訊進行引數備註資訊,直接在fixture的裝飾器方式中加入ids引數即刻。注意:這個備註資訊和引數化的數量保持一致。
import pytest
data = [[‘anjing’, ‘anjing_pwd’], [‘test’, ‘test_pwd’],
[‘admin’,‘admin_pwd’]]
@pytest。fixture(params=data, ids=[‘user=anjing’,‘user=test’,‘user=admin’])
def login(request):
print(‘開啟瀏覽器’)
yield request。param
print(‘關閉瀏覽器’)
class Test_01:
def test_01(self, login):
print(‘使用者名稱:%s’ % login[0])
print(‘密碼:%s’ % login[1])
def test_02(self):
print(‘——-用例02——-’)
if __name__ == ‘__main__’:
pytest。main([‘-vs’])
透過執行結果發現,我們的結果中已經對各個引數化內容進行了資訊備註。
好了,簡單的給大家介紹了pytest的引數化方法,小夥伴們,可以同手進行操作下,畢竟孰能生巧。
推薦閱讀:
重要通知丨2020全新軟體測試學習路線——內含影片(10G+)