前沿:

有的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", ""), ("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": ""},
{"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 = ["", ""] @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个用例

pytest 12 函数传参和fixture传参数request的更多相关文章

  1. pytest十一:函数传参和 firture 传参数 request

    为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数.比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登录函数就行.但是登录 ...

  2. pytest_函数传参和firture传参数request

    前言为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数. 比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行. ...

  3. 函数传参和firture传参数request

    前言 为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数.比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行.但 ...

  4. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参

    1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...

  5. C/C++函数调用时传参过程与可变参数实现原理

    C/C++函数调用时传参过程与可变参数实现原理 C语言的经典swap问题 在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例 ...

  6. [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参

    个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...

  7. vue初始化、数据处理、组件传参、路由传参、全局定义CSS与JS、组件生命周期

    目录 项目初始化 组件数据局部化处理 子组件 父组件 路由逻辑跳转 案例 组件传参 父传子 子组件 父组件 子传父 子组件 父组件 组件的生命周期钩子 路由传参 第一种 配置:router/index ...

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

    Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd. ...

  9. Java传参都是传引用变量的副本

    最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值. 1 Java中的引用变量 1.1 字面值引用变量:即基本数据类型的引用变量 ,如 in ...

随机推荐

  1. FormData 对象上传二进制文件

    使用jQuery 利用 FormData 上传文件:http://harttle.com/2016/07/04/jquery-file-upload.html     通过FormData对象可以组装 ...

  2. 从0开始的Python学习002python的数据类型

    在创建变量的时候不用声明数据类型 # 创建变量 a = 10 # 打印变量值 print(a) 结果如下: 这种感觉和Java有很大的不同,感觉python很神奇,数据的类型是python自己决定的. ...

  3. FPGA驱动VGA显示静态图片

    一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...

  4. idea软件破解汉化

    →http://idea.lanyus.com/上可以找到最新的破解补丁,下载并放到软件的bin目录下  →更改bin目录下的两个文件:Idea.exe.vmoptions和Idea64.exe.vm ...

  5. Python基础之面对对象进阶

    阅读目录 isinstance和issubclass 反射 setattr delattr getattr hasattr __str__和__repr__ __del__ item系列 __geti ...

  6. pymongo 一篇文章搞定

    一 安装 pip install pymongo 二 python连接mongodb数据库的前提 确保pymongo安装完毕 mongodb数据库的服务器端(mongod)必须处于启动状态 三 连接m ...

  7. django--use

    https://docs.djangoproject.com/zh-hans/2.0/intro/

  8. isPrototypeOf、instanceof、hasOwnProperty函数介绍

    isPrototypeOf 作用:检测一个对象是否是另一个对象的原型.或者说一个对象是否被包含在另一个对象的原型链中 var p = {x:1};//定义一个原型对象 var o = Object.c ...

  9. SpringBoot中使用Servlet,Filter,Listener

    项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...

  10. 类别不平衡问题和Softmax回归

    目录 类别不平衡(class-imbalance) Softmax回归模型 类别不平衡(class-imbalance) 当不同类别的训练样本数目差别很大,则会对学习过程造成困扰.如有998个反例,但 ...