1. 为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数。比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登录函数就行。
    但是登录的账号不能写死,有时候我想用账号 1 去登录,执行用例 1,用账号 2 去登录执行用例 2,所以需要对函数传参。
  2.  
  3. 登录函数传参
    把登录单独成立,写一个函数,传 2 个参数 user psw,写用例的时候调用登录函数,输入几组 user,psw 参数化登录用例
    测试用例传参需要用装饰器@pytest.mark.parametrize,里面写两个参数
    第一个参数是字符串,多个参数中间用逗号隔开
    第二个参数是 list,多组数据用元祖类型

  1. 从结果可以看出,有 2 个用例,一个测试通过,一个测试失败了,互不影响
  1. import pytest
  2.  
  3. test_login_data = [('admin', '111111'), ('admin', '')] # 测试登录数据
    def login(user, psw):
    '''普通登录函数'''
    print(f'\n登录账号:{user}')
    print(f'登录密码:{psw}')
    if psw:
    return True
    else:
    return False
  4.  
  5. @pytest.mark.parametrize('user, psw', test_login_data)
    def test_login(user, psw):
    '''登录用例'''
    result = login(user, psw)
    assert result == True, '失败原因,密码为空'
  6.  
  7. if __name__=='__main__':
    pytest.main()
  1.  
  1. request 参数
    如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的 request 参数
    user = request.param 这一步是接收传入的参数,本案例是传一个参数情况

  1. 添加 indirect=True 参数是为了把 login 当成一个函数去执行,而不是一个参数
  1. import pytest
  2.  
  3. test_user_data = ["admin1", "admin2"]
    @pytest.fixture(scope='module')
    def login(request):
    user = request.param
    print(f'\n登录账户:{user}')
    return user
  4.  
  5. @pytest.mark.parametrize('login', test_user_data, indirect=True)
    def test_lodin(login):
    '''登录用例'''
    a = login
    print(f'测试用例中login的返回值:{login}')
    return a !=''
  6.  
  7. if __name__=='__main__':
    pytest.main()
  1.  
  1. request 2 个参数
    如果用到@pytest.fixture,里面用 2 个参数情况,可以把多个参数用一个字典去存储,这样最终还是只传一个参数
    不同的参数再从字典里面取对应 key 值就行,如: user = request.param[“user”]

  1. 如果要用到login里面的返回值,def test_login(login)时,传入login参数,函数返回值就是 login
  1. import pytest
  2.  
  3. test_user_data = [{'user': 'admin', 'psw': '111111'},
    {'user': 'admin', 'psw': ''}]
    @pytest.fixture(scope='module')
    def login(request):
    user = request.param['user']
    psw = request.param['psw']
    print(f'\n登录账户:{user}')
    print(f'登录密码:{psw}')
    if psw:
    return True
    else:
    return False
  4.  
  5. @pytest.mark.parametrize('login', test_user_data, indirect=True)
    def test_login(login):
    '''登录用例'''
    a = login
    print(f'测试用例中login的返回值:{a}')
    assert a, f'失败原因:密码为空'
  6.  
  7. if __name__=='__main__':
    pytest.main()
  1.  
  1.  
  1. 多个 fixtrue
    用例上面是可以同时放多个 fixture 的,也就是多个前置操作,可以支持装饰器叠加,使用 parametrize 装饰器叠加时,用例组合是 2个参数个数相乘
  1.  

  1. 如果参数 user 2 个数据,参数 psw 2 个数据,那么组合起来的案例是两个相乘,也就是组合 2*2 = 4 个用例
  1. import pytest
  2.  
  3. test_user = ['admin1', 'admin2']
    test_psw = ['11111', '222222']
    @pytest.fixture(scope='module')
    def input_user(request):
    user = request.param
    print(f'\n登录账户:{user}')
    return user
  4.  
  5. @pytest.fixture(scope='module')
    def input_psw(request):
    psw = request.param
    print(f'登录密码:{psw}')
    return psw
  6.  
  7. @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(f'测试数据a->{a}, b->{b}')
    assert b
  8.  
  9. if __name__=='__main__':
    pytest.main()
  1.  

pytest十一:函数传参和 firture 传参数 request的更多相关文章

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

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

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

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

  3. pytest 12 函数传参和fixture传参数request

    前沿: 有的case,需要依赖于某些特定的case才可以执行,比如,登陆获取到的cookie,每次都需要带着他,为了确保是同一个用户,必须带着和登陆获取到的同一个cookies. 大部分的用例都会先登 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. go 包-锁机制

    线程同步 import(“sync”) 互斥锁, var mu sync.Mutex 读写锁, var mu sync.RWMutex 资源竞争样例 func testMap() { var a ma ...

  2. package.json版本号

    (1)^指定版本:比如"^3.1.4",表示安装3.1.4及以上的版本(3.x.x),但是不安装4.0.0 (2)~指定版本:比如 "~1.1.0", 表示安装 ...

  3. 数据分析工具urule

    Python统计学书籍 https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-13911786811.22.6431353b4F5iw1& ...

  4. pandas使用

    一.pd.cut()与pd.qcut()的区别 假设有一组人员数据,而你希望将它们划分为不同的年龄组 ages = [18,20,22,25,27,21,23,37,31,61,45,32] bins ...

  5. nginx-1.12.1编译参数详情

    一下nginx-1.12.1编译参数详情 #/usr/local/nginx/sbin/nginx -V nginx version: nginx/1.12.1 built by gcc 4.4.7 ...

  6. 函数和常用模块【day05】:文件目录开发规范(七)

    本节内容 1.背景 2.设计目录结构的好处 3.关于readme的内容 4.关于requirements.txt和setup.py 5.关于配置文件的使用方法 一.背景 "设计项目目录结构& ...

  7. main函数和线程的关系

    https://github.com/mynawang/Java-Multi-Thread-Learning/blob/master/src/main/java/com/sedion/mynawang ...

  8. JAVA记录-redis缓存机制介绍(三)

    Redis 事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的 ...

  9. 四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)

    四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml) 转 ...

  10. gcc和gdb使用笔记

    gcc: http://wiki.ubuntu.org.cn/Gcchowto gdb: http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%9 ...