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", ""), ("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的更多相关文章
- pytest十一:函数传参和 firture 传参数 request
为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数.比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登录函数就行.但是登录 ...
- pytest_函数传参和firture传参数request
前言为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数. 比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行. ...
- 函数传参和firture传参数request
前言 为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数.比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登陆函数就行.但 ...
- python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参
1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...
- C/C++函数调用时传参过程与可变参数实现原理
C/C++函数调用时传参过程与可变参数实现原理 C语言的经典swap问题 在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例 ...
- [ 随手记6 ] C/C++ 形参、实参、按值传参、指针传参、引用传参
个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传 ...
- vue初始化、数据处理、组件传参、路由传参、全局定义CSS与JS、组件生命周期
目录 项目初始化 组件数据局部化处理 子组件 父组件 路由逻辑跳转 案例 组件传参 父传子 子组件 父组件 子传父 子组件 父组件 组件的生命周期钩子 路由传参 第一种 配置:router/index ...
- Apache ab测试工具使用方法(无参、get传参、post传参)
Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd. ...
- Java传参都是传引用变量的副本
最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值. 1 Java中的引用变量 1.1 字面值引用变量:即基本数据类型的引用变量 ,如 in ...
随机推荐
- Docker入门笔记
Docker入门笔记 随笔记录初学Docker遇到的问题, 以免下次再犯. 本机系统Ubuntu18.04 安装 Docker有2个版本 Community Edition (CE) 社区版(免费) ...
- PJSIP 自动化测试工具安装 Python安装
Python安装,记录步骤如下 1.下载PythonIDE安装包 到官网 https://repo.continuum.io/archive/下载需要的版本,选择的Anaconda版本3的,当然也可以 ...
- c/c++ 多线程 mutex的理解
多线程 mutex的理解 mutex,我的理解是每个mutex对象都是一个带锁头的门,这个门有两个状态,门开着和门关着,感觉像是废话... 当想查看门的里东西,或者把东西放进门里,或者从门里拿出东西前 ...
- 虚拟机配置Linux上网环境
概要:在虚拟机安装CentOS6.5的环境后,配置NAT模式,修改系统文件支持上网. (1)ip地址的配置,IP地址的子网掩码为255.255.255.0. (2)网关的指定,也就是默认路由,当我们需 ...
- Docker(1):CentOS7 安装Docker
1.查看系统内核,docker要求系统的内核版本高于3.10 # uname -r 2.升级yum包,确保最新 # yum update 3.安装所需要依赖包 # yum install - ...
- python3 今日大纲 day05
1. 上周内容回顾 1. 闭包: 内层函数对外层函数变量的使用 def outer(): a = 10 def inner(): print(a) return inner ret = outer() ...
- 前端——DOM
什么是DOM? DOM是W3C(万维网联盟)的标准,是Document Object Model(文档对象模型)的缩写,它定义了访问HTML和XML文档的标准: “W3C文档对象模型(DOM)是中立于 ...
- 一个.net的程序员如何转到java的?
先说明,大佬请忽略我这篇文章, 我是一个做了5年的纯种C#开发人, 我在此仅记录一下我转java的过程.都知道, java是开源的,所以它的开发工具贼多,不像.net, 直接地表最强的IDE. 像现 ...
- jquery动态设置图片路径和超链接href属性
js document.getElementById("myImage").src="hackanm.gif"; jquery $("#img&quo ...
- Ubuntu 系统安装详解 19.04最新版本
Ubuntu 19.04版本系统安装详解 1 .镜像的下载 推荐 阿里云镜像下载 2.安装 1.1.新建虚拟机 注意硬件的兼容性问题 当前只有5.x可以用,其他兼容各位可以尝试下,我也都试过,但只有5 ...