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个用例

原文地址:https://www.cnblogs.com/peiminer/p/9916388.html