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

    前沿:

          有的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", "123456"),  ("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": "111111"},
                      {"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 = ["11111", "22222"]
    
    @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个用例

  • 相关阅读:
    谈谈年度最佳代码“不管你们信不信,反正我信了”
    如何:用对称密钥对 XML 元素进行加密
    WPF 线程间访问控件
    xml和模型对象之间的序列化和反序列化
    [转]汇编语言的准备知识给初次接触汇编者 3
    asp.net mvc 自定义路由 【asp.net mvc 自学笔记】
    [转]汇编语言的准备知识给初次接触汇编者 2
    sftpd 启动 报错: vsftpd:500 OOPS: bad bool value in config file for: anonymous_enable
    Linux iptables配置FTP的主动和被动模式
    cacti安装完后就停留在登陆界面,输入默认的用户名密码登陆不进去!
  • 原文地址:https://www.cnblogs.com/peiminer/p/9916388.html
Copyright © 2011-2022 走看看