request是pytest的内置fixture。请求对象提供了访问请求测试上下文的权限,并且在fixture被间接参数化的情况下具有可选的param属性。

request.param

获取测试上下文的信息

利用fixture的params传参

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/1/18 20:15
# @Author  : shisuiyi
# @File    : test_request.py
# @Software: win10 Tensorflow1.13.1 python3.9

import pytest

test_data = [{"user": "shisuiyi", "pwd": "12345678"}]


# 直接使用params接收参数
@pytest.fixture(params=test_data)
def login(request):
    name = request.param
    print(f"== 账号是:{name} ==")
    print("进行登录的操作")
    return name


def test_example(login):
    print(f" 测试用例的登录账号是:{login} ")
    print("登录后的操作")

输出:

== 账号是:{'user': 'shisuiyi', 'pwd': '12345678'} ==
进行登录的操作
PASSED                             [100%] 测试用例的登录账号是:{'user': 'shisuiyi', 'pwd': '12345678'} 
登录后的操作

使用parametrize传单个参

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/1/18 20:15
# @Author  : shisuiyi
# @File    : test_request.py
# @Software: win10 Tensorflow1.13.1 python3.9

import pytest


@pytest.fixture()
def login(request):
    name = request.param
    print(f"== 账号是:{name} ==")
    print("进行登录的操作")
    return name


data = ["test1", "test2"]
ids = [f"login_test_name is:{name}" for name in data]


@pytest.mark.parametrize("login", data, ids=ids, indirect=True)
def test_example(login):
    print(f" 测试用例的登录账号是:{login} ")
    print("登录后的操作")

输出:

== 账号是:test1 ==
进行登录的操作
PASSED           [ 50%] 测试用例的登录账号是:test1 
登录后的操作
== 账号是:test2 ==
进行登录的操作
PASSED           [100%] 测试用例的登录账号是:test2 
登录后的操作

注意

  • 添加 indirect=True参数是为了把 login 当成一个函数去执行,而不是一个参数,并且将data当做参数传入函数
  • def test_example(login):,这里的login是获取fixture返回的值

使用parametrize传多个参

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/1/18 20:15
# @Author  : shisuiyi
# @File    : test_request.py
# @Software: win10 Tensorflow1.13.1 python3.9

import pytest


@pytest.fixture()
def logins(request):
    param = request.param
    print(f"账号是:{param['username']},密码是:{param['pwd']}")
    print("进行登录的操作")
    return param


data = [
    {"username": "name1", "pwd": "pwd1"},
    {"username": "name2", "pwd": "pwd2"},
]


@pytest.mark.parametrize("logins", data, indirect=True)
def test_example(logins):
    print(f"账号是:{logins['username']},密码是:{logins['pwd']}")
    print("登录后的操作")

输出:

账号是:name1,密码是:pwd1
进行登录的操作
PASSED                            [ 50%]账号是:name1,密码是:pwd1
登录后的操作
账号是:name2,密码是:pwd2
进行登录的操作
PASSED                            [100%]账号是:name2,密码是:pwd2
登录后的操作

注意

如果需要传多个参数,需要通过字典去传

多个fixture(只加一个装饰器)

这种更常用

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/1/18 20:15
# @Author  : shisuiyi
# @File    : test_request.py
# @Software: win10 Tensorflow1.13.1 python3.9
import pytest


# 多个fixture
@pytest.fixture(scope="module")
def input_user(request):
    user = request.param
    print(f'登录账户:{user}')
    return user


@pytest.fixture(scope="module")
def input_psw(request):
    psw = request.param
    print(f'登录密码:{psw}')
    return psw


data = [
    ("name1", "pwd1"),
    ("name2", "pwd2")
]


@pytest.mark.parametrize("input_user,input_psw", data, indirect=True)
def test_more_fixture(input_user, input_psw):
    print("fixture返回的内容:", input_user, input_psw)

输出:

登录账户:name1
登录密码:pwd1
PASSED                    [ 50%]fixture返回的内容: name1 pwd1
登录账户:name2
登录密码:pwd2
PASSED                    [100%]fixture返回的内容: name2 pwd2

多个fixture(叠加装饰器)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/1/18 20:15
# @Author  : shisuiyi
# @File    : test_request.py
# @Software: win10 Tensorflow1.13.1 python3.9
import pytest


# 多个fixture
@pytest.fixture(scope="function")
def input_user(request):
    user = request.param
    print(f'登录账户:{user}')
    return user


@pytest.fixture(scope="function")
def input_psw(request):
    psw = request.param
    print(f'登录密码:{psw}')
    return psw


name = ["name1", "name2"]
pwd = ["pwd1", "pwd2"]


@pytest.mark.parametrize("input_user", name, indirect=True)
@pytest.mark.parametrize("input_psw", pwd, indirect=True)
def test_more_fixture(input_user, input_psw):
    print("fixture返回的内容:", input_user, input_psw)

输出:

登录账户:name1
登录密码:pwd1
PASSED                    [ 25%]fixture返回的内容: name1 pwd1
登录账户:name2
登录密码:pwd1
PASSED                    [ 50%]fixture返回的内容: name2 pwd1
登录账户:name1
登录密码:pwd2
PASSED                    [ 75%]fixture返回的内容: name1 pwd2
登录账户:name2
登录密码:pwd2
PASSED                    [100%]fixture返回的内容: name2 pwd2

测试用例数=2*2=4条

总结

  • 为了提高复用性,我们在写测试用例的时候,会用到不同的fixture,比如:最常见的登录操作,大部分的用例的前置条件都是登录

  • 假设不同的用例想登录不同的测试账号,那么登录fixture就不能把账号写死,需要通过传参的方式来完成登录操作