前沿:

有的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. Linux 环境 Java JDK 安装&基本配置

    索引: 目录索引 参看代码 GitHub: jdk.txt 一.Linux (DeepinOS) 环境 1.官网下载 jdk-8u112-linux-x64.tar.gz 2.创建目录 mkdir - ...

  2. zabbix忘记admin登录密码重置密码

    问题描述: 有时候忘记admin的密码了,因为账号太多 解决方案: 1.zabbix连接的是mysql数据库 [root@localhost /]# mysql -uroot -pAbc123 #-u ...

  3. 【PAT】A1034Head of a Gang

    昨天准备学完图相关的知识,但是学起来挺懵的,理解起来不难,但自己一回想,又什么都想不起来. 翻来覆去看图的遍历,还是觉得有点没到位. 所以做题来检测一下,果然学和自己做是两码事. 先看的书,又看的柳婼 ...

  4. Bootstrap -- 初见 Bootstrap

    Bootstrap -- 初见 Bootstrap Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. ...

  5. Linux查询进程和结束进程

    1.  ps -ef |grep redis ps:将某个进程显示出来-A 显示所有程序. -e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位. ...

  6. MySQL数据库事务及其特性

    一.事务概念 事务就是一个程序执行单元,里面的操作要么都做,要么都不做. 二.事务特性 事务有四个非常重要的特性(ACID): 原子性(Atomicity):事务是不可分割的整体,所有操作要么全做,要 ...

  7. sqlServer:行列转换之多行转一行

    1.建表:学生表(姓名,学科,成绩) CREATE TABLE teststudent(    stuname varchar(50) NULL,    subjects varchar(50) NU ...

  8. Java 控制语句

    Java 控制语句

  9. iOS WebView 加载本地资源(图片,文件等)

    https://www.cnblogs.com/dhui69/p/5596917.html iOS WebView 加载本地资源(图片,文件等) NSString *path = [[NSBundle ...

  10. Navicat for MySQL 安装和破解

    1 下载 navicat_trial_11.1.20.0.1449226634.exe .PatchNavicat.exe 2 安装 navicat 3 打开 patchnavicat-选择 安装文件 ...