• pytest十一:函数传参和 firture 传参数 request


    为了提高代码的复用性,我们在写用例的时候,会用到函数,然后不同的用例去调用这个函数。比如登录操作,大部分的用例都会先登录,那就需要把登录单独抽出来写个函数,其它用例全部的调用这个登录函数就行。
    但是登录的账号不能写死,有时候我想用账号 1 去登录,执行用例 1,用账号 2 去登录执行用例 2,所以需要对函数传参。


    登录函数传参
    把登录单独成立,写一个函数,传 2 个参数 user 和 psw,写用例的时候调用登录函数,输入几组 user,psw 参数化登录用例
    测试用例传参需要用装饰器@pytest.mark.parametrize,里面写两个参数
    第一个参数是字符串,多个参数中间用逗号隔开
    第二个参数是 list,多组数据用元祖类型

    从结果可以看出,有 2 个用例,一个测试通过,一个测试失败了,互不影响

     

    import pytest

    test_login_data = [('admin', '111111'), ('admin', '')] # 测试登录数据
    def login(user, psw):
    '''普通登录函数'''
    print(f' 登录账号:{user}')
    print(f'登录密码:{psw}')
    if psw:
    return True
    else:
    return False

    @pytest.mark.parametrize('user, psw', test_login_data)
    def test_login(user, psw):
    '''登录用例'''
    result = login(user, psw)
    assert result == True, '失败原因,密码为空'

    if __name__=='__main__':
    pytest.main()


    request 参数
    如果想把登录操作放到前置操作里,也就是用到@pytest.fixture装饰器,传参就用默认的 request 参数
    user = request.param 这一步是接收传入的参数,本案例是传一个参数情况

    添加 indirect=True 参数是为了把 login 当成一个函数去执行,而不是一个参数

     

    import pytest

    test_user_data = ["admin1", "admin2"]
    @pytest.fixture(scope='module')
    def login(request):
    user = request.param
    print(f' 登录账户:{user}')
    return user

    @pytest.mark.parametrize('login', test_user_data, indirect=True)
    def test_lodin(login):
    '''登录用例'''
    a = login
    print(f'测试用例中login的返回值:{login}')
    return a !=''

    if __name__=='__main__':
    pytest.main()
    
    
    request 传 2 个参数
    如果用到@pytest.fixture,里面用 2 个参数情况,可以把多个参数用一个字典去存储,这样最终还是只传一个参数
    不同的参数再从字典里面取对应 key 值就行,如: user = request.param[“user”]

    如果要用到login里面的返回值,def test_login(login)时,传入login参数,函数返回值就是 login 了

     

    import pytest

    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' 登录账户:{user}')
    print(f'登录密码:{psw}')
    if psw:
    return True
    else:
    return False

    @pytest.mark.parametrize('login', test_user_data, indirect=True)
    def test_login(login):
    '''登录用例'''
    a = login
    print(f'测试用例中login的返回值:{a}')
    assert a, f'失败原因:密码为空'

    if __name__=='__main__':
    pytest.main()
    
    
    
    
    多个 fixtrue
    用例上面是可以同时放多个 fixture 的,也就是多个前置操作,可以支持装饰器叠加,使用 parametrize 装饰器叠加时,用例组合是 2个参数个数相乘
    
    

    如果参数 user 有 2 个数据,参数 psw 有 2 个数据,那么组合起来的案例是两个相乘,也就是组合 2*2 = 4 个用例

     

    import pytest

    test_user = ['admin1', 'admin2']
    test_psw = ['11111', '222222']
    @pytest.fixture(scope='module')
    def input_user(request):
    user = request.param
    print(f' 登录账户:{user}')
    return user

    @pytest.fixture(scope='module')
    def input_psw(request):
    psw = request.param
    print(f'登录密码:{psw}')
    return psw

    @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

    if __name__=='__main__':
    pytest.main()














  • 相关阅读:
    SQList基础+ListView基本使用
    Git本地上传口令
    记住用户名和登录密码+虚拟机没有root权限解决办法
    API+gir上传错误解决办法
    界面跳转+信息传递+AS中如何将ADV转移到其他盘中
    界面跳转
    Android学习——ListView
    开课第一周周总结
    体温上报APP——班级统计
    体温上报APP——打印
  • 原文地址:https://www.cnblogs.com/zhongyehai/p/9682365.html
Copyright © 2020-2023  润新知