zoukankan      html  css  js  c++  java
  • pytest 函数传参和fixture传参数request

    登录函数传参

    把登录单独出来,写一个函数,传2个参数user和psw,写用例的时候调用登录函数,输入几组user,psw参数化登录用例

    测试用例传参需要用装饰器@pytest.mark.parametrize,里面写两个参数

    • 第一个参数是字符串,多个参数中间用逗号隔开
    • 第二个参数是list,多组数据用元祖类型
    # test_01.py
    
    # coding:utf-8
    import pytest
    
    
    # 测试登录数据
    test_login_data = [("admin", "111111"),  ("admin", "")]
    
    def login(user, psw):
        '''普通登录函数'''
        print("登录账户:%s"%user)
        print("登录密码:%s"%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(["-s", "test_01.py"])
    运行结果:

    ============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 rootdir: D:\, inifile: plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10 collected 2 items ............YOYOmarktest est_01.py 登录账户:admin 登录密码:111111 .登录账户:admin 登录密码: F user = 'admin', psw = '' @pytest.mark.parametrize("user, psw", [("admin", "111111"), ("admin", "")]) def test_01(user, psw): result = login(user, psw) > assert result == True E assert False == True D:YOYOmarktest est_01.py:18: AssertionError ================================== FAILURES =================================== _______________________________ test_01[admin-] _______________________________ user = 'admin', psw = '' @pytest.mark.parametrize("user, psw", [("admin", "111111"), ("admin", "")]) def test_01(user, psw): result = login(user, psw) > assert result == True E assert False == True D:YOYOmarktest est_01.py:18: AssertionError ===================== 1 failed, 1 passed in 0.05 seconds ======================

    request参数

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

    # test_02.py
    # 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)  #添加indirect=True参数是为了把login当成一个函数去执行,而不是一个参数
    def test_login(login):
        '''登录用例'''
        a = login
        print("测试用例中login的返回值:%s" % a)
        assert a != ""
    
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_02.py"])

    运行结果:

    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: D:\, inifile:
    plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
    collected 2 items
    
    ............YOYOmarktest	est_02.py 登录账户:admin1
    测试用例中login的返回值:admin1
    .登录账户:admin2
    测试用例中login的返回值:admin2
    .

    request传2个参数

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

    # test_03.py
    # coding:utf-8
    import pytest
    
    
    # 测试账号数据
    test_user_data = [{"user": "admin1", "psw": "111111"},
                      {"user": "admin1", "psw": ""}]
    
    @pytest.fixture(scope="module")
    def login(request):
        user = request.param["user"]
        psw = request.param["psw"]
        print("登录账户:%s" % user)
        print("登录密码:%s" % psw)
        if psw:
            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, "失败原因:密码为空"
    
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_03.py"])

    结果:

    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: D:\, inifile:
    plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
    collected 2 items
    
    ............YOYOmarktest	est_03.py 登录账户:admin1
    登录密码:111111
    测试用例中login的返回值:True
    .登录账户:admin1
    登录密码:
    测试用例中login的返回值:False
    F
    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
    
    D:YOYOmarktest	est_03.py:25: AssertionError
    
    
    ================================== 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
    
    D:YOYOmarktest	est_03.py:25: AssertionError
    ===================== 1 failed, 1 passed in 0.05 seconds ======================

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

    多个fixtrue

    用例上面是可以同时放多个fixture的,也就是多个前置操作,可以支持装饰器叠加,使用parametrize装饰器叠加时,用例组合是2个参数个数相乘

    # test_04.py
    # coding:utf-8
    import pytest
    
    # 测试账号数据
    test_user = ["admin1", "admin2"]
    test_psw = ["11111", "22222"]
    
    
    @pytest.fixture(scope="module")
    def input_user(request):
        user = request.param
        print("登录账户:%s" % user)
        return user
    
    
    @pytest.fixture(scope="module")
    def input_psw(request):
        psw = request.param
        print("登录密码:%s" % 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("测试数据a-> %s, b-> %s" % (a,b))
        assert b
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_04.py"])

    转:https://www.cnblogs.com/yoyoketang/p/9492132.html

  • 相关阅读:
    如何把pdf文档转化为word
    Win7系统中wmiprvse.exe占用CPU高如何解决
    Visual studio加载项目时报错 尚未配置为Web项目XXXX指定的本地IIS,需要配置虚拟目录。解决办法。
    SQL Server新增用户并控制访问权限设置。
    vs2013 中已经添加了引用,编译还是提示没有添加引用
    vue-cli中引入jquery方法
    vue-vuex安装
    vue2.0项目结构和打包发布
    从(0)新开始vue2.0【安装】
    js判断网络连接情况:navigator.onLine
  • 原文地址:https://www.cnblogs.com/jodie2019/p/13200291.html
Copyright © 2011-2022 走看看