前沿:

有的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. Hibernate从入门到了解

    目录 Hibernate的介绍与执行流程 运行流程: Hibernate运行环境搭建 Hibernate的基础示例 持久类的编写 持久类的介绍 几个考虑遵守的规则: 补充: Hibernate核心文件 ...

  2. C# 批量插入数据方法

    批量插入数据方法 void InsertTwo(List<CourseArrangeInfo> dtF) { Stopwatch watch = new Stopwatch(); watc ...

  3. django源码分析 python manage.py runserver

    django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I be ...

  4. Python ——报错集锦

    https://blog.csdn.net/weixin_42660771/article/details/80990665 错误(1):SyntaxError:'return' outside fu ...

  5. Threading.Timer用法

    protected System.Threading.Timer executeTimer;//定时器 private int interval;//定时器执行间隔周期 executeTimer = ...

  6. AD域安装及必要设置

    本文主要介绍AD域的安装和程序开发必要的设置.   一.安装AD域 运行dcpromo命令,安装AD域. 步骤:     1.win+R     2.dcpromo 图例:           百度百 ...

  7. SQLServer之FOREIGN KEY约束

    FOREIGN KEY约束添加规则 1.外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列. 2.如果在 FOREIGN KEY 约束的列中输入非 NU ...

  8. LeetCode算法题-Repeated String Match(Java实现)

    这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...

  9. MySql 学习之路-高级1

    Mysql自学之路-高级1 目录: 1.CREATE DATABASE 创建数据库 2.CREATE TABLE 创建数据表 3.INSERT INTO SELECT 把一个表中的数据拷贝到另一个表中 ...

  10. 阿里云上的Centos 7.6的一次Nginx+Mysql+PHP7.3 部署

    阿里云申请了一台服务器 Centos 7.6,每次安装都要上网找一大堆教程,因为不熟悉,因为总是忘记. 所以,有时间的时候,还是记录下自己的学习过程,有助于下次的问题解决. 我先总结下: 1)安装VS ...