pytest文档14-函数传参和firture传参数request

前言

为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数。
比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行。
但是登录的账号不能写死,有时候我想用账号1去登录,执行用例1,用账号2去登录执行用例2,所以需要对函数传参。

登录函数传参

把登录单独成立,写一个函数,传2个参数user和psw,写用例的时候调用登录函数,输入几组user,psw参数化登录用例

测试用例传参需要用装饰器@pytest.mark.parametrize,里面写两个参数

  • 第一个参数是字符串,多个参数中间用逗号隔开
  • 第二个参数是list,多组数据用元祖类型
# test_01.py

# coding:utf-8
import pytest

# ** 作者:上海-悠悠 QQ交流群:588402570**

# 测试登录数据
test_login_data = [("admin", "111111"),  ("admin", "")]

def login(user, psw):
    '''普通登录函数'''
    print("登录账户:%s"%user)
    print("登录密码:%s"%psw)
    if psw:
        return True
    else:
        return False

@pytest.mark.parametrize("user, psw", test_login_data)
def test_login(user, psw):
    '''登录用例'''
    result = login(user, psw)
    assert result == True, "失败原因:密码为空"

if __name__ == "__main__":
    pytest.main(["-s", "test_01.py"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\, inifile:
plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

..\..\..\..\..\..\YOYO\marktest\test_01.py 登录账户:admin
登录密码:111111
.登录账户:admin
登录密码:
F
user = 'admin', psw = ''

    @pytest.mark.parametrize("user, psw", [("admin", "111111"), ("admin", "")])
    def test_01(user, psw):
        result = login(user, psw)
>       assert result == True
E       assert False == True

D:\YOYO\marktest\test_01.py:18: AssertionError

================================== FAILURES ===================================
_______________________________ test_01[admin-] _______________________________

user = 'admin', psw = ''

    @pytest.mark.parametrize("user, psw", [("admin", "111111"), ("admin", "")])
    def test_01(user, psw):
        result = login(user, psw)
>       assert result == True
E       assert False == True

D:\YOYO\marktest\test_01.py:18: AssertionError
===================== 1 failed, 1 passed in 0.05 seconds ======================

从结果可以看出,有2个用例,一个测试通过,一个测试失败了,互不影响

request参数

如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的request参数
user = request.param 这一步是接收传入的参数,本案例是传一个参数情况

# test_02.py
# coding:utf-8
import pytest

#** 作者:上海-悠悠 QQ交流群:588402570**

# 测试账号数据
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 != ""

if __name__ == "__main__":
    pytest.main(["-s", "test_02.py"])

运行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\, inifile:
plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

..\..\..\..\..\..\YOYO\marktest\test_02.py 登录账户:admin1
测试用例中login的返回值:admin1
.登录账户:admin2
测试用例中login的返回值:admin2
.

========================== 2 passed in 0.01 seconds ===========================

添加indirect=True参数是为了把login当成一个函数去执行,而不是一个参数

request传2个参数

如果用到@pytest.fixture,里面用2个参数情况,可以把多个参数用一个字典去存储,这样最终还是只传一个参数
不同的参数再从字典里面取对应key值就行,如: user = request.param["user"]

# test_03.py
# coding:utf-8
import pytest

# ** 作者:上海-悠悠 QQ交流群:588402570**

# 测试账号数据
test_user_data = [{"user": "admin1", "psw": "111111"},
                  {"user": "admin1", "psw": ""}]

@pytest.fixture(scope="module")
def login(request):
    user = request.param["user"]
    psw = request.param["psw"]
    print("登录账户:%s" % user)
    print("登录密码:%s" % psw)
    if psw:
        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, "失败原因:密码为空"

if __name__ == "__main__":
    pytest.main(["-s", "test_03.py"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: D:\, inifile:
plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 2 items

..\..\..\..\..\..\YOYO\marktest\test_03.py 登录账户:admin1
登录密码:111111
测试用例中login的返回值:True
.登录账户:admin1
登录密码:
测试用例中login的返回值:False
F
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

D:\YOYO\marktest\test_03.py:25: AssertionError

================================== 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

D:\YOYO\marktest\test_03.py:25: AssertionError
===================== 1 failed, 1 passed in 0.05 seconds ======================

如果要用到login里面的返回值,def test_login(login)时,传入login参数,函数返回值就是login了

多个fixtrue

用例上面是可以同时放多个fixture的,也就是多个前置操作,可以支持装饰器叠加,使用parametrize装饰器叠加时,用例组合是2个参数个数相乘

# test_04.py
# ** 作者:上海-悠悠 QQ交流群:588402570**
# coding:utf-8
import pytest

# 测试账号数据
test_user = ["admin1", "admin2"]
test_psw = ["11111", "22222"]

@pytest.fixture(scope="module")
def input_user(request):
    user = request.param
    print("登录账户:%s" % user)
    return user

@pytest.fixture(scope="module")
def input_psw(request):
    psw = request.param
    print("登录密码:%s" % psw)
    return psw

@pytest.mark.parametrize("input_user", test_user, indirect=True)
@pytest.mark.parametrize("input_psw", test_psw, indirect=True)
def test_login(input_user, input_psw):
    '''登录用例'''
    a = input_user
    b = input_psw
    print("测试数据a-> %s, b-> %s" % (a,b))
    assert b

if __name__ == "__main__":
    pytest.main(["-s", "test_04.py"])

运行结果

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: E:\YOYO\par, inifile:
plugins: metadata-1.7.0, html-1.19.0
collected 4 items

test_04.py 登录账户:admin1
登录密码:11111
测试数据a-> admin1, b-> 11111
.登录账户:admin2
测试数据a-> admin2, b-> 11111
.登录密码:22222
测试数据a-> admin2, b-> 22222
.登录账户:admin1
测试数据a-> admin1, b-> 22222
.

========================== 4 passed in 0.05 seconds ===========================

如果参数user有2个数据,参数psw有2个数据,那么组合起来的案例是两个相乘,也就是组合2*2 = 4个用例

** 作者:上海-悠悠 QQ交流群:588402570**

原文地址:https://www.cnblogs.com/yoyoketang/p/9492132.html

时间: 2024-10-31 21:57:27

pytest文档14-函数传参和firture传参数request的相关文章

pytest文档33-Hooks函数获取用例执行结果(pytest_runtest_makereport)

前言 pytest提供的很多钩子(Hooks)方法方便我们对测试用例框架进行二次开发,可以根据自己的需求进行改造. 先学习下pytest_runtest_makereport这个钩子方法,可以更清晰的了解用例的执行过程,并获取到每个用例的执行结果. pytest_runtest_makereport 先看下相关的源码,在_pytest/runner.py下,可以导入之后,点进去查看 from _pytest import runner # 对应源码 def pytest_runtest_make

在线HTML文档编辑器使用入门之图片上传与图片管理的实现

1 在线HTML文档编辑器使用入门之图片上传与图片管理的实现: 2 官方网址: http://kindeditor.net/demo.php 3 开发步骤: 4 1.开发中只需要导入选中的文件(通常在 webapp 下,建立 editor 文件夹 ) 5 导入:lang.plugins.themes.kindeditor.js/kindeditor-min.js-->放在editor文件夹下 6 2.在页面上引入相关的js&css文件 7 <!-- 导入Kindeditor相关文件 -

pytest文档3-pycharm运行pytest

前言 上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常运行,如果每次跑去cmd执行,太麻烦,所以很有必要学习如何在pycharm里面运行pytest用例 pycharm运行三种方式 1.以xx.py脚本方式直接执行,当写的代码里面没用到unittest和pytest框架时,并且脚本名称不是以test_开头命名的,此时pycharm会以xx.py脚本方式运行 2.当脚本命名为test_x

JQuery之JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案

JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案 JQuery的版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery的版本</title> <

JQUERY 文档就绪函数

$(document).ready(function(){ 执行的操作 }); 文档就绪函数为了防止文档在完全加载(就绪)之前运行 jQuery 代码. 如果在文档没有完全加载之前就运行函数,操作可能失败. 例如:试图隐藏一个不存在的元素或者获得未完全加载的图像的大小

Android官方入门文档[14]停止和重新启动一个Activity活动

Android官方入门文档[14]停止和重新启动一个Activity活动 Stopping and Restarting an Activity停止和重新启动一个Activity活动 This lesson teaches you to1.Stop Your Activity2.Start/Restart Your Activity You should also read?Activities 这节课教你1.停止您的Activity活动2.启动/重新启动您的Activity活动 你也应该阅读?

Js和jQuery的文档就绪函数以及执行次数

Js和jQuery的文档就绪函数以及执行次数 1:JS文档就绪函数: 采用onload方法: 2:jQuery文档就绪函数: 方法一:采用ready方法 方法二: 通过上面的两种方法可看出:利用方法二比较精简,方法二应用广泛 3. JS文档就绪函数的执行次数: ---js的文档就绪函数不能定义多个.如果定义多个,最后定义的文档就绪函数会覆盖之前的. 例如: 像上面这样,函数定义两个或者两个以上的时候,最后弹出的结果只有"2",因为后面定义的文档就绪函数会覆盖前面的. 4.jQuery文

Apache ab测试工具使用方法(无参、get传参、post传参)(转)

转自Apache ab测试工具使用方法(无参.get传参.post传参) Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd.apache.org/download.cgi 我下载的windows版本,解压后放到某一目录即可. 1.呼出控制台 可以使用系统自带cmd或者Xshell工具均可 2.进入apache下的bin目录ab.exe就在此处 3.

Apache ab测试工具使用方法(无参、get传参、post传参)

Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd.apache.org/download.cgi 我下载的windows版本,解压后放到某一目录即可. 1.呼出控制台 可以使用系统自带cmd或者Xshell工具均可 2.进入apache下的bin目录ab.exe就在此处 3.使用方法 直接在此目录下输入ab回车就会罗列出使用帮助 使用方式:ab [