您當前的位置:首頁 > 繪畫

學習Python自動化測試,Pytest的引數化你必須瞭解下

作者:由 Atstudy網校 發表于 繪畫時間:2021-03-23

無論什麼自動化,都會需要引數化。unittest可以透過ddt來完成引數化,那麼pytest透過什麼呢?

學習Python自動化測試,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次。每次都是不同的引數資訊。

學習Python自動化測試,Pytest的引數化你必須瞭解下

自定義引數資訊

在自動化中每個引數化中的引數都有不同的意義,可以進行備註引數資訊。這樣在執行後更加清楚的知道我們每個引數的內容。這裡透過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’])

透過執行程式碼結果發現我們的自定義引數資訊已經生效了。在每條用例後都顯示了我們備註的引數資訊。

學習Python自動化測試,Pytest的引數化你必須瞭解下

跳過不需要的引數

比如在某次測試過程中,遇到了不必要的引數,我們可以進行透過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的引數已經被跳過了。

學習Python自動化測試,Pytest的引數化你必須瞭解下

多組引數化資料

在測試過程中,會遇到多組資料同時使用的情況。比如兩組資料一起混合使用,結果就會有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條。

學習Python自動化測試,Pytest的引數化你必須瞭解下

字典引數形式

上面的案例中,我們可以看出來,引數化的書寫格式不僅僅只有元祖,還支援列表,元祖和列表都支援了,當然還支援字典形式。

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也是支援字典的形式進行傳參。

學習Python自動化測試,Pytest的引數化你必須瞭解下

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完成了引數化內容。

學習Python自動化測試,Pytest的引數化你必須瞭解下

傳參形式

上面介紹了字典的傳參形式,下面給大家介紹列表的傳參形式。

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’])

透過執行發現,透過列表的形式也可以進行傳參。

學習Python自動化測試,Pytest的引數化你必須瞭解下

字典和列表的都介紹完了,下面肯定是元祖的傳參方式了。

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’])

透過結果可以看出來,我們透過元祖的方式也進行了傳參。

學習Python自動化測試,Pytest的引數化你必須瞭解下

自定義引數資訊

前面介紹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’])

透過執行結果發現,我們的結果中已經對各個引數化內容進行了資訊備註。

學習Python自動化測試,Pytest的引數化你必須瞭解下

好了,簡單的給大家介紹了pytest的引數化方法,小夥伴們,可以同手進行操作下,畢竟孰能生巧。

推薦閱讀:

重要通知丨2020全新軟體測試學習路線——內含影片(10G+)

標簽: test  pwd  __  print  user