pytest 12 函數傳參和fixture傳參數request


前沿:

      有的case,需要依賴於某些特定的case才可以執行,比如,登陸獲取到的cookie,每次都需要帶着他,為了確保是同一個用戶,必須帶着和登陸獲取到的同一個cookies。

大部分的用例都會先登錄,那就需要把登錄單獨抽出來寫個函數,其它用例全部的調用這個登陸函數就行。但是登錄的賬號不能寫死,有時候我想用賬號1去登錄,執行用例1,用賬號2去登錄執行用例2,所以需要對函數傳參。

登錄函數傳參:

  把登錄單獨成立,寫一個函數,傳2個參數user和passwd,寫用例的時候調用登錄函數,輸入幾組user,passwd參數化登錄用例。

測試用例傳參需要用裝飾器@pytest.mark.parametrize,里面寫兩個參數

  • 第一個參數是字符串,多個參數中間用逗號隔開

  • 第二個參數是list,多組數據用元祖類型

#!/usr/bin/env/python
# -*-coding:utf-8-*-

import pytest

# 測試登錄數據
test_login_data = [("admin", "123456"),  ("admin", "")]

def login(user, passwd):

    """普通登錄函數"""

    print("登錄賬戶:%s"%user)
    print("登錄密碼:%s"%passwd)
    if passwd:
        return True
    else:
        return False

@pytest.mark.parametrize("user, passwd", test_login_data)
def test_login(user, passwd):
    """登錄用例"""
    result = login(user, passwd)
    assert result == True, "失敗原因:密碼為空"

運行結果:

.登錄賬戶:admin
登錄密碼:123456
F登錄賬戶:admin
登錄密碼:

AssertionError: 失敗原因:密碼為空
True != False

Expected :False
Actual   :True
 <Click to see difference>

user = 'admin', passwd = ''

    @pytest.mark.parametrize("user, passwd", test_login_data)
    def test_login(user, passwd):
        """登錄用例"""
        result = login(user, passwd)
>       assert result == True, "失敗原因:密碼為空"
E       AssertionError: 失敗原因:密碼為空
E       assert False == True

python_work_apple/pytest_package/requestDemo/test_01.py:25: AssertionError

request參數:

  request就是我需要什么東西,用來接受參數的,用到@pytest.fixture裝飾器,傳參就用默認的request參數,user = request.param 這一步是接收傳入的參數,本案例是傳一個參數情況

#!/usr/bin/env/python
# -*-coding:utf-8-*-

import pytest


# 測試賬號數據
test_user_data = ["admin1", "admin2"]

@pytest.fixture(scope="module")
def login(request):
    user = request.param
    print("登錄賬戶:%s"%user)
    return user

@pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
    """登錄用例"""

    a = login
    print("測試用例中login的返回值:%s" % a)
    assert a != ""
添加indirect=True參數是為了把login當成一個函數去執行,而不是一個參數
運行結果:
登錄賬戶:admin1
.測試用例中login的返回值:admin1
登錄賬戶:admin2
.測試用例中login的返回值:admin2

request傳2個參數:

  如果用到@pytest.fixture,里面用2個參數情況,可以把多個參數用一個字典去存儲,這樣最終還是只傳一個參數

  不同的參數再從字典里面取對應key值就行,如: user = request.param["user"]

#!/usr/bin/env/python
# -*-coding:utf-8-*-

import pytest


# 測試賬號數據
test_user_data = [{"user": "admin1", "passwd": "111111"},
                  {"user": "admin1", "passwd": ""}]

@pytest.fixture(scope="module")
def login(request):
    user = request.param["user"]
    passwd = request.param["passwd"]
    print("登錄賬戶:%s" % user)
    print("登錄密碼:%s" % passwd)
    if passwd:
        return True
    else:
        return False

# indirect=True 聲明login是個函數
@pytest.mark.parametrize("login", test_user_data, indirect=True)
def test_login(login):
    """登錄用例"""
    a = login
    print("測試用例中login的返回值:%s" % a)
    assert a, "失敗原因:密碼為空"

運行結果:

Testing started at 17:24 ...
/usr/local/bin/python3.7 "/Applications/PyCharm CE.app/Contents/helpers/pycharm/_jb_pytest_runner.py" --path /Users/newcomer/gitByMyself/python_work_apple/pytest_package/requestDemo/test_03.py
Launching py.test with arguments /Users/newcomer/gitByMyself/python_work_apple/pytest_package/requestDemo/test_03.py in /Users/newcomer/gitByMyself

============================= test session starts ==============================
platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0
rootdir: /Users/newcomer/gitByMyself, inifile:
plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 2 items

python_work_apple/pytest_package/requestDemo/test_03.py 登錄賬戶:admin1
登錄密碼:111111
.測試用例中login的返回值:True
登錄賬戶:admin1
登錄密碼:
F測試用例中login的返回值:False

python_work_apple/pytest_package/requestDemo/test_03.py:22 (test_login[login1])
login = False

    @pytest.mark.parametrize("login", test_user_data, indirect=True)
    def test_login(login):
        """登錄用例"""
        a = login
        print("測試用例中login的返回值:%s" % a)
>       assert a, "失敗原因:密碼為空"
E       AssertionError: 失敗原因:密碼為空
E       assert False

python_work_apple/pytest_package/requestDemo/test_03.py:28: AssertionError
               [100%]

=================================== FAILURES ===================================
______________________________ test_login[login1] ______________________________

login = False

    @pytest.mark.parametrize("login", test_user_data, indirect=True)
    def test_login(login):
        """登錄用例"""
        a = login
        print("測試用例中login的返回值:%s" % a)
>       assert a, "失敗原因:密碼為空"
E       AssertionError: 失敗原因:密碼為空
E       assert False

python_work_apple/pytest_package/requestDemo/test_03.py:28: AssertionError
---------------------------- Captured stdout setup -----------------------------
登錄賬戶:admin1
登錄密碼:
----------------------------- Captured stdout call -----------------------------
測試用例中login的返回值:False
====================== 1 failed, 1 passed in 0.05 seconds ======================
Process finished with exit code 0

如果要用到login里面的返回值,def test_login(login)時,傳入login參數,函數返回值就是login了

多個fixture:

  用例上面是可以同時放多個fixture的,也就是多個前置操作,可以支持裝飾器疊加,使用parametrize裝飾器疊加時,用例組合是2個參數個數相乘

 

#!/usr/bin/env/python
# -*-coding:utf-8-*-

import pytest

# 測試賬號數據
test_user = ["admin1", "admin2"]
test_passwd = ["11111", "22222"]

@pytest.fixture(scope="module")
def input_user(request):
    user = request.param
    print("登錄賬戶:%s" % user)
    return user

@pytest.fixture(scope="module")
def input_passwd(request):
    passwd = request.param
    print("登錄密碼:%s" % passwd)
    return passwd

@pytest.mark.parametrize("input_user", test_user, indirect=True)
@pytest.mark.parametrize("input_passwd", test_passwd, indirect=True)
def test_login(input_user, input_passwd):
    """登錄用例"""
    a = input_user
    b = input_passwd
    print("測試數據a-> %s, b-> %s" % (a,b))
    assert b

執行結果:

Testing started at 17:30 ...
/usr/local/bin/python3.7 "/Applications/PyCharm CE.app/Contents/helpers/pycharm/_jb_pytest_runner.py" --path /Users/newcomer/gitByMyself/python_work_apple/pytest_package/requestDemo/test_04.py
Launching py.test with arguments /Users/newcomer/gitByMyself/python_work_apple/pytest_package/requestDemo/test_04.py in /Users/newcomer/gitByMyself

============================= test session starts ==============================
platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0
rootdir: /Users/newcomer/gitByMyself, inifile:
plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 4 items

python_work_apple/pytest_package/requestDemo/test_04.py 登錄賬戶:admin1
登錄密碼:11111
.測試數據a-> admin1, b-> 11111
登錄賬戶:admin2
.測試數據a-> admin2, b-> 11111
登錄密碼:22222
.測試數據a-> admin2, b-> 22222
登錄賬戶:admin1
.測試數據a-> admin1, b-> 22222
             [100%]

=========================== 4 passed in 0.03 seconds ===========================
Process finished with exit code 0

如果參數user有2個數據,參數passwd有2個數據,那么組合起來的案例是兩個相乘,也就是組合2*2 = 4個用例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM